You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:12:49