我想知道是否可以仅针对活动用户将此脚本更改为一个?
import-module ActiveDirectory
Start-Transcript -Path "C:\test\teetest.txt"
$groups = Get-ADGroup -filter {(name -like "runners*") -or (name -like "helpers*")
foreach($group in $groups)
{
$countUser = (Get-ADGroupMember $group.DistinguishedName).count
Write-Host "The group $($group.Name) has $countUser user(s)."
}
Stop-Transcript
任何帮助将不胜感激。
答案 0 :(得分:0)
如果我正确理解了您的问题,并且活跃用户表示您的组至少包含1位成员(即大于0)。您可以只使用Where-Object
cmdlet过滤结果。像这样:
$groups = Get-ADGroup -filter {(name -like "runners*") -or (name -like "helpers*") -Properties Members | Where-Object { $_.Members.Count –gt 0 }
答案 1 :(得分:0)
是的,您可以添加一个过滤器以仅获取组中活动成员的数量。
由于Get-ADGroupMember
没有为用户提供所有属性,因此您必须为每个用户进行另一次查找:
$countUser = (Get-ADGroupMember $group.DistinguishedName | % { Get-ADuser -Identity $_ -Property Enabled | Where-Object {$_.Enabled -eq $true}}).count
说明:
% { Get-ADuser -Identity $_ -Property Enabled
-获取在组中添加了Enabled属性的每个用户的信息
Where-Object {$_.Enabled -eq $true}
-过滤已启用的用户
答案 2 :(得分:0)
我认为这可能是因为Get-ADGroupMember
不仅返回了具有有限属性集的用户对象,而且还返回了组和计算机。
由于您仅查找的是组“运行者*”或“帮助者*”的直接后代,因此最好将Get-ADGroupMember
cmdlet返回的对象限制为 users < / strong>。
下面,我通过添加Where-Object { $_.objectClass -eq "user" }
来完成此操作。
接下来,为了确保可以使用.Count
属性,我建议将它封装在@()
中,这样返回的值实际上是一个数组,因此具有Count
属性。
对于这样的脚本,我也建议不要尝试将其全部放在一行中,因为这样会使发现错误(例如忘记右括号)更加困难。
尝试一下:
Start-Transcript -Path "C:\test\teetest.txt"
$groups = Get-ADGroup -Filter {(name -like "runners*") -or (name -like "helpers*")}
foreach($group in $groups) {
$countUser = 0
Get-ADGroupMember $group.DistinguishedName | Where-Object { $_.objectClass -eq "user" } |
ForEach-Object {
if ((Get-ADuser -Identity $_.DistinguishedName).Enabled) { $countUser++ }
}
Write-Host "The group $($group.Name) has $countUser user(s)."
}
Stop-Transcript
答案 3 :(得分:-1)
用下面的示例替换$ countUser语句。
仅适用于已启用的用户帐户
$countUserEnabled = (get-aduser -filter *|where {$_.enabled -eq "True"}).count
仅适用于禁用的用户帐户
$countUserDisabled = (get-aduser -filter *|where {$_.enabled -ne "False"}).count