PowerShell スクリプトが新しいメールボックスの名前プロパティを変更した後に更新が必要になる理由

PowerShell スクリプトが新しいメールボックスの名前プロパティを変更した後に更新が必要になる理由

あらゆる変化における善と悪

先月、マイクロソフトが新しいメールボックスの[名前]プロパティと[識別名]プロパティの構成に加える変更について説明しました。MC365786 (4 月 30 日) によると、変更の展開は 5 月末に開始され、7 月下旬に終了します。Exchange Online 名の変更が適用されることを強調することが重要です。 新しいメールボックスに対してのみ: 既存のメールボックスのプロパティは、更新を決定しない限りそのまま残ります。

他の変更と同様に、考慮すべき良い点と悪い点があります。マイクロソフトは、外部ディレクトリ オブジェクト識別子 (EDOID) を使用すると、Name プロパティと Distinguished Name プロパティの一意性が保証されるため、この変更を気に入っています。EDOID は、Exchange Online ディレクトリ内のメールが有効なオブジェクトを所有する Azure AD オブジェクトの GUID です。

Microsoft 365 および Exchange Online (図 1) の管理センターでは、名前または識別名のプロパティが公開されていないことに注意してください。Exchange Online 名の変更を既存のメールボックスに適用する場合は、PowerShell を使用して メールボックスの設定 コマンドレット。

ここには取引所オンライン名の変更の痕跡はありません
図 1: Exchange Online 名の変更の痕跡がここにない

PowerShell スクリプトで必要な注意

前回の記事では、PowerShell 開発者が配布リストの所有者など、Exchange Online コマンドレットによって返される出力の処理に注意する必要がある場所の例をいくつか示しました。Microsoft 365グループとTeamsメンバーシップレポートを作成するスクリプトを見ると、このような状況に遭遇しました。

レポートには、各グループの所有者が含まれます。元のコードは、 管理対象者 によって返されるプロパティ Get-UnifiedGroup コマンドレット。これは、各グループ所有者の Name プロパティを含む配列リストです。EDOID が関与していない場合は問題ありませんが、これらの値が存在する場合、所有者のリストは次のようになります。

$Group.ManagedBy

bff4cd58-1bb8-4899-94de-795f656b4a18
Sean.Landy
Ben.James

EDOIDはユニークですが、人間には理解しづらいです。

更新されたコードは、 Get-UnifiedGroup そして、 受信者の取得 各所有者の表示名を返すコマンドレット。最後に、所有者のリストを結合して、レポートに含まれる値にします。

[array]$Owners = $Null
ForEach ($Owner in $Group.ManagedBy) { # Unpack the owners and retrieve a display name that's usable.
        $OwnerDisplayName = (Get-Recipient -Identity $Owner.trim()).DisplayName
        $Owners += $OwnerDisplayName }
     [string]$OwnersOutput = $Owners -join ", "

$Owners
Tony Redmond
Sean Landy
Ben James

この変更は、グラフがグループ所有者の完全な詳細を返すため、PowerShell を介して実行される Microsoft Graph クエリには影響しません。また、使用するプロパティを選択できます。これは、グループの所有者 ($Group.Id で渡された EDOID によって識別される) を返すための一般的なクエリです。

$Uri = "https://graph.microsoft.com/v1.0/groups/" + $Group.Id + "/owners?"
If you use the Microsoft Graph PowerShell SDK, the solution is:
[array]$ManagedBy= Get-MgGroupOwner -GroupId $Group.ExternalDirectoryObjectId
[array]$Owners = $Null
ForEach ($Owner in $ManagedBy) {
    $OwnerDisplayName = (Get-MgUser -UserId $Owner.Id).DisplayName
    $Owners += $OwnerDisplayName }

人間にやさしい値を返すためのアップデート。時々(ときのように 受信者の取得 メールボックスを一覧表示します)、Exchange Online は、 名前 財産。時々(の保有者をチェックするように 代理で送信 メールボックスのアクセス許可)、そうではありません。

識別名の特殊文字の問題

Name プロパティを更新して、 エドイド にノックオン効果があります 区別された名前 財産。更新後 名前 プロパティ、Exchange Online は 区別された名前 新しい Name 値を持つプロパティ。この変更の利点の 1 つは、特殊文字を含む識別名を処理する必要がなくなることです。

