PowerShell脚本问题:无法筛选非管理员组的远程PS启用用户
问题排查与修正方案
你的脚本存在几个关键问题,直接导致$UsersNotDA始终为空:
1. Out-String破坏了数组结构
你在获取管理员组成员和远程PS用户时都用了| Out-String,这会把原本的字符串数组转换成一个单个多行字符串。比如$DomainAdmins原本应该是["admin1", "admin2"]这样的数组,用Out-String后变成了"admin1nadmin2"(换行分隔的单个字符串),此时-notin`对比完全失效——你是在拿单个字符串和另一个单个字符串匹配,而非数组元素之间的对比。
2. 变量名拼写错误
你写的判断条件是$_.samaccountname -notin $DomainAdmin,但定义的管理员组变量是$DomainAdmins(多了个s),这里引用了未定义的$DomainAdmin(默认值为$null),逻辑完全错误。
3. $UserswithRemotePS的处理错误
你先提取了.samaccountname得到用户账号数组,随后又用| Out-String把它转成了单个字符串,之后在Where-Object里还试图访问$_.samaccountname——但此时$UserswithRemotePS是字符串,根本没有这个属性,$_.samaccountname返回$null,自然筛选不到任何结果。
修正后的完整脚本
# 获取两个管理员组的成员账号(保留数组,禁用Out-String) $DomainAdmins = (Get-ADGroupMember -Identity "Domain Admins").samaccountname $ExchangeAdmins = (Get-ADGroupMember -Identity "ExchangeAdmins").samaccountname # 合并两个组的账号并去重,简化后续筛选逻辑 $AdminAccounts = $DomainAdmins + $ExchangeAdmins | Select-Object -Unique # 清理现有Exchange会话并新建 Get-PSSession | Remove-PSSession $ExchangePSSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://ExchangeServer/PowerShell/ -Authentication Kerberos # 获取所有启用远程PS的用户(保留完整对象,方便后续修改属性) $UsersWithRemotePS = Invoke-Command -Session $ExchangePSSession { Get-User -ResultSize Unlimited -Filter 'RemotePowerShellEnabled -eq $true' } # 筛选出不在管理员组的用户 $UsersNotInAdminGroups = $UsersWithRemotePS | Where-Object { $_.SamAccountName -notin $AdminAccounts } # 批量禁用非管理员用户的远程PS权限 if ($UsersNotInAdminGroups) { Invoke-Command -Session $ExchangePSSession -ArgumentList $UsersNotInAdminGroups.SamAccountName { param($UserAccounts) foreach ($account in $UserAccounts) { Set-User -Identity $account -RemotePowerShellEnabled $false Write-Host "已禁用用户 $account 的远程PowerShell权限" } } } # 清理会话 Remove-PSSession $ExchangePSSession
关键修改说明
- 移除所有
Out-String,确保变量保留数组/对象类型,让-notin能正常执行数组匹配。 - 合并管理员组账号并去重,减少重复判断。
- 保留
Get-User返回的完整用户对象,而非仅提取账号名,方便后续直接调用Set-User修改属性。 - 修正变量名拼写错误,确保对比逻辑指向正确的管理员账号数组。
内容的提问来源于stack exchange,提问作者Heimdalwk
相关产品推荐
相关产品推荐

