Microsoft Graph PowerShell SDK を使用した Azure AD Guest Account のレポート グループ メンバーシップ
マイクロソフト 365 グループでの Azure AD ゲスト アカウントの検索
テナント内の古いゲストアカウントとMicrosoft 365グループ(およびチーム)のメンバーシップを報告する方法を説明する記事は非常に人気があり、多くの人が使用しています それに付随するスクリプト.アイデアは、特定の年齢(365日–スクリプトで構成可能)を超えるゲストアカウントを見つけて、これらのゲストがメンバーであるグループを報告することです。どのグループにも属していない古いゲスト アカウントは、削除の候補になります。
このスクリプトでは、ゲスト アカウントの識別名を特徴とする古い手法を使用して、 受信者の取得 コマンドレット。このアプローチは機能しますが、アポストロフィや垂直線などの文字が含まれているために識別名に存在する可能性のある値のバリエーションは、ルックアップが機能することを確認するために特別な処理が必要であることを意味します。識別名の一貫性を実現することは、Exchange Online メールボックス識別をより効果的にするというマイクロソフトの計画の理由の 1 つである可能性があります。
いずれにせよ、時間が経ち、コードが劣化します。Microsoft Graph PowerShell SDK を使用して置き換える方法を調査したかった 受信者の取得.このスクリプトでは、既に SDK を使用して、 Get-MgUser コマンドレット。
グラフ財団
グラフ API は、すべての SDK コマンドレットの基盤を提供します。グラフ API は、すべての SDK コマンドレットの基盤を提供します。最初に見つけるのは、グループ メンバーシップを検索するための適切な API です。私はから始めました メンバーグループを取得.API の PowerShell の例では、 Get-MgDirectoryObjectMemberGroup コマンドレットを使用するものです。例えば:
$UserId = (Get-MgUser -UserId Terry.Hegarty@Office365itpros.com).id [array]$Groups = Get-MgDirectoryObjectMemberGroup -DirectoryObjectId $UserId -SecurityEnabledOnly:$False
コマンドレットは動作し、ユーザーが属するグループに関する情報を取得するために使用できるグループ識別子の一覧を返します。例えば:
Get-MgGroup -GroupId $Groups[0] | Format-Table DisplayName, Id, GroupTypes DisplayName Id GroupTypes ----------- -- ---------- All Tenant Member User Accounts 05ecf033-b39a-422c-8d30-0605965e29da {DynamicMembership, Unified}
しかし、 Get-MgDirectoryObjectMemberGroup グループ識別子の単純なリストを返し、開発者は呼び出すために余分な作業を行う必要があります Get-MgGroup グループごとにグループのプロパティを取得します。この余分な作業だけでなく、 Get-MgGroup ゲストの数とグループへのメンバーシップが増えるにつれて、繰り返し非常に非効率的になります。
グラフX線で舞台裏を見る
Azure AD 管理センター (および Entra 管理センター) の両方に、ユーザー アカウント (テナントとゲスト) が属するグループが一覧表示されます。パフォーマンスはきびきびとしており、使用されているコードが各グループのプロパティを取得するために複数の呼び出しを行っている可能性は低いように思われました。これらの管理センターのセクションの多くは、Graph API リクエストを使用して情報を取得し、Graph X-Ray ツールはそれらのリクエストを明らかにします。出力を見ると、管理センターがベータ Graph エンドポイントを グループ メンバーの API (図1)。

