none
【分享】按照关键词查询命令并确定运行该命令所需的权限 RRS feed

  • 常规讨论

  • 场景描述

    在使用EMS(Exchange PowerShell)Exchange服务器进行修改查询时,通常我们会使用Table键来补充完整的命令,除了Table键,我们也可以通过PowerShellGet-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-RoleGroupMemberGet-MailboxImportRequest皆有结果显示,则证明该测试账户已授予运行命令所需的权限。

    【结论】

    对于授予权限的两种方法(加入权限组创建权限组),其分别有各自的优缺点: 前者方便快捷,但授予过高的权限;后者授予一定的权限,但操作步骤比前者稍多一点。我们可针对实际的情况,选择不同的授权方式。

    参考链接:

    【关键词】EMSPowerShellExchange,命令权限,角色(Role),角色组(Role Group)

    希望上述信息能够帮到您。如果您对此还有其他问题,欢迎随时来我们论坛提问 (点击文章页面左上角的“提出问题”按钮快速发帖),我们会帮助您进一步调查这个问题。


    如果帖子有帮到您的话,请点击左上方“投票”按钮。这将帮助到阅读这个帖子的其他用户。


    2020年12月11日 3:22
    版主