Search Knowledge Base by Keyword
Azure Active Directory
Overview
Azure Active Directory is Microsoft’s cloud identity service. It holds the user accounts people sign in with, the devices joined or registered to the organization, and the groups that tie the two together and drive access to everything from Teams channels to licensed applications. In a Microsoft-centric enterprise it is the authoritative answer to who works here, what they can reach, and which machines are theirs.
The ReadyWorks Azure Active Directory connector reads that directory through the Microsoft Graph API. It obtains an OAuth access token from the Microsoft identity platform, then calls Graph endpoints and writes the responses into ReadyWorks staging tables. Six inbound job templates ship: users, devices, groups, the members of each group, the owners of each group, and one generic template for calling any other Graph endpoint.
Identity is usually the spine of a ReadyWorks data model. Device records from discovery tools carry a machine name and a serial number; they become actionable once resolved to a named person with a department, a manager and a location. That is what this connector supplies. Group membership matters just as much for transformation work, because groups are how access and licensing are actually assigned, so they determine what has to follow a user to a new machine or a new platform.
The connector is bidirectional. Three outbound job templates ship for group lifecycle management: create, update and delete.
NOTE: Microsoft renamed Azure Active Directory to Microsoft Entra ID. The connector, its description and its endpoints still use the Azure AD name, and the Graph API paths are unchanged, so nothing needs reconfiguring. Expect to see both names in Microsoft’s own documentation.
NOTE: All six inbound templates and all three outbound templates ship with Enabled set to No. Activate the ones you need after you create the connection.
Connector Properties
| Property | Value |
|---|---|
| Identifier | AZURE_AD |
| Name | Azure Active Directory |
| Description | Connector for processing Azure Active Directory data using MS Graph. |
| Job Types | Both Inbound and Outbound |
| Order | 120 |
| Enabled | Yes |
| Locked | Yes |
| Block Update | No |
| Single Authentication | No |
| Windows Only | No |
| Connector Version | 2026-03-15 |
| Hooks | None |
| Additional Job Fields | None |
| Image | ![]() |
Authentication Methods
Two methods ship with this connector. Both are enabled, both are marked as default, and both use the json_rest_api.php driver. Both perform an OAuth client credentials exchange against the Microsoft identity platform and then send the returned token as a bearer token on every Graph call. The difference is what proves the application’s identity: a client secret, or a certificate.
| Method | Identifier | Base Method | Script | Order | Enabled | Config Fields |
|---|---|---|---|---|---|---|
| MS Graph Authentication | AZURE_AD_ms_graph |
JSON Rest API_ms_graph |
json_rest_api.php |
10 | Yes | 9 |
| MS Graph Certificate Based Authentication | AZURE_AD_f56cc6b7d2 |
AZURE_AD_f56cc6b7d2 |
json_rest_api.php |
20 | Yes | 10 |
NOTE: Both methods require an app registration in the tenant with application permissions granted for the Graph resources you intend to read, and admin consent recorded. The connection supplies the tenant id, the application id and the credential; it does not grant the permissions.
Method 1: MS Graph Authentication (AZURE_AD_ms_graph)
Connect to an Azure Active Directory using MS Graph API
Client secret authentication. ReadyWorks posts the application id, the client secret and a scope of .default to the tenant’s token endpoint, reads the access token out of the response, and sends it as Authorization: Bearer on every Graph call.
Connection Configuration Fields (9)
| Order | Label | Type | Required | Default | Max Len | Tooltip |
|---|---|---|---|---|---|---|
| 10 | API Domain | text | Yes | https://graph.microsoft.com |
255 | Enter API domain of the Connection |
| 30 | Server Temporary Working Path | text | Yes | storage/etl5 |
255 | Enter path where temporary files are stored during data processing (exclude starting and ending backslash) |
| 60 | Tenant Id | password | Yes | 64000 | Enter Microsoft Graph directory (tenant) Id of the Connection | |
| 70 | App ID / Client ID | password | Yes | 64000 | Enter Microsoft Graph application (application / client) Id of the Connection | |
| 80 | Client Secret | password | Yes | 64000 | Enter Microsoft Graph client secret of the Connection | |
| 190 | OAuth POST Request Full URI | text | Yes | https://login.microsoftonline.com/%auth_value_1%/oauth2/v2.0/token |
500 | Enter URI to send a POST OAuth request to the identity platform to acquire an access token |
| 200 | Access Token JSON Node | text | No | access_token |
255 | Enter JSON data node for access token |
| 240 | Single Authentication | radio | Yes | No | Choose if authentication is only to be done once and not on each enumeration or pagination loop | |
| 250 | Additional Job Fields | fields_list | No | Enter list of additional fields to add to staging data for all jobs |
NOTE: The OAuth POST Request Full URI default contains the token %auth_value_1%, which resolves to the Tenant Id entered above. Leave it in place rather than typing the tenant id into the URL, so the two cannot drift apart.
Authentication Configuration
Headers sent on the authentication call:
| Header | Value | Base64 |
|---|---|---|
Content-Type: |
application/x-www-form-urlencoded |
Off |
Headers sent on the data calls:
| Header | Value | Base64 |
|---|---|---|
Content-Type: |
application/json |
Off |
Authorization: Bearer |
%auth_data% |
Off |
Authentication request body:
| Key | Value |
|---|---|
client_id |
%auth_value_2% |
client_secret |
%auth_value_3% |
grant_type |
client_credentials |
scope |
https://graph.microsoft.com/.default |
cURL options:
| Option | Authentication Call | Data Calls |
|---|---|---|
USERAGENT |
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0 |
Same |
SSL_VERIFYHOST |
false | false |
SSL_VERIFYPEER |
false | false |
RETURNTRANSFER |
true | true |
FOLLOWLOCATION |
true | true |
FAILONERROR |
true | true |
POST |
true | Not set |
Method 2: MS Graph Certificate Based Authentication (AZURE_AD_f56cc6b7d2)
Connect to an Azure Active Directory using MS Graph API with Certificate
Certificate authentication. Instead of a client secret, the connection stores a public certificate and its private key, both masked. This method carries an authentication flag, MS_GRAPH_JWT, which tells the engine to build and sign a JWT client assertion rather than sending a secret. Only two methods in the whole connector library carry any authentication flag: this one and Microsoft Intune’s certificate-based method, which uses the same flag. Use it where policy forbids long-lived client secrets, or where the app registration is already set up for certificate credentials.
Connection Configuration Fields (10)
| Order | Label | Type | Required | Default | Max Len | Tooltip |
|---|---|---|---|---|---|---|
| 10 | Server Temporary Working Path | text | Yes | storage/etl5 |
255 | Enter path where temporary files are stored during data processing (exclude starting and ending backslash) |
| 10 | API Domain | text | Yes | https://graph.microsoft.com |
255 | Enter API domain of the Connection |
| 60 | Tenant Id | password | Yes | 64000 | Enter Microsoft Graph directory (tenant) Id of the Connection | |
| 70 | App ID / Client ID | password | Yes | 64000 | Enter Microsoft Graph application (application / client) Id of the Connection | |
| 80 | Public Certificate | password | No | 64000 | Upload Microsoft Graph Public Certificate file | |
| 90 | Private Key | password | No | 64000 | Upload Microsoft Graph Private Key file | |
| 190 | OAuth POST Request Full URI | text | Yes | https://login.microsoftonline.com/%auth_value_1%/oauth2/v2.0/token |
500 | Enter URI to send a POST OAuth request to the identity platform to acquire an access token |
| 200 | Access Token JSON Node | text | No | access_token |
255 | Enter JSON data node for access token |
| 240 | Single Authentication | radio | Yes | No | Choose if authentication is only to be done once and not on each enumeration or pagination loop | |
| 250 | Additional Job Fields | fields_list | No | Enter list of additional fields to add to staging data for all jobs |
NOTE: Server Temporary Working Path and API Domain both carry display order 10 in this method, so their position relative to each other in the connection form is not guaranteed. Both fields work; only their order is affected. The same collision appears on several other connectors, including Microsoft Intune, Everpure, Hitachi Vantara, Intel Redfish, Qumulo, Scality and Veeam.
Authentication Configuration
Headers are identical to Method 1: Content-Type: application/x-www-form-urlencoded on the authentication call, then Content-Type: application/json and Authorization: Bearer %auth_data% on the data calls. The cURL options are also identical. Only the request body differs.
Authentication request body:
| Key | Value |
|---|---|
tenant_id |
%auth_value_1% |
client_id |
%auth_value_2% |
grant_type |
client_credentials |
scope |
https://graph.microsoft.com/.default |
pub_cert |
%auth_value_3% |
pri_key |
%auth_value_4% |
NOTE: The certificate and key are not posted to Microsoft as they appear above. The MS_GRAPH_JWT flag intercepts them and uses them to sign a client assertion, which is what actually reaches the token endpoint.
Inbound Job Fields Enabled (44)
These are the settings the job editor shows when you create or edit an inbound job on an Azure Active Directory connection. It is the full REST form, including three levels of enumeration.
| Order | Label | Type | Required | Default | Tooltip |
|---|---|---|---|---|---|
| 10 | Job Description | text | Yes | Enter description of the Job | |
| 20 | Job Schedule | lookup | Yes | Daily | Select frequency Job should run |
| 30 | Enabled | radio | Yes | Yes | Choose if Job is enabled |
| 40 | Use Unparsed Data | radio | No | No | Choose if you wish to parse the incoming data, or leave it in its raw format |
| 50 | Log Raw API Calls | radio | Yes | No | Choose if raw API calls are logged |
| 70 | Destination Table | text | Yes | Enter name of the destination table | |
| 80 | Data Identity | text | No | Enter identity of the Job | |
| 120 | Append New Data to Existing Tables | radio | No | No | Choose if new data will append to the existing destination table, or will create a new destination table |
| 130 | Fields to Index | text | No | Enter fields to index | |
| 170 | Method Type | select | Yes | GET |
Select method type of the Job |
| 190 | API End Point | text | No | Enter API end point of the Job | |
| 200 | API Data Parameters | fields_list | No | Enter API data parameters of the Job | |
| 210 | Body Data Sending Method | select | Yes | JSON Encoded Data | Select method for sending the body data |
| 220 | Raw JSON Body Data | textarea | No | Enter the raw JSON body to send. Do not use body selections in the API Parameters if this is used. | |
| 230 | API Return Data Node | text | No | Enter API return data node of the Job | |
| 250 | Pagination Type | select | No | None | Select request paging type of the Job |
| 270 | API Pagination Node | text | No | Enter API pagination node of the Job | |
| 280 | Pagination Offset Start | text | No | Enter request paging offset start of the Job | |
| 290 | Pagination Limit | text | No | Enter request pagination limit of the Job | |
| 300 | Pagination Termination Node | text | No | Enter request paging termination node and value of the Job | |
| 310 | Maximum API Calls | text | No | Enter maximum number of API calls for the Job to make | |
| 320 | Enumeration 1 Type | select | No | None | Enter enumeration level 1 type |
| 330 | Enumeration 1 ETL Job | lookup | No | Select ETL job for the enumeration values | |
| 340 | Enumeration 1 Data Type | data_type | No | Select the data type and fields for enumeration 1 values | |
| 350 | Enumeration 1 Keys End Point | text | No | Enter enumeration 1 keys end point of the Job | |
| 360 | Enumeration 1 Node | text | No | Enter enumeration 1 node of the Job | |
| 370 | Enumeration 1 Fields | fields_list | No | Enter enumeration 1 fields of the Job | |
| 380 | Enumeration 2 Type | select | No | None | Enter enumeration level 2 type |
| 390 | Enumeration 2 ETL Job | lookup | No | Select ETL job for the enumeration 2 values | |
| 400 | Enumeration 2 Data Type | data_type | No | Select the data type and fields for enumeration 2 values | |
| 410 | Enumeration 2 Keys End Point | text | No | Enter enumeration 2 keys end point of the Job | |
| 420 | Enumeration 2 Node | text | No | Enter enumeration 2 node of the Job | |
| 430 | Enumeration 2 Fields | fields_list | No | Enter enumeration 2 fields of the Job | |
| 440 | Enumeration 3 Type | select | No | None | Enter enumeration level 3 type |
| 450 | Enumeration 3 ETL Job | lookup | No | Select ETL job for the enumeration 3 values | |
| 460 | Enumeration 3 Data Type | data_type | No | Select the data type and fields for enumeration 3 values | |
| 470 | Enumeration 3 Keys End Point | text | No | Enter enumeration 3 keys end point of the Job | |
| 480 | Enumeration 3 Node | text | No | Enter enumeration 3 node of the Job | |
| 490 | Enumeration 3 Fields | fields_list | No | Enter enumeration 3 fields of the Job | |
| 500 | Pause Enumeration | text | No | Enter values for pausing enumeration every X calls for Y seconds | |
| 510 | Kill Enumeration on Error | radio | No | No | Choose to stop the enumeration loop on an error or continue processing the loop |
| 520 | Additional Fields | fields_list | No | Enter list of additional fields to add to staging data | |
| 550 | Retry Pause | text | No | Enter values for retrying a failed API connection. Retry X times, waiting Y seconds between each try, with an API timeout of Z seconds. | |
| 560 | Order | text | Yes | Enter order of the Job |
Inbound Job Templates (6)
Five templates call named Graph endpoints; the sixth is a blank starting point for any other endpoint. All five named templates read the value node and page through results using Graph’s @odata.nextLink.
| # | Job Description | Destination Table | API End Point | Enumerates | What It Pulls |
|---|---|---|---|---|---|
| 1 | Users | azure_ad_users |
/v1.0/users |
No | Every user account in the tenant, restricted to a named set of 28 attributes: identity, contact details, job title, department, company, office location and the on-premises attributes that tie a cloud account back to a local Active Directory object. |
| 2 | Rest GET API | api_data |
Not set | No | A blank template. No endpoint, no data node, generic table name. Use it as the starting point for any Graph endpoint the other five do not cover. |
| 3 | Computers | azure_ad_computers |
/v1.0/devices |
No | Every device object registered or joined to the tenant, with the default Graph device property set. This is the cloud view of a machine, distinct from what a discovery agent reports. |
| 4 | Groups | azure_ad_groups |
/v1.0/groups |
No | Every group in the tenant: security groups, Microsoft 365 groups and distribution lists, with their default properties. |
| 5 | Group Members | azure_ad_group_members |
/v1.0/groups/%enum_id%/members |
Yes | The membership of every group, one call per group. Produces the user-to-group mapping that shows which people hold which access. |
| 6 | Group Owners | azure_ad_group_owners |
/v1.0/groups/%enum_id%/owners |
Yes | The owners of every group, one call per group. Owners are who to contact before changing or retiring a group. |
Job Template Configuration
Settings Common to All Six Templates
| Setting | Value |
|---|---|
| Job Schedule | Daily (15 1 * * *) |
| Enabled | No |
| Method Type | GET |
| Body Data Sending Method | JSON Encoded Data |
| Allow Empty Table | Yes |
| Append Files to Same Destination Table | No |
| Append New Data to Existing Tables | No |
| Use Unparsed Data | No |
| Convert UUID-Keyed Objects to Rows | No |
| Ignore XML Attributes | No |
| Log Raw API Calls | No |
Settings That Vary by Template
| Template | ID | Order | Destination Table | API End Point | Return Data Node | Pagination |
|---|---|---|---|---|---|---|
| Users | 2 | 10 | azure_ad_users |
/v1.0/users |
value |
Next Page Node, "@odata.nextLink" |
| Rest GET API | 3 | 10 | api_data |
Not set | Not set | None |
| Computers | 4 | 20 | azure_ad_computers |
/v1.0/devices |
value |
Next Page Node, "@odata.nextLink" |
| Groups | 5 | 30 | azure_ad_groups |
/v1.0/groups |
value |
Next Page Node, "@odata.nextLink" |
| Group Members | 6 | 40 | azure_ad_group_members |
/v1.0/groups/%enum_id%/members |
value |
Next Page Node, "@odata.nextLink" |
| Group Owners | 7 | 50 | azure_ad_group_owners |
/v1.0/groups/%enum_id%/owners |
value |
Next Page Node, "@odata.nextLink" |
NOTE: Data Identity matches Destination Table on all six templates.
Enumeration Settings
Group Members and Group Owners both enumerate. Each first calls the enumeration endpoint to collect every group id, then calls its own endpoint once per group, substituting the id into %enum_id%.
| Setting | Value (both templates) |
|---|---|
| Enumeration 1 Type | API End Point |
| Enumeration 1 Keys End Point | /v1.0/groups |
| Enumeration 1 Node | value |
| Enumeration 1 Fields | enum_id_1 = id |
NOTE: An enumeration field named enum_id_1 can be referenced either as %enum_id_1% or as %enum_id%. These two templates use the shorter form. Both resolve to the same value.
NOTE: These two jobs make one API call per group in the tenant. On a large tenant that is a lot of calls, and because Single Authentication defaults to No the connection re-authenticates on each loop. If either job runs long or hits Graph throttling, set Single Authentication to Yes on the connection, and consider setting Maximum API Calls and Pause Enumeration on the job.
API Data Parameters
Three templates restrict the properties Graph returns.
| Template | Key | Value |
|---|---|---|
| Users | $select |
id,displayName,givenName,mail,surname,userPrincipalName,businessPhones,city,companyName,country,department,employeeId,faxNumber,jobTitle,mailNickname,mobilePhone,officeLocation,onPremisesExtensionAttributes,onPremisesDistinguishedName,onPremisesDomainName,onPremisesImmutableId,onPremisesUserPrincipalName,otherMails,postalCode,state,streetAddress,usageLocation,userType |
| Group Members | $select |
id,displayName |
| Group Owners | $select |
id,displayName |
NOTE: The Users $select list does not include accountEnabled, so the staged user table carries no indication of whether an account is active or disabled. If you need to tell leavers from current staff, which most joiner, mover and leaver work and most migration wave planning does, add accountEnabled to the parameter before enabling the job.
Outbound Job Fields Enabled (13)
| Order | Label | Type | Required | Default | Tooltip |
|---|---|---|---|---|---|
| 10 | Job Description | text | Yes | Enter description of the Job | |
| 30 | Enabled | radio | Yes | Yes | Choose if Job is enabled |
| 50 | Log Raw API Calls | radio | Yes | No | Choose if raw API calls are logged |
| 170 | Method Type | select | Yes | GET |
Select method type of the Job |
| 180 | Data Sending Method | select | Yes | JSON Encoded Data | Select method for sending the outbound data |
| 190 | API End Point | text | No | Enter API end point of the Job | |
| 200 | API Data Parameters | fields_list | No | Enter API data parameters of the Job | |
| 210 | Body Data Sending Method | select | Yes | JSON Encoded Data | Select method for sending the body data |
| 260 | Return Data Fields List | fields_list | Yes | Enter return data fields of the Job | |
| 530 | Outbound Fields List | fields_list | Yes | Enter outbound fields of the Job | |
| 540 | Ignore Empty Outbound Fields | radio | No | Yes | Ignore, and do not include, any outbound fields that are empty and have no data |
| 550 | Raw JSON Outbound Template | textarea | No | Enter the raw JSON outbound template to send. This will replace any automated structures defined in the outbound fields. | |
| 560 | Order | text | Yes | Enter order of the Job |
Outbound Job Templates (3)
Three templates cover the group lifecycle. Together they let a ReadyWorks process create a group for a migration wave, add or rename it as the wave changes, and remove it when the wave closes.
| Template | ID | Method | API End Point | Outbound Fields | Return Fields | What It Does |
|---|---|---|---|---|---|---|
| Create Group | 8 | POST |
/v1.0/groups |
6 | 1 | Creates a group and returns its new id. |
| Delete Group | 9 | DELETE |
/v1.0/groups/%group_id% |
1 | 1 | Deletes the group whose id is supplied. |
| Update Group | 10 | PATCH |
/v1.0/groups/%group_id% |
7 | 1 | Changes properties on an existing group. |
All three ship with Enabled set to No, Log Raw API Calls No, Body Data Sending Method and Data Sending Method both JSON Encoded Data, and Ignore Empty Outbound Fields Yes. Their orders are 10, 20 and 30.
Create Group (Template 8)
Posts a new group to Graph. Four fields are required, matching what Graph itself demands to create a group: a display name, a mail nickname, and the two flags that decide what kind of group it is. Returns the new group id, which a later Update or Delete job needs.
| Label | Name | Type | Required | Pattern |
|---|---|---|---|---|
| Display Name | displayName |
String | Yes | |
| Mail Enabled | mailEnabled |
String | Yes | |
| Mail Nickname | mailNickname |
String | Yes | |
| Security Enabled | securityEnabled |
String | Yes | |
| Description | description |
String | No | |
| Owner Id | "owners@odata.bind" |
String | No | ["https://graph.microsoft.com/v1.0/users/%value%"] |
Return data field: Group Id from id.
NOTE: Owner Id is the one field with a pattern. ReadyWorks wraps the value you supply into the full Graph user URL shown above, so pass a bare user object id rather than a URL.
Delete Group (Template 9)
Removes a group. It takes only the group id, marked as a URI field so it substitutes into %group_id% in the endpoint path rather than being sent in the body.
| Label | Name | Type | Required | Passed In |
|---|---|---|---|---|
| Group Id | group_id |
String | Yes | URI |
Return data field: Group Id from group_id.
NOTE: Deleting a group in Entra ID is not reversible from ReadyWorks. Microsoft retains deleted Microsoft 365 groups for a recovery period, but security groups behave differently. Confirm the group type before enabling a job built on this template.
Update Group (Template 10)
Patches an existing group. Group Id is required and travels in the URI; everything else is optional, and because Ignore Empty Outbound Fields is Yes, only the fields you populate are sent. That makes it safe to use the same job to change one property without overwriting the others.
| Label | Name | Type | Required | Passed In | Pattern |
|---|---|---|---|---|---|
| Group Id | group_id |
String | Yes | URI | |
| Display Name | displayName |
String | No | Body | |
| Mail Enabled | mailEnabled |
String | No | Body | |
| Mail Nickname | mailNickname |
String | No | Body | |
| Security Enabled | securityEnabled |
String | No | Body | |
| Description | description |
String | No | Body | |
| Owner Id | "owners@odata.bind" |
String | No | Body | ["https://graph.microsoft.com/v1.0/users/%value%"] |
Return data field: Group Id from id.