Azure AD センターで使用される呼び出しを再利用して、(ユーザー アカウントのオブジェクト識別子を含む) クエリを作成し、SDK を使用してクエリを実行できます。 Invoke-MgGraphRequest コマンドレット。コマンドに加えられた変更の 1 つは、Microsoft 365 グループのみを選択するフィルターを含めることです。フィルターを省略すると、グラフは、セキュリティ グループや配布リストなど、ユーザーが属するすべてのグループを返します。グループ情報は、Graph 要求によって返される Value プロパティにある配列内にあります。便宜上、データを別の配列に入れます。
$Uri = ("https://graph.microsoft.com/beta/users/{0}/memberOf/microsoft.graph.group?`$filter=groupTypes/any(a:a eq 'unified')&`$top=200&$`orderby=displayName&`$count=true" -f $Guest.Id) [array]$Data = Invoke-MgGraphRequest -Uri $Uri [array]$GuestGroups = $Data.Value
Get-MgUserMemberOf コマンドレットの使用
同等の SDK コマンドレットは次のとおりです。 Get-MgUserMemberOf.アカウントが属するグループのセットを返すには、次のコマンドを使用します。
[array]$Data = Get-MgUserMemberOf -UserId $Guest.Id -All [array]$GuestGroups = $Data.AdditionalProperties
返されるデータの形式は、SDK コマンドレットと Graph API 要求の大きな違いを示しています。コマンドレットは、グループ情報をハッシュ テーブルで返します。 追加プロパティ 配列 一方、グラフ API 要求は 価値.ハッシュテーブルからグループプロパティを取得するには、ust はその値を列挙します。たとえば、ハッシュ テーブル内の Microsoft 365 グループの名前を返すには、次のようにします。
[Array]$GroupNames = $Null ForEach ($Item in $GuestGroups.GetEnumerator() ) { If ($Item.groupTypes -eq "unified") { $GroupNames+= $Item.displayName } } $GroupNames= $GroupNames -join ", "
SDK コマンドレットは、データを返す方法に一貫性がない可能性があります。これは、コードから自動的に生成されるコマンドレットを操作する魅力の 1 つにすぎません。うまくいけば、マイクロソフトは2.0年後半にSDKのV2023をリリースするときに、矛盾を解決するためのより良い仕事をするでしょう。
ある Get-MgUser推移的なメンバーOf コマンドレットを使用して、入れ子になったグループのメンバーシップを返すこともできます。入れ子をサポートしていないMicrosoft 365グループにのみ関心があるため、これを行う必要はありません。このコマンドレットは、ほぼ同じように機能します。
[array]$TransitiveData = Get-MgUserTransitiveMemberOf -UserId Kim.Akers@office365itpros.com -All
SDK に基づくスクリプト
グループ プロパティへのアクセスは非常に複雑になるため、Azure AD 管理センターからの Graph API 要求の修正バージョンを使用することにしました。これは、 Invoke-MgGraphRequestコマンドレットなので、決定は正当化されると思います。
スクリプトを修正するときに、ゲストアカウントが古いか非常に古いかの基本的な評価を追加するなど、他のいくつかの改善を行いました。この評価は、明らかに使用されていないため、これらのアカウントの削除を検討する必要があるかどうかを強調することを目的としています。図 2 に、レポートの出力を示します。

あなたはダウンロードすることができます GitHub からのスクリプトのコピー.
廃止された Azure AD ゲスト アカウントのクリーンアップ
古い Azure AD ゲスト アカウントを報告するのは便利です。Azure AD から古いジャンクをクリーンアップすることはさらに優れています。このスクリプトは、特定の年齢を超えるすべてのゲストとそれらが属するグループの詳細を含む PowerShell リストを生成します。非常に古いゲスト アカウントのリストを生成するには、リストをフィルタリングします。
[array]$DeleteAccounts = $Report | Where-Object {$_.StaleNess -eq "Very Stale"}
ジョブを完了し、古いゲスト アカウントを削除するには、単純なループを呼び出してください。 削除-管理ユーザー 各アカウントを処理するには:
ForEach ($Account in $DeleteAccounts) { Write-Host ("Removing guest account for {0} with UPN {1}" -f $Account.Name, $Account.UPN) Remove-MgUser -UserId $Account.Id }
古いゲスト アカウントや古いゲスト アカウントは有害ではありませんが、その存在によって PowerShell スクリプトなどの処理が遅くなります。そのため、不要なゲストを定期的に一掃することをお勧めします。
Microsoft Graph PowerShell SDK と Microsoft 365 PowerShell モジュールをマスターする方法については、 IT プロフェッショナル向け Office 365 電子書籍。私たちの経験を活用して、何が重要で、テナントを保護する最善の方法を理解してください。
ディスカッション
コメント一覧
まだ、コメントがありません