ユーザー組織の検出

クライアント アプリケーションが複数の Dataverse 環境に接続する場合があります。 グローバル探索サービスを使用して、アプリケーションのユーザーがアクセスできる環境を見つけます。

Power Apps で自分が利用できる環境のリストから選択できます。 グローバル探索サービスは、そのデータのソースです。 ユーザーが使用する環境を選択可能にする場合は、独自のアプリで選択コントロールを提供します。 その選択によってアプリが接続するべき環境を決定します。

データセンターの管理と負荷分散の一環として、Dataverse ではサーバーと組織の割り当てが変更される場合があります。 そのためグローバル探索サービスには、ある特定の時点でインスタンスを処理しているサーバーを検出する方法が用意されています。

詳細情報:

グローバル探索サービス

グローバル探索サービスは GDS とも呼ばれ、5 つの異なるクラウドで使用できる一連の OData v4.0 エンドポイントです。

注意

Dataverse Web API とグローバル探索サービスは、両方とも OData v4.0 エンドポイントですが、これらは動作が異なる別個のエンドポイントです。

次のテーブルは、それぞれのクラウドに対する GDS の場所を示します。

クラウド URL と説明
商用 https://globaldisco.crm.dynamics.com
民間企業が使用します。 これは最も一般的に使用されるクラウドです。
GCC https://globaldisco.crm9.dynamics.com
Government Community Cloud。 米国の公的部門の従業員と請負業者が使用します。
USG https://globaldisco.crm.microsoftdynamics.us
米国連邦政府の従業員および請負業者が使用します。 GCC High VSTS と呼ばれることもあります。
DOD https://globaldisco.crm.appsplatform.us
米国国防総省の従業員および請負業者が使用します。
中国 https://globaldisco.crm.dynamics.cn
規制要件に準拠するために中国の企業が使用します。

詳細情報:

制限

グローバル探索サービスは次の場合に情報を返しません:

  • ユーザーのアカウントが無効である。
  • インスタンス セキュリティ グループに基づいてユーザーが除外されている。
  • ユーザーが代理管理者であるためアクセス権を持っている。

呼び出し元ユーザーがインスタンスへのアクセス権を持っていない場合は、応答で空白のリストを返します。

認証

呼び出し側ユーザーは、Microsoft Entra ID から OAuth 2.0 トークンを取得し、そのトークンを API 呼び出しの Authorization ヘッダーに追加する必要があります。 詳細情報: Microsoft Dataverse で OAuth 認証を使用する

CORS サポート

検出サービスはクロスオリジン アクセスの CORS 標準に対応しています。 CORS サポートの詳細については、OAuth を使用するクロス オリジン リソース共有を使用して単一ページのアプリケーションへ接続する を参照してください。

Insomnia を使用してグローバル探索サービスに接続する

Dataverse Web API には、次で説明されている同じ方法を使用できます: Dataverse Web API を含む Insomnia を使用する、ただし、トピックで説明されている環境変数の代わりに、以下を使用して商用クラウドにアクセスします。

{
   "cloudUrl": "https://globaldisco.crm.dynamics.com",
   "globalDiscoUrl": "{{cloudUrl}}/api/discovery/v2.0/",
   "redirecturl": "https://localhost",
   "authurl": "https://login.microsoftonline.com/common/oauth2/authorize?resource={{cloudUrl}}",
   "clientid": "51f81489-12ee-4a9e-aaae-a2591f45987d"
}

次に、認可 タブで OAuth 2 を選択して、次の値を設定または確認します。

フィールド 価値
付与タイプ 暗黙
認証 URI _.authurl
CLIENTID _.clientid
リダイレクト URL _.redirecturl

GET _.globalDiscoUrl要求 URL として使用して 送信を選択します。

これで、Insomnia を使用してグローバル探索サービスにクエリを実行できるようになります。

サービス ドキュメント

それぞれのクラウドでグローバル探索サービスにアクセスする際は、URL に /api/discovery/v2.0/ を付加します。 この URL で GET リクエストを実行して、単一の EntitySet: Instances のみを含むサービス ドキュメントを表示します。

$metadata をクラウドの URL に付加して GET リクエストを送信し、CSDL (共通スキーマ定義言語) のサービス ドキュメントを表示します。 この XML ドキュメントは、Instance エンティティと、それに対して定義された代替キーの詳細を提供します。

インスタンス EntitySet

