使用quser获取终端服务器登录用户列表格式适配问题求助
解决quser输出转换后无法用于AD组成员检查的问题
我一眼就看出问题所在啦——你用quser转成CSV后得到的$users是对象数组,每个元素都带有USERNAME属性;而你之前的$usersold是纯字符串数组,这就是为什么后者能正常工作,前者不行。当你在If ($members -contains $user)里做判断时,你是在拿一个完整对象和字符串数组里的元素对比,自然匹配不上。
给你两种直接可行的修改方案:
方案1:直接提取用户名字符串(推荐)
修改第4行,用-ExpandProperty把USERNAME属性的值提取出来,让$users变成纯字符串数组,和$usersold结构一致:
$users = (quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object -ExpandProperty USERNAME
这样后续的循环判断逻辑完全不用改,就能正常运行。
方案2:保留对象结构,引用属性值判断
如果需要保留quser返回的其他信息(比如会话状态、登录时间),可以在循环里明确引用USERNAME属性:
foreach ($user in $users) { foreach ($group in $groups) { $members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty SamAccountName # 这里改成判断$user.USERNAME If ($members -contains $user.USERNAME) { $calgary = $calgary + 1 # 输出时也要用$user.USERNAME Write-Host "$($user.USERNAME) is a member of $group" Write-Host "$group has $calgary logged in users" } Else { Write-Host "$($user.USERNAME) is not a member of $group" } } }
额外优化建议
把Get-ADGroupMember的查询放到循环外面,不然每遍历一个用户就查一次AD组,效率很低:
Import-Module ActiveDirectory $calgary = 0 $edmonton = 0 $users = (quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object -ExpandProperty USERNAME $groups = 'Domain Admins' # 提前查询一次组成员,重复使用 $groupMembers = Get-ADGroupMember -Identity $groups -Recursive | Select-Object -ExpandProperty SamAccountName foreach ($user in $users) { if ($groupMembers -contains $user) { $calgary++ Write-Host "$user is a member of $groups" Write-Host "$groups has $calgary logged in users" } else { Write-Host "$user is not a member of $groups" } }
内容的提问来源于stack exchange,提问作者Scott Ferguson
相关产品推荐
相关产品推荐

