如何使用 MS 圖形 API 以程式設計方式設定雲端同步
下列文件說明如何只使用 MS Graph API 從頭開始複寫同步處理設定檔。
複寫同步處理設定檔的結構包含下列步驟。 畫面如下:
使用這些 Microsoft Graph PowerShell 命令來啟用生產租用戶的同步處理功能。您必須這麼做,才能為該租用戶呼叫管理 Web 服務。
基本設定
啟用租用戶旗標
Connect-MgGraph -Scopes "DeviceManagementConfiguration.ReadWrite.All" ('-Environment <AzureEnvironment>')
$organizationId = (Get-MgOrganization).Id
$params = @{
onPremisesSyncEnabled = $true
}
Update-MgBetaOrganization -OrganizationId $organizationId -BodyParameter $params
該 Cmdlet 會啟用租用戶的同步處理。 該命令會使用 Get-MgOrganization 來取得組織的識別碼。
建立服務主體
接下來,我們需要建立 AD2AAD 應用程式/服務主體
您必須使用此應用程式識別碼 1a4721b3-e57f-4451-ae87-ef078703ec94。 如果在入口網站中使用,則 displayName 是 AD 網域 URL (例如 contoso.com),但可以為其指定其他名稱。
POST https://graph.microsoft.com/beta/applicationTemplates/1a4721b3-e57f-4451-ae87-ef078703ec94/instantiate
Content-type: application/json
{
displayName: [your app name here]
}
建立同步作業
前述命令的輸出會傳回所建立服務主體的 objectId。 在此範例中,objectId 是 aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb。 使用 Microsoft Graph 將同步處理作業新增至該服務主體。
您可以在這裡找到建立同步作業的文件。
如果您未記錄識別碼,請執行下列 MS Graph 呼叫來尋找服務主體。 您需要 Directory.Read.All 權限才能進行該呼叫:
GET https://graph.microsoft.com/beta/servicePrincipals
然後在輸出中尋找您的應用程式名稱。
執行下列兩個命令來建立兩個作業:一個用於使用者/群組佈建,另一個用於密碼雜湊同步。 這是使用不同範本識別碼提出兩次的相同要求。
呼叫下列兩個要求:
POST https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs
Content-type: application/json
{
"templateId":"AD2AADProvisioning"
}
POST https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs
Content-type: application/json
{
"templateId":"AD2AADPasswordHash"
}
若要建立兩者,則將需要兩個呼叫。
傳回值範例 (用於佈建):
HTTP 201/Created
{
"@odata.context": "https://graph.microsoft.com/beta/$metadata#servicePrincipals('aaaaaaaa-0000-1111-2222-bbbbbbbbbbbbc')/synchronization/jobs/$entity",
"id": "AD2AADProvisioning.fc96887f36da47508c935c28a0c0b6da",
"templateId": "ADDCInPassthrough",
"schedule": {
"expiration": null,
"interval": "PT40M",
"state": "Disabled"
},
"status": {
"countSuccessiveCompleteFailures": 0,
"escrowsPruned": false,
"code": "Paused",
"lastExecution": null,
"lastSuccessfulExecution": null,
"lastSuccessfulExecutionWithExports": null,
"quarantine": null,
"steadyStateFirstAchievedTime": "0001-01-01T00:00:00Z",
"steadyStateLastAchievedTime": "0001-01-01T00:00:00Z",
"troubleshootingUrl": null,
"progress": [],
"synchronizedEntryCountByType": []
}
}
更新目標網域
針對此租用戶,服務主體的物件識別碼和應用程式識別碼如下所示:
ObjectId: bbbbbbbb-1111-2222-3333-cccccccccccc
AppId: 00001111-aaaa-2222-bbbb-3333cccc4444
DisplayName: testApp
我們將需要更新此設定的目標網域,因此請更新此網域的祕密。
請確定您使用的網域名稱與您為內部部署網域控制站設定的 URL 相同。
PUT – https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/secrets
根據您嘗試執行的動作,在下列值陣列中新增下列金鑰/值組:
同時啟用 PHS 和同步租用戶旗標 { key: "AppKey", value: "{"appKeyScenario":"AD2AADPasswordHash"}" }
僅啟用同步租用戶旗標 (不要開啟 PHS) { key: "AppKey", value: "{"appKeyScenario":"AD2AADProvisioning"}" }
Request body –
{
"value": [
{
"key": "Domain",
"value": "{\"domain\":\"ad2aadTest.com\"}"
}
]
}
預期的回應為… HTTP 204/沒有內容
在此,醒目提示的 "Domain" 值是要將項目佈建至 Microsoft Entra ID 的內部部署 Active Directory 網域名稱。
在設定刀鋒視窗上啟用同步密碼雜湊
本節討論如何為特定設定啟用同步密碼雜湊。 這種情況與啟用租用戶層級功能旗標的 AppKey 祕密不同。 此程序僅適用於單一網域/設定。您必須將應用程式金鑰設定為 PHS 金鑰,此程序才能端對端運作。
擷取結構描述 (警告,這會相當大):
GET –https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs/ [AD2AADProvisioningJobId]/schema
取得此 CredentialData 屬性對應:
{ "defaultValue": null, "exportMissingReferences": false, "flowBehavior": "FlowWhenChanged", "flowType": "Always", "matchingPriority": 0, "targetAttributeName": "CredentialData", "source": { "expression": "[PasswordHash]", "name": "PasswordHash", "type": "Attribute", "parameters": [] }
在結構描述中尋找具有下列名稱的下列物件對應
- 佈建 Active Directory 使用者
- 佈建 Active Directory inetOrgPersons
物件對應位於 schema.synchronizationRules[0].objectMappings 中 (目前您可以假設只有一個同步處理規則)
從步驟 (2) 取得 CredentialData 對應,並將其插入步驟 (3) 中的物件對應
您的物件對應如下所示:
{ "enabled": true, "flowTypes": "Add,Update,Delete", "name": "Provision Active Directory users", "sourceObjectName": "user", "targetObjectName": "User", "attributeMappings": [ ... }
將對應從建立 AD2AADProvisioning 和 AD2AADPasswordHash 作業步驟複製/貼到 attributeMappings 陣列中。
此陣列中的元素順序並不重要 (後端會為您排序)。 如果陣列中已有相同名稱,請小心新增此屬性對應 (例如,如果 attributeMappings 中已有 targetAttributeName CredentialData 項目)。您可能會收到衝突錯誤,或者預先存在和新的對應可能會結合在一起 (通常不是想要的結果)。 後端不會為您刪除重複項。
請記得同時對使用者和 inetOrgpersons 執行這個動作。
儲存您所建立的結構描述:
PUT – https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs/ [AD2AADProvisioningJobId]/schema
在要求本文中新增結構描述。
Exchange 混合回寫 (公開預覽版)
本節說明如何以程式方式啟用/停用和使用 [Exchange 混合回寫]。
以程式設計方式啟用 Exchange 混合回寫需要兩個步驟。
- 結構描述驗證
- 建立 Exchange 混合回寫作業
結構描述驗證
在啟用和使用 Exchange 混合回寫之前,雲端同步需要確定內部部署的 Active Directory 是否已擴充以包含 Exchange 結構描述。
您可以使用 directoryDefinition:discover 來起始結構描述探索。
POST https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs/[AD2AADProvisioningJobId]/schema/directories/[ADDirectoryID]/discover
預期的回應為… HTTP 200/OK
回應看起來應該類似以下輸出:
HTTP/1.1 200 OK
Content-type: application/json
{
"objects": [
{
"name": "user",
"attributes": [
{
"name": "mailNickName",
"type": "String"
},
...
]
},
...
]
}
現在請檢查 mailNickName 屬性是否存在。 如果存在,則會驗證您的結構描述,並包含 Exchange 屬性。 如果不存在,請檢閱 Exchange 混合回寫的必要條件。
建立 Exchange 混合回寫作業
驗證結構描述後,您就可以建立作業。
POST https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs
Content-type: application/json
{
"templateId":"AAD2ADExchangeHybridWriteback"
}
意外刪除
本節討論如何以程式設計方式啟用/停用和使用意外刪除。
啟用和設定閾值
每個作業有兩個設定可供您使用,分別是:
- DeleteThresholdEnabled - 設定為 'true' 時,會啟用作業的意外刪除預防措施。 預設會設定為 'true'。
- DeleteThresholdValue:定義啟用意外刪除預防措施時,每次執行作業所允許的最大刪除數目。 預設會將此值設定為 500。 因此,如果將此值設定為 500,則每次執行所允許的最大刪除數目是 499。
刪除閾值設定是 SyncNotificationSettings
的一部分,而且可透過圖形來修改。
我們將需要更新此設定的目標 SyncNotificationSettings,因此請更新祕密。
PUT – https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/secrets
根據您嘗試執行的動作,在下列值陣列中新增下列金鑰/值組:
Request body -
{
"value":[
{
"key":"SyncNotificationSettings",
"value": "{\"Enabled\":true,\"Recipients\":\"foobar@xyz.com\",\"DeleteThresholdEnabled\":true,\"DeleteThresholdValue\":50}"
}
]
}
範例中的 "Enabled" 設定可在作業處於隔離狀態時,用於啟用/停用通知電子郵件。
目前,我們不支援對祕密提出 PATCH 要求,因此您必須在 PUT 要求本文中新增所有值 (如範例所示),以保留其他值。
您可以利用下列方式來擷取所有祕密的現有值:
GET https://graph.microsoft.com/beta/servicePrincipals/{id}/synchronization/secrets
允許刪除
若要在作業進入隔離狀態後允許進行刪除,您必須只使用 "ForceDeletes" 作為範圍來發出 restart。
Request:
POST https://graph.microsoft.com/beta/servicePrincipals/{id}/synchronization/jobs/{jobId}/restart
Request Body:
{
"criteria": {"resetScope": "ForceDeletes"}
}
啟動同步作業
您可以透過下列命令重新擷取作業:
GET https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs/
您可以在這裡找到擷取作業的文件。
若要啟動作業,請使用第一個步驟中所建立服務主體的 objectId,並且從建立作業的要求傳回的作業識別碼來發出此要求。
您可以在這裡找到如何啟動作業的文件。
POST https://graph.microsoft.com/beta/servicePrincipals/8895955e-2e6c-4d79-8943-4d72ca36878f/synchronization/jobs/AD2AADProvisioning.fc96887f36da47508c935c28a0c0b6da/start
預期的回應為… HTTP 204/沒有內容。
其他用於控制作業的命令如這裡所述。
若要重新啟動作業,請使用:
POST https://graph.microsoft.com/beta/servicePrincipals/8895955e-2e6c-4d79-8943-4d72ca36878f/synchronization/jobs/AD2AADProvisioning.fc96887f36da47508c935c28a0c0b6da/restart
{
"criteria": {
"resetScope": "Full"
}
}
檢閱狀態
透過下列程式碼來擷取作業狀態:
GET https://graph.microsoft.com/beta/servicePrincipals/[SERVICE_PRINCIPAL_ID]/synchronization/jobs/
在傳回物件的 [狀態] 區段下尋找相關的詳細資料