首页 > 解决方案 > PowerShell ConvertFrom-Csv

问题描述

所以这是我的代码。本质上,域管理员将使用此代码在我们的终端服务器上运行。我列出了所有当前登录的用户,并检查他们的个人组成员资格,然后计算成员数量。十分简单。

其中 99% 可以按预期工作,但到目前为止我还不是代码专家。我在从使用 quser 的第 4 行获取正确的名称列表时遇到问题。如果我切换到使用第 5 行作为文本,代码将按预期工作。

我终其一生都无法将第 4 行的输出转换为可以在其余代码中使用的格式。

Import-Module ActiveDirectory
$calgary = 0
$edmonton = 0
$users = (quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object USERNAME
$usersold = "Thomas", "Scott", "jeremy"
$groups = 'Domain Admins'

foreach ($user in $users) {
    foreach ($group in $groups) {
        $members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty SamAccountName

        If ($members -contains $user) {
            $calgary = $calgary + 1
            Write-Host "$user is a member of $group"
            Write-Host "$group has $calgary logged in users"
        } Else {
            Write-Host "$user is not a member of $group"
        }
    }
}

标签: powershell

解决方案


$users.GetType()返回一个 Array 类型的元素PSCustomObject,因此这是一个具有属性的对象,而不仅仅是一个字符串列表。

当您这样做时($user in $users),每个$user都是具有该USERNAME属性的对象。所以你有两个选择:

在循环中访问 USERNAME

当您需要循环内的用户名时,请使用$user.USERNAME

获取字符串列表而不是对象

将第 4 行替换为:

$users = $((quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object USERNAME).USERNAME

推荐阅读