【场景描述】
在使用EMS(Exchange PowerShell)对Exchange服务器进行修改查询时,通常我们会使用Table键来补充完整的命令,除了Table键,我们也可以通过PowerShell的Get-Command命令去查询所需命令。
【命令介绍】
Get-Command命令本身用于查询计算机上已安装的所有命令,如果不带参数,则会获取所有已安装的命令,如果利用一些关键词和连接表达式的逻辑运算符(-and,
-or)加以筛选,就可以缩小范围并找到所需的命令。
【测试结果】
以下命令和测试截图供您参考:
Get-Command | where{$_.Name -like "*<>*" –and ($_.Name –like "*<>*" –or $_.Name –like "*<>*")}
| ft Name
Get-Command | where{($_.Name -like "*mailbox*" -and $_.Name -like "Get-*" -and $_.Name -like "*request*") -and ($_.Name -like "*import*"
-or $_.Name -like "*export*")} | ft Name

【结论】
用于筛选的关键词和表达式(例如:
$_.Name –like "*mailbox*")的数量越多,所需命令的范围就越小。
【问题描述】
如果经过关键词筛选命令后仍未找到所需的命令,可能是当前的邮箱账号没有足够的权限,且在使用当前邮箱账号访问本地服务器的EMS或使用远程
PowerShell连接到 Exchange
服务器并运行该命令时,会出现命令无法识别的错误:

【解决方案】
1.
运行Get-ManagementRole以查看命令所需的角色权限(Role)
Get-ManagementRole -Cmdlet "<完整的命令名称>"

2.
运行Get-ManagementRoleAssignment以查看分配了第一步所需角色权限的权限组
$Roles = Get-ManagementRole -Cmdlet "<完整的命令名称>"
$Roles | foreach{Get-ManagementRoleAssignment -Role $_.Name -Delegating $false}

3.
运行Get-RoleGroupMember以查看当前账户是否是第二步权限组的成员
$RoleGroups = $Roles | foreach{Get-ManagementRoleAssignment -Role $_.Name -Delegating $false}
foreach($_ in $RoleGroups){Get-RoleGroupMember -Identity $_.RoleAssigneeName | Select-Object Name, @{n="RoleName";e={$RoleGroups.Role}}, @{n="RoleGroupName";e={$RoleGroups.RoleAssigneeName}}}

4.
如果邮箱数量很多,我们也可以通过where{$_.Name –eq "邮箱名称"}语句来确认当前邮箱账户的权限,请参考以下命令:
foreach($_ in $RoleGroups){Get-RoleGroupMember -Identity $_.RoleAssigneeName | where{$_.Name –eq "邮箱名称"}
| Select-Object Name, @{n="RoleName";e={$RoleGroups.Role}}, @{n="RoleGroupName";e={$RoleGroups.RoleAssigneeName}}}

5.
如果无输出结果即权限不足,此时我们可以将当前邮箱账户加入具有相应角色权限的权限组,或者创建新的权限组来获取权限。
方案一:运行以下命令以加入权限组:
$RoleGroups | foreach{Add-RoleGroupMember –Identity $_.RoleAssigneeName -Member "邮箱名称"
-BypassSecurityGroupManagerCheck}

方案二:创建权限组(需要授予委托权限(使用命令行管理程序委派管理角色),否则会出现权限不足的报错;如果能够创建权限组,可忽略该操作)
New-RoleGroup -Name "Mailbox Import Export" -Roles "Mailbox Import Export"
Add-RoleGroupMember -Identity "Mailbox Import Export" -Member "邮箱名称"

再次运行第三步的Get-RoleGroupMember命令和Get-MailboxImportRequest命令以查看该账户是否具有权限:
foreach($_ in $RoleGroups){Get-RoleGroupMember -Identity $_.RoleAssigneeName | where{$_.Name –eq "邮箱名称"}
| Select-Object Name, @{n="RoleName";e={$RoleGroups.Role}}, @{n="RoleGroupName";e={$RoleGroups.RoleAssigneeName}}}

【测试结果】
运行Get-RoleGroupMember和Get-MailboxImportRequest皆有结果显示,则证明该测试账户已授予运行命令所需的权限。
【结论】
对于授予权限的两种方法(加入权限组,创建权限组),其分别有各自的优缺点:
前者方便快捷,但授予过高的权限;后者授予一定的权限,但操作步骤比前者稍多一点。我们可针对实际的情况,选择不同的授权方式。
参考链接:
【关键词】EMS,PowerShell,Exchange,命令权限,角色(Role),角色组(Role
Group)
希望上述信息能够帮到您。如果您对此还有其他问题,欢迎随时来我们论坛提问 (点击文章页面左上角的“提出问题”按钮快速发帖),我们会帮助您进一步调查这个问题。
如果帖子有帮到您的话,请点击左上方“投票”按钮。这将帮助到阅读这个帖子的其他用户。