たとえば、このゲスト アカウントの姓は O’Malley で、アカウントのプロパティの一部は次のとおりです。

Get-Recipient -Identity 388d29d7-4c72-476d-be96-53060043122e | fl Name, DisplayName, DistinguishedName, Name

Name              : o'Malley.Linda_contoso.com#EXT#
DisplayName       : Linda O'Malley
DistinguishedName : CN=o'Malley.Linda_contoso.com\#EXT\#,OU=office365itpros.onmicrosoft.com,OU=Microsoft Exchange Hosted Organizations,DC=EURPR04A002,DC=prod,DC=outlook,DC=com
Name              : o'Malley.Linda_contoso.com#EXT#

Exchangeが 区別された名前 から 名前 財産。

スクリプトでの識別名の使用

これは、 区別された名前 アカウントが属するグループを次のようなコードで検索するには:

[string]$DN = (Get-Recipient -Identity $User.ExternalDirectoryObjectId).DistinguishedName
[array]$Groups = (Get-Recipient -ResultSize Unlimited -RecipientTypeDetails GroupMailbox -Filter "Members -eq '$DN'"

Linda O’Malley アカウントのコードを実行すると、次のエラーが生成されます。

Cannot bind parameter 'Filter' to the target. Exception setting "Filter": "Invalid filter syntax. For a description of
the filter parameter syntax see the command help.
"Members -eq 'CN=o'Malley.Linda_contoso.com\#EXT\#,OU=Office365ITPros.onmicrosoft.com,OU=Microsoft Exchange Hosted
Organizations,DC=EURPR04A002,DC=prod,DC=outlook,DC=com'" at position 19."

解決策の 1 つは、識別名に特殊文字を含むメールボックスを処理するようにフィルターを調整することです。アポストロフィの検査は,検査を実行する前に文字を「エスケープ」するための特殊処理を呼び出します。

$DN = (Get-Recipient -Identity $Guest.Id).DistinguishedName 
#    The distinguished name for some accounts might contain an apostrophe, so we need to handle this
     If ($Dn -like "*'*")  {
       $DNNew = "'" + "$($dn.Replace("'","''''"))" + "'"
       $Cmd = "Get-Recipient -Filter 'Members -eq '$DNnew'' -RecipientTypeDetails GroupMailbox | Select DisplayName, ExternalDirectoryObjectId"
       $GuestGroups = Invoke-Expression $Cmd }
     Else {
       $GuestGroups = (Get-Recipient -Filter "Members -eq '$Dn'" -RecipientTypeDetails GroupMailbox | Select DisplayName, ExternalDirectoryObjectId) }

メールユーザーオブジェクトの更新

EDOID を 名前 プロパティを使用すると、名前に特殊文字を含むアカウントに対応するコードを記述する必要がなくなります。欠点は、マイクロソフトの変更が新しいメールボにのみ影響することですxes.しかし、私たちが更新するのを止めるものは何もありません 名前 ゲストアカウントのメールユーザーオブジェクトのプロパティで、特殊文字を削除します。テナント内のすべてのメール ユーザーに対して変更を行う方法は次のとおりです。

[Array]$MailUsers = Get-MailUser -ResultSize Unlimited
ForEach ($Mu in $MailUsers) {
 Write-Host ("Updating mail user object for {0}" -f $Mu.DisplayName)
 Set-MailUser -Identity $Mu.ExternalDirectoryObjectId -Name $Mu.ExternalDirectoryObjectId }

テナント内のゲストアカウントのすべてのメールユーザーオブジェクトを更新した後、スクリプトで問題に遭遇していません。

思考のための一時停止

私は、組織がメールが有効なすべてのオブジェクトのnameプロパティを更新するために急いで出かけるべきだと主張しているわけではありません。マイクロソフトがEDOIDを使用するようにコードを更新するかどうかを確認することをお勧めします。 名前 そして 区別された名前 Exchange Online のすべてのメールが有効なオブジェクトのプロパティ。ただし、テナントの名前に特殊文字を含むメールが有効なオブジェクトがある場合は、それらのオブジェクトにすばやく簡単な変更を適用することで、PowerShell スクリプトを簡略化できます。そしてそれは素晴らしいことです。

未分類

Posted by admin