Exchange公共文件夹权限查询报错:ArrayList无法转PublicFolderIdParameter
公共文件夹权限查询报错修复方案
完整报错信息:Cannot process argument transformation on parameter 'Identity'. Cannot convert the "System.Collections.ArrayList" value of type "System.Collections.ArrayList" to type "Microsoft.Exchange.Configuration.Tasks.PublicFolderIdParameter".
根因说明
你的代码中Get-PublicFolder筛选后返回的$pf是多个公共文件夹对象组成的集合(ArrayList类型),而Get-PublicFolderClientPermission的-Identity参数仅支持传入单个公共文件夹标识,直接传入集合触发类型转换失败。
修复步骤
1. 先验证匹配结果数量
执行以下代码确认你当前的筛选规则命中了多少个公共文件夹:
$mepf = Get-MailPublicFolder "Pub Folder Name" -ResultSize unlimited $alias = $mepf.displayname $pf = get-publicfolder -Recurse -ResultSize unlimited | ? {$_.Identity -match "$alias"} $pf.Count
如果返回值大于1,说明你的匹配规则不够精确,如需精确匹配单个文件夹,可以把筛选条件改为$_.Identity -eq "完整的公共文件夹路径"。
2. 修正后的完整权限拉取代码
如果需要批量拉取所有匹配的公共文件夹权限,改用循环遍历单个对象的逻辑:
# 获取目标邮件启用公共文件夹属性 $mepf = Get-MailPublicFolder "Pub Folder Name" -ResultSize unlimited $targetDisplayName = $mepf.displayname # 筛选匹配的公共文件夹,转义特殊字符避免正则误匹配 $pfList = Get-PublicFolder -Recurse -ResultSize unlimited | Where-Object {$_.Identity -match [regex]::Escape($targetDisplayName)} # 遍历拉取每个文件夹的权限,关联文件夹路径方便后续映射 $permsList = foreach ($pfItem in $pfList) { Get-PublicFolderClientPermission -Identity $pfItem.Identity | Where-Object {$_.User -notmatch "Default|Anonymous"} | Select-Object @{Name='FolderPath';Expression={$pfItem.Identity}},User,AccessRights } # 输出所有权限结果 $permsList
优化点说明
- 新增
[regex]::Escape()处理显示名称:自动转义名称中的空格、特殊符号,避免正则匹配逻辑异常 - 输出结果关联文件夹路径:方便你迁移公共文件夹到共享邮箱时,直接对应权限映射关系
- 循环传参完全规避集合类型不兼容问题
内容的提问来源于stack exchange,提问作者Techknow
相关产品推荐
相关产品推荐

