PowerShell ConvertFrom-Csv

时间:2018-05-29 22:36:33

标签: powershell

所以这是我的代码。本质上,域管理员将使用此代码在我们的终端服务器上运行。我列出了所有当前登录的用户,并检查他们各自的组成员身份,然后计算成员。容易Peasy。

其中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"
        }
    }
}

3 个答案:

答案 0 :(得分:1)

在第4行,尝试使用:

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

答案 1 :(得分:1)

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

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

访问循环中的USERNAME

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

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

将第4行替换为:

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

答案 2 :(得分:0)

我认为获取已登录用户列表的更好方法是使用Get-CimInstance收集会话,过滤LogonType 3(远程登录),然后获取与这些登录ID关联的用户。然后,因为看起来你想要能够检查多个组,我会得到每个组的成员,并且只记下每个用户是否是每个组的成员。最后,我将输出一个包含所有会话的表,包括每个用户所属的组,以及每个组已登录的用户数。

$LoggedOn = gcim Win32_LoggedOnUser
$GroupNames = 'pkiadmins'
$Groups = @{}
$GroupNames | ForEach-Object { $Groups.Add($_,(Get-ADGroupMember -Identity $_ -Recursive | Select -Expand SamAccountName)) }
$Sessions = gcim Win32_LogonSession -PipelineVariable Session|?{$_.LogonType -eq 3}|%{
    $SesUser = $LoggedOn|?{$_.Dependent.LogonId -eq $Session.LogonId}
    $SessionOut = [PSCustomObject]@{
        Domain = $SesUser.Antecedent.Domain
        User = $SesUser.Antecedent.Name
    }
    ForEach($Group in $GroupNames){
        Add-Member -InputObject $SessionOut -NotePropertyName $Group -NotePropertyValue ($SessionOut.User -in $Groups[$Group])
    }
    If($SessionOut.User -notmatch '\$$'){$SessionOut} #skip computer accounts
}
$Sessions|FT -Auto
ForEach($Group in $GroupNames){
    "Group '{0}' has {1} logged in user(s)" -f $Group,([array]($Sessions|?{$_.$Group})).Count
}