如何在PSCustomObject中拆分FullAccess字段的CONTOSO\域前缀
移除Exchange共享邮箱权限报表FullAccess字段中的域前缀
针对你遇到的SecurityPrincipalIdParameter类型导致Split报错、空值调用出错的问题,可以通过以下方法解决:
核心处理逻辑
- 类型转换:先将
User属性转为字符串,再进行拆分操作,避免类型不兼容报错 - 空值判断:先检查权限集合是否为空,为空时直接返回空字符串,防止空值调用错误
- 域前缀剥离:用反斜杠
\拆分字符串,取拆分后的最后一段(即纯用户名)
完整脚本示例
# 枚举所有共享邮箱 $sharedMailboxes = Get-Mailbox -RecipientTypeDetails SharedMailbox # 生成权限报表 $permissionReport = foreach ($mailbox in $sharedMailboxes) { # 获取非继承的FullAccess权限,排除系统内置账户 $fullAccessList = Get-MailboxPermission -Identity $mailbox.Identity | Where-Object { $_.AccessRights -contains "FullAccess" -and !$_.IsInherited -and $_.User -notmatch "^NT AUTHORITY\\|^S-1-5-" } # 处理FullAccess字段,移除域前缀 $cleanFullAccess = if ($fullAccessList) { $fullAccessList | ForEach-Object { # 转字符串后拆分,取反斜杠后的用户名部分 ($_.User.ToString() -split '\\')[-1] } -join ',' } else { "" } # 处理SendAs权限(保留原有逻辑) $sendAsList = Get-RecipientPermission -Identity $mailbox.Identity | Where-Object { $_.AccessRights -contains "SendAs" -and !$_.IsInherited } $cleanSendAs = if ($sendAsList) { $sendAsList.User -join ',' } else { "" } # 输出自定义报表对象 [PSCustomObject]@{ Name = $mailbox.Name FullAccess = $cleanFullAccess SendAs = $cleanSendAs } } # 导出为CSV文件 $permissionReport | Export-Csv -Path "SharedMailboxPermissions_Report.csv" -NoTypeInformation -Encoding UTF8
关键细节说明
$_.User.ToString():强制将SecurityPrincipalIdParameter类型转为字符串,解决无法直接调用Split的问题(-split '\\')[-1]:反斜杠需要转义,拆分后取数组最后一个元素,兼容CONTOSO\usr11或contoso.local\usr11这类不同格式的域前缀if ($fullAccessList):先判断权限集合是否存在,为空时返回空字符串,避免空值调用ForEach-Object报错
运行脚本后,生成的CSV中FullAccess字段将只保留纯用户名,符合你的期望输出要求。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

