如何从对象的规范名称中获取用户主体名称

Posted

技术标签:

【中文标题】如何从对象的规范名称中获取用户主体名称【英文标题】:How to obtain user principal names from canonical name of objects 【发布时间】:2021-11-08 17:12:11 【问题描述】:

当我在 PowerShell 命令下运行时:

(Get-Mailbox -Identity SharedMailbox1).GrantSendOnBehalfTo

我得到以下输出:

contoso.local/NZ/Users/Internal/Test, User21
contoso.local/NZ/Users/Terminated/Test, User12
contoso.local/NZ/Users/Terminated/Test, User3
contoso.local/NZ/Users/Internal/Test, User6
contoso.local/NZ/Users/Internal/Test, User10

我想从数组中的这个输出中获取 UPN。有什么办法吗?

【问题讨论】:

我认为您无法可靠地从这些字符串中提取该信息。会有一些例外情况可能会产生不正确的结果。但是,您可以在另一个命令中使用此数据来查询用户对象并检索所需的属性。 【参考方案1】:

这实际上很简单。 GrantSendOnBehalfTo 属性包含 [Microsoft.Exchange.Data.Directory.ADObjectId] 类型的对象,这些对象适合通过管道传输到 Exchange 命令行管理程序中的其他 cmdlet。

(Get-Mailbox SharedMailbox1).GrantSendOnBehalfTo |
Get-Mailbox |
Select-Object -ExpandProperty UserPrincipalName

一个较短但可读性较差的版本:

((Get-Mailbox SharedMailbox1).GrantSendOnBehalfTo | Get-Mailbox).UserPrincipalName

您也可以将它与 ActiveDirectory 模块结合使用。您只需要确保您将字符串传递到 AD cmdlet 将为其-Identity 参数接受的管道中。当然,使用 DistinguishedName 不会出错:

((Get-Mailbox SharedMailbox1).GrantSendOnBehalfTo.DistinguishedName | 
Get-ADObject -Properties UserPrincipalName).UserPrincipalName

我应该指出,虽然在 GrantSendOnBehalfTo 属性中可能有一个组,但这种情况很少见。组没有 UserPrincipalName 属性。您可以使用Get-Recipient 并过滤收件人类型来解决这个问题:

(Get-Mailbox SharedMailbox1).GrantSendOnBehalfTo |
Get-Recipient | 
Where-Object$_.RecipientType -eq "UserMailbox" | 
Get-Mailbox | 
Select-Object -ExpandProperty UserPrincipalName

或AD版本:

(Get-Mailbox SharedMailbox1).GrantSendOnBehalfTo.DistinguishedName | 
Get-ADObject -Properties UserPrincipalName | 
Where-Object$_.objectClass -eq "user" | 
Select-Object -ExpandProperty UserPrincipalName

可能还有其他对象类型,但只要您过滤用户邮箱,您就应该能够输出正确的数据。当然,如果遇到非用户/邮箱等情况,可以扩展这些技术以更好地报告......

【讨论】:

以上是关于如何从对象的规范名称中获取用户主体名称的主要内容,如果未能解决你的问题,请参考以下文章

对于 Azure B2C,是不是可以通过声明发送用户主体名称?

声明环境中用户主体名称的 SharePoint UserProfile

SSPI:用户主体名称 WCF 客户端

如何按特定主体名称删除现有会话

如何从 sklearn TruncatedSVD 对象中获取特征名称?

如何获取时区别名的规范时区名称?