You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:59