Azure AD アカウントのグループ メンバーシップ情報の取得

Azure AD アカウントのグループ メンバーシップ情報の取得

グラフ SDK を使用したグループ メンバーシップの検出

グラフ SDK を使用したグループ メンバーシップ

最近、いくつかのスクリプトを更新して、2023 年 6 月 30 日に廃止される予定の Azure AD および Microsoft オンライン サービス (MSOL) モジュールへの依存関係を削除しました (ライセンス管理コマンドレットの廃止は 3 月末に行われます)。ほとんどの場合、自然な置き換えは Microsoft Graph PowerShell SDK のコマンドレットです。

1 つの例は、Azure AD ユーザー アカウントが属するグループを取得する場合です。これは、次のようなコマンドレットを使用して個々のグループのメンバーシップを処理する場合に簡単な作業です。

  • Get-distributionGroupMember (配布リストのメンバーをフェッチする)。
  • Get-DynamicDistributionGroupMember (動的配布グループのメンバーをフェッチする)。
  • Get-UnifiedGroupLink (Microsoft 365 グループのメンバーを取得します)。
  • Get-MgGroupMember (Azure AD グループのメンバーをフェッチする)。

「ショーン・ランディが属するすべてのグループを見つける」などの質問に答えるとき、物事はもう少し複雑です。リクエストにどのように答えることができるか見てみましょう。

取引所オンラインアプローチ

Exchange スクリプトでよく見られる問題を攻撃する 1 つの方法は、 受信者の取得 アカウントに属するメールボックスの識別名に基づくフィルターを使用したコマンドレット: たとえば、次のコードは、アカウントの Microsoft 365 グループのメンバーシップを報告します。

$User = Get-EXOMailbox -Identity Sean.Landy
$UserId = $User.ExternalDirectoryObjectId
$DN = $User.DistinguishedName
$Groups = (Get-Recipient -ResultSize Unlimited -RecipientTypeDetails GroupMailbox -Filter "Members -eq '$DN'" )
Write-Host (“User is a member of {0} groups” -f $Groups.count)

このメソッドは、識別名に Linda O’Shea のような名前のユーザーのアポストロフィなどの特殊文字が含まれていない場合に機能します。このような場合、PowerShell で名前を正しく処理するために、追加のエスケープが必要です。この問題は、Microsoft が Exchange Online オブジェクトの名前付けメカニズムをメールボックスの表示名ではなくオブジェクト識別子に基づくように切り替えると減少します。ただし、表示名に基づく識別名を持つオブジェクトはまだたくさんあります。

グラフ API 要求

スクリプトを読みながら、将来のメンテナンスを容易にするために、他のモジュールからコマンドレットを削除できるかどうかを確認します。使用 受信者の取得 は、スクリプトが Exchange Online 管理モジュールに接続する必要があるため、Graph API 要求を使用してその必要性を取り除きましょう。を使用して、私たちができることは次のとおりです。 Invoke-MgGraphRequest 要求を実行するコマンドレット:

$Uri = ("https://graph.microsoft.com/V1.0/users/{0}/memberOf/microsoft.graph.group?`$filter=groupTypes/any(a:a eq 'unified')&`$top=200&$`orderby=displayName&`$count=true" -f $UserId)
[array]$Data = Invoke-MgGraphRequest -Uri $Uri
[array]$Groups = $Data.Value
Write-Host (“User is a member of {0} groups” -f $Groups.count) 

同じ結果が得られ(常に良好)、グラフリクエストは約2倍の速さで実行されます。 受信者の取得 は。

呼び出しは Microsoft 365 グループに限定されているため、推移的なメンバーシップについて心配する必要はありません。もしそうなら、私は グループ推移的メンバーの API.

SDK Get-MgUserMemberOf コマンドレットの使用

Microsoft Graph PowerShell SDK には、Graph 要求に基づくコマンドレットが含まれています。同等のコマンドレットは次のとおりです。 Get-MgUserMemberOf.これにより、Azure AD で認識されているすべてのグループの種類のメンバーシップが返されるため、配布リストとセキュリティ グループが含まれます。Microsoft 365 グループのセットを返すには、サーバー側のフィルターを適用します。

[array]$Groups = Get-MgUserMemberOf -UserId $UserId -All | Where-Object {$_.AdditionalProperties["groupTypes"] -eq "Unified"}
Write-Host (“User is a member of {0} groups” -f $Groups.count) 

サーバー側のフィルターは、 追加プロパティ 各グループのプロパティ。実行する場合 Get-MgUserMemberOf 他の処理なし。コマンドレットは、グループ識別子の単純な一覧を返すように見えます。例えば:

$Groups

Id                                   DeletedDateTime
--                                   ---------------
b62b4985-bcc3-42a6-98b6-8205279a0383
64d314bb-ea0c-46de-9044-ae8a61612a6a
87b6079d-ddd4-496f-bff6-28c8d02e9f8e
82ae842d-61a6-4776-b60d-e131e2d5749c

ただし、 追加プロパティ プロパティは、グループごとにも使用できます。このプロパティには、問い合わせ可能な他のグループ プロパティを保持するハッシュ テーブルが含まれています。たとえば、グループがプライベートアクセスとパブリックアクセスのどちらをサポートしているかを確認する方法は次のとおりです。

$Groups[0].AdditionalProperties['visibility']
Private

ハッシュ テーブルでプロパティを検索するときは、キーの正確な形式を使用することを忘れないでください。たとえば、これはグループの表示名を見つけるために機能します。

$Groups[0].AdditionalProperties['displayName']

しかし、これは大文字のDがハッシュテーブルに見つからない値を作成するためではありません。

$Groups[0].AdditionalProperties['DisplayName']

Microsoft Graph PowerShell SDK から始めるユーザーは、次のようなコマンドレットによって明らかに返されるグループ識別子だけを見ると、混乱することがよくあります。 Get-MgUserMemberOf, Get-MgGroupそして Get-MgGroupMember 彼らはの重要性を見たり把握したりしていないからです 追加プロパティ 財産。それは文字通り含まれていますs グループ識別子を除くグループの追加プロパティ。

からの情報を使用する別の例を次に示します 追加プロパティ.グループに提供される詳細には、その所有者は含まれません。グループの所有者情報を取得するには、 Get-MgGroupOwner 次のようなコマンドレット:

$Group = $Groups[15]
[array]$Owners = Get-MgGroupOwner -GroupId $Group.Id | Select-Object -ExpandProperty AdditionalProperties
$OwnersOutput = $Owners.displayName -join ", "
Write-Host (“The owners of the {0} group are {1}” -f $Group.AdditionalProperties[‘displayName’], $OwnersOutput)

必要に応じて、 Get-MGグループ推移的メンバー グループの推移的なメンバーシップをフェッチするコマンドレット。

グラフSDKはよりインテリジェントである必要があります

Microsoft Graph PowerShell SDKがそれほど多くの貴重な情報を隠さなかったらいいのにと思います 追加プロパティ プロパティ名の正確な形式についてはそれほどうるさいわけではありませんでした。どうやら、SDK コマンドレットは、オブジェクトのセットを返すときに Graph API 要求がどのように機能するかであるため、このように動作します。その主張は真実かもしれませんが、SDKがデータの処理方法に追加のインテリジェンスを適用した場合、それは素晴らしいことです。


このような洞察は簡単には得られません。テクノロジーを知り、舞台裏を見る方法を理解する必要があります。の知識と経験から利益を得る IT プロフェッショナル向け Office 365 Office 365 とより広範な Microsoft 365 エコシステムをカバーする最高の電子書籍を購読することで、チームを組んでください。

Office

Posted by admin