次のテーブルでは、$metadata CDSL サービス ドキュメントが含む Instance エンティティのプロパティについて説明します。

プロパティ タイプ 説明
ApiUrl 文字列 クライアント アプリケーションが使用する Web サービスの場所。
DatacenterId 文字列 インスタンスが配置されたデータセンターの ID。
DatacenterName 文字列 インスタンスが配置されたデータセンターの名前。 通常、この値は null です。
EnvironmentId 文字列 インスタンスの EnvironmentId。
FriendlyName 文字列 インスタンスの名前。powerapps.com と、インスタンスを選択できるその他のクライアント アプリケーションに表示します。
Id GUID 環境の OrganizationId。
IsUserSysAdmin ブール値 環境のシステム管理者ロールを呼び出し元のユーザーが持っているかどうか。
LastUpdated DateTimeOffset 環境を最後に更新した日時。
OrganizationType Int32 組織の種類。 OrganizationType EnumType に対応する値
Purpose 文字列 環境の作成時に提供した目的の情報。
Region 文字列 環境が配置された地域を表す 2 ~ 3 文字のコード。
SchemaType 文字列 内部でのみ使用します。
State Int32 組織が有効 (0) か無効 (1) か。
StatusMessage Int32 次のいずれかの値:
0:InstanceLocked
1:PendingServiceInstanceMove
2:InstanceFailed
3:Provisioning
4:InActiveOrganizationStatus
5:NewInstance
6:InstancePickerReady
TenantId GUID インスタンスに関連付けられたテナントの ID
TrialExpirationDate DateTimeOffset インスタンスの試用期間が終了する日付。
UniqueName 文字列 インスタンスを表す一意の名前。
UrlName 文字列 URL に使用する名前。
Version 文字列 環境の現在のバージョン。
Url 文字列 環境のアプリケーション URL。

これらのプロパティ名を OData $select クエリ パラメータで使用して、必要なデータだけを取得できます。 ほとんどの場合、FriendlyNameApiUrl プロパティのみが必要です。 例:

要求:

GET https://globaldisco.crm.dynamics.com/api/discovery/v2.0/Instances?$select=ApiUrl,FriendlyName HTTP/1.1
Authorization: Bearer <truncated for brevity>

応答:

HTTP/1.1 200 OK
Content-Length: 625
Content-Type: application/json; odata.metadata=minimal
odata-version: 4.0

{
  "@odata.context":"https://10.0.1.76:20193/api/discovery/v2.0/$metadata#Instances(ApiUrl,FriendlyName)",
  "value":[
    {
      "ApiUrl":"https://yourorganization.api.crm.dynamics.com",
      "FriendlyName":"Your Organization"
    }
  ]
}

ユーザーが環境の名前を認識できるように、アプリケーション UI に FriendlyName プロパティを使用します。 ApiUrl を使用して Dataverse に接続します。

残りのプロパティは主にフィルターに使用します。

フィルター

返されたインスタンスをフィルターする方法は 2 つあります:

  • キー値を使用する
  • OData $filter クエリ オプションを使用する

いずれかのキー値を使用する

指定したインスタンスのみを返すように、Id または UniqueName の値を使用してリストをフィルターできます。

注意

Dataverse Web API とは異なり、グローバル探索サービスは Id や、それに対して定義された代替キーのいずれかを使用して、特定の Instance を取得できません。 GDS は常に値の配列を返します。

これらのクエリは両方とも、単一の項目を含む配列です:

GET https://globaldisco.crm.dynamics.com/Instances(6bcbf6bf-1f2a-4ab9-9901-2605b314d72d)?$select=ApiUrl,FriendlyName,Id,UniqueName
GET https://globaldisco.crm.dynamics.com/Instances(UniqueName='unq6bcbf6bf1f2a4ab999012605b314d')?$select=ApiUrl,FriendlyName,Id,UniqueName

また、次の代替キー値のいずれかを使用して、特定の値をフィルターできます: RegionStateVersion。 たとえば次のクエリを使用すると、リージョンが北米を表す NA であるインスタンスのみを返します。

GET https://globaldisco.crm.dynamics.com/Instances(Region='NA')?$select=FriendlyName,Region,State,Version,ApiUrl

OData $filter クエリ オプションを使用する

OData $filter クエリ オプションは、代替キー プロパティなど、適用する任意のプロパティと共に使用できます。

次の比較、論理、グループ化の演算子を使用できます:

演算子 説明
比較演算子
eq 等しい $filter=IsUserSysAdmin eq true
ne 等しくない $filter=IsUserSysAdmin ne true
gt より大きい $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z
ge 以上 $filter=TrialExpirationDate ge 2022-07-14T00:00:00Z
lt より小さい $filter=TrialExpirationDate lt 2022-07-14T00:00:00Z
le 以下 $filter=TrialExpirationDate le 2022-07-14T00:00:00Z
論理演算子
and 論理積 $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z and IsUserSysAdmin eq true
or 論理和 $filter=TrialExpirationDate gt 2022-07-14T00:00:00Z or IsUserSysAdmin eq true
not 論理否定 $filter=not contains(Purpose,'test')
グループ化演算子
( ) 優先順位のグループ化 (contains(Purpose,'sample') or contains(Purpose,'test')) and TrialExpirationDate gt 2022-07-14T00:00:00Z

次の文字列クエリ関数を使用できます:

関数
contains $filter=contains(Purpose,'test')
endswith $filter=endswith(FriendlyName,'Inc.')
startswith $filter=startswith(FriendlyName,'A')

注意

Dataverse Web API とは異なり、グローバル探索サービスの検索文字列は大文字と小文字を区別します。

Dataverse ServiceClient を使用する

.NET アプリケーションでは Dataverse.Client.ServiceClient.DiscoverOnlineOrganizationsAsync Method を使用して グローバル探索サービスを呼び出せます。

 // Set up user credentials
var creds = new System.ServiceModel.Description.ClientCredentials();
creds.UserName.UserName = userName;
creds.UserName.Password = password;

//Call DiscoverOnlineOrganizationsAsync
DiscoverOrganizationsResult organizationsResult = await ServiceClient.DiscoverOnlineOrganizationsAsync(
        discoveryServiceUri: new Uri($"{cloudRegionUrl}/api/discovery/v2.0/Instances"),
        clientCredentials: creds,
        clientId: clientId,
        redirectUri: new Uri(redirectUrl),
        isOnPrem: false,
        authority: "https://login.microsoftonline.com/organizations/",
        promptBehavior: PromptBehavior.Auto);

return organizationsResult;

DiscoverOnlineOrganizationsAsync メソッドでは同じ OData エンドポイントを使用し、それを discoveryServiceUri パラメーターに渡せますが、インスタンス の形状でデータを返しません。 OrganizationDetail Class インスタンスのコレクションを格納した OrganizationDetailCollection Property を含む、DiscoverOrganizationsResult Class としてデータを返します。 このクラスは、OData サービスによって返される Instance タイプと同じ情報を含みます。

注意

DiscoverOnlineOrganizationsAsync.discoveryServiceUri パラメーターにはグローバル探索サービスの URL を使用できますが、使用する $select$filter クエリ オプションはすべて無視されます。 DiscoverOnlineOrganizationsAsync.discoveryServiceUri パラメーターはオプションであり、指定しないと既定の商用クラウドになります。

CrmServiceClient を使用する

.NET Framework アプリケーションの場合、引き続き CrmServiceClient.DiscoverGlobalOrganizations Method を使用して Global Discovery Service を呼び出すことができます。

  // Set up user credentials
  var creds = new System.ServiceModel.Description.ClientCredentials();
  creds.UserName.UserName = userName;
  creds.UserName.Password = password;

  // Call to get organizations from global discovery
  var organizations = CrmServiceClient.DiscoverGlobalOrganizations(
        discoveryServiceUri:new Uri($"{cloudRegionUrl}/api/discovery/v2.0/Instances"), 
        clientCredentials: creds, 
        user: null, 
        clientId: clientId,
        redirectUri: new Uri(redirectUrl), 
        tokenCachePath: "",
        isOnPrem: false,
        authority: string.Empty, 
        promptBehavior: PromptBehavior.Auto);

  return organizations.ToList();

ServiceClient.DiscoverOnlineOrganizationsAsync メソッドと同様に、CrmServiceClient.DiscoverGlobalOrganizations メソッドも インスタンス としてデータを返しません。 OData サービスが返す Instance タイプと同じ情報を格納した、OrganizationDetail Class インスタンスのコレクションを含む OrganizationDetailCollection を返します。

関連情報

サンプル: グローバル探索サービス (C#)
サンプル: CrmServiceClient を使用して探索サービスにアクセスする
サンプル: グローバル検索を利用した Blazor WebAssembly

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。