未引き換えの招待を含むゲスト アカウントを Azure AD から消去する
パーティーに参加したくない Azure AD ゲスト アカウントを削除する方法
ある マイクロソフトのジェフ・カジマーによる1月30日の投稿 マネージド ID で Azure Automation を使用して、Azure AD から未引き換えのゲストを削除することについては、良い読み物であることが約束されています。Jef は、Microsoft Entra 組織のプリンシパル プログラム マネージャーです。Azure Automation (すべてのテナント管理者が習得する必要があるもの) の使用とは別に、Microsoft Graph PowerShell SDK V2.0 (現在プレビュー初期) を強調表示することで、この記事を読む別の理由が得られました。
私は、Microsoft Graph PowerShell SDKのV2.0に対するMicrosoftの計画について、いくつかの懸念を表明した。これらの懸念はさておき、特に最近、SDK を使用して Azure AD からゲスト アカウントを削除する方法に関して同様の分野について説明したので、他の人が問題にどのようにアプローチするかを学ぶことは常に良いことです。ゲストアカウントを確認する2つの方法の違いは、Jefがゲストアカウントがアカウントを完全に検証するために招待の引き換えプロセスを経ていないインスタンスを探すことです。一方、このスクリプトでは、ゲストがテナントにサインインしてからの経過時間と、アカウントがメンバーであるグループの数を調べて、"古さ" を判断します。未引き換えの招待に基づいてゲスト アカウントを確認する方法を考えてみましょう。
プロセスの概要
紙面では、未引き換えの招待があるゲストアカウントを見つけて削除する手順は簡単です。
- テナントに参加するために受信した招待を引き換えていないゲスト アカウントを検索します。
- Azure AD からアカウントを削除します。
Jefの記事では、これはマネージドIDを使用してAzure自動化ジョブによって実行される通常のプロセスであり、グラフにサインインし、必要なPowerShellコマンドを実行する必要があることを示唆しています。私は同意し、これは不要なゲストアカウントを定期的にクリアするための良い方法だと思います。
私が同意しないのは、ゲストを見つける方法とSDKのV2.0の必要性の詳細です。記事で説明されているすべての操作を SDK V1.0 コマンドレットで実行できます。
管理単位の必要性
ジェフは 動的管理単位 (現在はプレビュー機能) を使用して、ゲスト アカウントを管理します。動的な管理単位を作成し、管理単位のユーザー管理ロールをマネージド ID に割り当てることは確かに便利ですが、この方法はオプションであり、潜在的な要件を作成します。 Azure AD Premium P1 ライセンス.組織にこれらのライセンスがある場合、動的管理単位を使用すると、マネージド ID が Azure AD アカウントを処理する範囲が縮小されるという利点があります。
一部の組織では、ユーザー管理が 1 人または 2 人の管理者によって実行されるタスクであるため、管理単位 (標準バリアントと動的バリアントの両方) を使用することはやり過ぎになる可能性があります。大規模な組織では、ユーザー管理の粒度が望ましい側面となる可能性があるため、管理単位が存在します。
未引き換えの招待を持つ Azure AD ゲスト アカウントの検索
最初のステップは、ゲストアカウントのターゲットセットを見つけることです。最も簡単な方法は、 Get-MgUser ゲストを検索するためのコマンドレットとフィルター アカウント:
Connect-MgGraph -Scope Directory.ReadWrite.All Select-MgProfile Beta [array]$Guests = Get-MgUser -Filter "userType eq 'Guest'" -All
必要なゲストアカウントは、 外部ユーザー状態 プロパティを “承認保留中" に設定します。つまり、Azure AD はゲストのメール アドレスに招待を発行しましたが、ゲストは招待を引き換えるためにフォローアップしませんでした。ザ Get-MgUser コマンドレットは、 外部ユーザー状態 プロパティを使用して、クライアント側のフィルターを使用して結果を絞り込みます。
[array]$Guests = Get-MgUser -Filter "userType eq 'Guest'" -All | Where-Object {$_.ExternalUserState -eq "PendingAcceptance"}
ジェフのバージョンでは、 Get-MsIDUnredeemedInviteUser からのコマンドレット MSIdエンティティツール モジュール をクリックして、未引き換えの招待があるゲスト アカウントを検索します。確かに使用することを検討する価値があります MSIdエンティティツール モジュールを使用して Azure AD を管理しますが、ここで行う基本的なツールを使用してジョブを実行する方法も理解する価値があります。
贖われていない招きの年齢を決定する
Azure Aを削除するのは賢明ではありませんDゲストアカウントは、所有者に応答する時間を少し与えずに。休暇期間を考慮すると、45日は誰もが決心するのに十分な時間のようです。未引き換えのゲスト アカウントを削除するループでは、Azure AD が招待を発行してからの経過時間を確認し、経過時間のしきい値を超えるアカウントのみを処理する必要があります。
このスクリプトでは、Azure AD がいつ招待を作成したかを確認するには、 ExternalUserStateChangeDateTime プロパティは、アカウントの状態が最後に変更された時刻のタイムスタンプを保持します。関心のあるアカウントの唯一の状態変更は、Azure AD がテナントに参加するための招待を作成したときに発生したため、このプロパティを使用して、ゲストが招待を受け取ってからの経過時間を測定できます。
このコードは、未引き換えの招待があるゲストのセットをループ処理し、招待が 45 日以上経過しているかどうかを確認し、テストを満たすアカウントを削除する方法を示しています。その内容を記録するために、スクリプトは削除をログに記録します。
[datetime]$Deadline = (Get-Date).AddDays(-45) $Report = [System.Collections.Generic.List[Object]]::new() ForEach ($Guest in $Guests) { # Check Date [datetime]$InvitationSent = $Guest.ExternalUserStateChangeDateTime If ($InvitationSent -le $Deadline) { $DateInvitation = Get-Date($InvitationSent) -format g $DaysOld = (New-TimeSpan ($InvitationSent)).Days Try { Remove-MgUser -UserId $Guest.Id $ReportLine = [PSCustomObject][Ordered]@{ Date = Get-Date User = $Guest.displayName UPN = $Guest.UserPrincipalName Invited = $DateInvitation "Days old" = $DaysOld } $Report.Add($ReportLine) } Catch { Write-Error $_ } } #End if } #End Foreach Guest Write-Host "Guest Accounts removed for" ($Report.User -Join ", ")
図 1 は、削除について生成されたレポートのデータを示しています。Azure オートメーションのシナリオでは、次のことができます。 SharePoint Online でレポートを作成する, 管理者にメールを送信する又は Teams チャネルにメッセージを投稿する 削除されたアカウントについて人々にアドバイスするため。

Azure AD ゲスト アカウントを削除する前の注意事項
コードは機能し、古いゲスト アカウントは Azure AD のごみ箱に消えます。ただし、一部のアカウントがアクティブに使用されている可能性があるという危険が存在します。Teams チャネルの電子メール アドレスを表すために作成されたゲスト アカウントを取得します。これらの電子メール アドレスは、Teams チャネルにメッセージをインポートするためのコネクタを表します。誰もこれらの存在しないメールボックスにサインインできないため、誰もゲストの招待を引き換えることはありません。ただし、これらのゲスト アカウントに対して Exchange Online によって作成されたメール ユーザー オブジェクトを使用すると、配布リストへの登録やアドレス一覧への追加などを行うことができます。
別の例としては、ゲストが Outlook グループ (メンバーシップが電子メールで通信するMicrosoft 365 グループ) に参加する場合です。これらのグループのゲスト メンバーは、Teams や SharePoint Online、または Azure B2B コラボレーションをサポートする別のアプリケーションにアクセスするためにテナントにサインインする予定がない限り、招待を引き換える必要はありません。招待の引き換えステータスに基づいてこれらのゲストアカウントを削除すると、一部の重要な電子メールベースの通信が失敗する可能性があり、それは悪いことです。
この問題を回避する方法の 1 つは、適切なプロパティに値を書き込むことによって、これらの目的で使用される Azure AD ゲスト アカウントをマークすることです。たとえば、部門を電子メールに設定します。Teams チャネルへの電子メールのルーティングに使用されるゲスト アカウントのセットをマークする方法は次のとおりです。
[array]$MailGuests = $Guests | Where-Object {$_.Mail -Like "*teams.ms*"} ForEach ($MG in $MailGuests) { Update-MgUser -UserId $MG.Id -Department "EMAIL" }
また、Exchange Online 管理モジュールのコマンドレットを使用して Outlook グループのゲスト メンバーをマークする方法は次のとおりです。
[array]$Members = Get-UnifiedGroupLinks -Identity 'Exchange Grumpy Alumni' -LinkType Member ForEach ($Member in $Members) { If ($Member.RecipientType -eq "MailUser") { Set-User -Identity $Member.Name -Department "EMAIL" -Confirm:$False } }
一部のゲストアカウントを例外としてマークした後、処理するゲストアカウントのセットを見つけることができます。
[array]$Guests = Get-MgUser -Filter "userType eq 'Guest'" -All | Where-Object {$_.ExternalUserState -eq "PendingAcceptance" -and $_.Department -ne "EMAIL"}
これらすべては、単純な管理タスクのように見えるものを自動化するために着手すると、アプリケーションがオブジェクトを使用するさまざまな方法を考えないと、予期しない結果につながる可能性があることを証明しています。
SDK V2.0 の使用
Microsoft Graph PowerShell SDK の V2.0 の使用に戻ると、これまでに行われた V2.0 は必要ありません。V2.0 固有の機能に関する唯一の言及は、グラフに接続するときのマネージド ID のサポートです。接続に使用されるコードは次のとおりです。
Connect-MgGraph -Identity
ワンライナーは確かに便利ですが、もう少し複雑なコードを使用して、Graph SDK を使用してマネージド ID に接続することもできます。これが私がすることです:
Connect-AzAccount -Identity $AccessToken = Get-AzAccessToken -ResourceUrl "https://graph.microsoft.com" Connect-MgGraph -AccessToken $AccessToken.Token
3行から1行になることは、おそらく大きなメリットではありません。
常に多くの変化があります。マイクロソフトがOffice 365全体で行うすべての更新に遅れないようにすることは課題です。購読する IT プロフェッショナル向け Office 365 eBook では、何が起こるのか、なぜ起こるのか、テナントにとってどのような新機能が意味があるのかについて、毎月の洞察を得ることができます。
ディスカッション
コメント一覧
まだ、コメントがありません