所以这是我的代码。本质上,域管理员将使用此代码在我们的终端服务器上运行。我列出了所有当前登录的用户,并检查他们各自的组成员身份,然后计算成员。容易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"
}
}
}
答案 0 :(得分:1)
在第4行,尝试使用:
$users = ((quser) -replace '\s{2,}', ',' | ConvertFrom-Csv | Select-Object USERNAME).username
答案 1 :(得分:1)
$users.GetType()
返回类型为PSCustomObject
的元素数组,因此这是一个具有属性的对象,而不仅仅是一个字符串列表。
当您执行($user in $users)
时,每个$user
都是具有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
}