Get-MailboxFolderPermission GUID匹配失效问题排查与测试咨询
Get-MailboxFolderPermission用户匹配失效问题解析
问题描述
原本使用Get-MailboxFolderPermission时通过GUID匹配用户的逻辑失效,仅能通过-like $user.DisplayName实现匹配,需排查代码问题并了解如何测试$_.User的实际值。
失效代码问题分析
失效代码的核心问题是数据类型不匹配:
$user.GUID是从Get-Mailbox获取的邮箱对象的GUID属性(类型为System.Guid)- 而
Get-MailboxFolderPermission返回的$_.User并非单纯的GUID字符串,而是一个包含用户身份信息的对象(比如Microsoft.Exchange.Management.RecipientTasks.MailboxFolderUserId类型),直接用-eq将GUID与该对象比较,永远不会相等。
另外,失效代码中循环所有邮箱再逐个获取日历权限的写法效率极低,但这不是匹配失效的直接原因。
测试$_.User实际值的方法
要查看$_.User的真实结构和属性,可以在代码中临时添加输出逻辑,比如:
foreach($user in $users){ Write-Output "checking for $user" Get-Mailbox | ForEach-Object { # 获取日历权限并先输出User对象的详细信息 $permissions = Get-MailboxFolderPermission $_":\calendar" $permissions | ForEach-Object { Write-Output "当前User对象类型: $($_.User.GetType().FullName)" Write-Output "User对象所有属性:" $_ | Select-Object -ExpandProperty User | Select-Object * } # 后续匹配逻辑可保留或调整 $permissions | Where {$_.User.Guid -eq $user.GUID} | Select Identity, User, AccessRights } }
通过上述代码可以看到$_.User实际包含的属性,比如是否有Guid、DisplayName等字段,从而调整匹配逻辑。
修正后的GUID匹配代码
如果要继续用GUID匹配,应该针对$_.User对象的Guid属性,同时优化循环减少重复查询:
$users = Get-Mailbox | Where-Object {$_.ExchangeUserAccountControl -eq 'AccountDisabled'} # 一次性获取所有邮箱的日历权限,避免重复遍历 $allCalendarPermissions = Get-Mailbox | ForEach-Object { Get-MailboxFolderPermission "$($_.Identity):\calendar" | Add-Member -MemberType NoteProperty -Name MailboxIdentity -Value $_.Identity -PassThru } foreach($user in $users){ $allCalendarPermissions | Where-Object {$_.User.Guid -eq $user.GUID} | Select-Object MailboxIdentity, User, AccessRights }
内容的提问来源于stack exchange,提问作者user3064085
相关产品推荐
相关产品推荐

