Powershell - 如果 OU 有用户计数,则仅显示用户数
Powershell - Only show count of users if OU has users to count
我已经尝试了几种方法并且非常非常接近但没有雪茄。
我需要帮助的是创建一个显示每个 OU 中的用户数量的报告。我知道有几种方法可以做到这一点,但我尝试过的每种方法都给了我不同程度的可用性。我非常感谢您提供有关我可以做些什么来改进我的查询的反馈。
我的第一次尝试是创建一个对象 table,但不幸的是我对对象 table 的了解并不多。输出是所有子 OU 及其计数的一大 table,但由于我们的许多子 OU 都具有相同的名称,所以这不是什么好事。可以为父 OU 添加另一个成员,但我不确定该怎么做。
通过同样的尝试,我也尝试了 Out-Host,虽然这确实将质量 table 分解为单个 tables,但我仍然遇到子 OU 名称问题。
$OUName_ou = Get-ADOrganizationalUnit -filter * -searchbase ‘OU=Users,DC=business,DC=com’ -SearchScope 1
$OUName = @()
foreach ($ou in $OUName_ou) {
$Query = New-Object PSObject
$Query | Add-Member -membertype NoteProperty -Name OU_Name -Value “”
$Query | Add-Member -membertype NoteProperty -Name User_Count -Value “”
$Query.OU_Name = $ou.name
$users = get-aduser -Filter * -SearchBase $ou
$numb = $users | measure
$Query.User_Count = $numb.count
$OUName += $Query
}
$OUName
我的下一次尝试是只尝试列表视图,但输出非常混乱。它生成一个列表,显示每个 OU 的向下钻取,但由于那里还有其他项目,我收到一个包含很多 0 计数的长列表。由于列表视图和项目数量,报告很难从中获取相关数据。如果我能找到一种方法来清理输出,它就可以很好地满足我的需要。理想情况下,有一种方法可以修改它以排除空 OU 和特定 OU(例如测试组),这样它就可以很好地工作。我肯定有一个 if 命令可以用来执行此操作,但到目前为止我还没有找到正确的语法。
$ous = Get-ADOrganizationalUnit -Filter * -SearchBase "ou=Users,ou=CMSG,dc=contoso,dc=com" | Select-Object -ExpandProperty DistinguishedName
$ous | ForEach-Object{
[psobject][ordered]@{
OU = $_
Count = (Get-ADUser -Filter * -SearchBase "$_").count
}
}
您可以在输出 PsCustomObject 之前简单地获取计数值,并且仅在计数大于 0 时才输出该值
类似于:
$ous = Get-ADOrganizationalUnit -Filter * -SearchBase "ou=Users,ou=CMSG,dc=contoso,dc=com"
$result = $ous | ForEach-Object {
$count = (Get-ADUser -Filter * -SearchBase $_.DistinguishedName).Count
if ($count) {
[PsCustomObject]@{
OU = $_.DistinguishedName
Users = $count
}
}
}
# output as table on screen
$result | Format-Table -AutoSize
# output to CSV you can open in Excel
$result | Export-Csv -Path 'D:\Test\UserCount.csv' -UseCulture -NoTypeInformation
这里使用[PsCustomObject]
,因为默认是有序的
我已经尝试了几种方法并且非常非常接近但没有雪茄。
我需要帮助的是创建一个显示每个 OU 中的用户数量的报告。我知道有几种方法可以做到这一点,但我尝试过的每种方法都给了我不同程度的可用性。我非常感谢您提供有关我可以做些什么来改进我的查询的反馈。
我的第一次尝试是创建一个对象 table,但不幸的是我对对象 table 的了解并不多。输出是所有子 OU 及其计数的一大 table,但由于我们的许多子 OU 都具有相同的名称,所以这不是什么好事。可以为父 OU 添加另一个成员,但我不确定该怎么做。
通过同样的尝试,我也尝试了 Out-Host,虽然这确实将质量 table 分解为单个 tables,但我仍然遇到子 OU 名称问题。
$OUName_ou = Get-ADOrganizationalUnit -filter * -searchbase ‘OU=Users,DC=business,DC=com’ -SearchScope 1
$OUName = @()
foreach ($ou in $OUName_ou) {
$Query = New-Object PSObject
$Query | Add-Member -membertype NoteProperty -Name OU_Name -Value “”
$Query | Add-Member -membertype NoteProperty -Name User_Count -Value “”
$Query.OU_Name = $ou.name
$users = get-aduser -Filter * -SearchBase $ou
$numb = $users | measure
$Query.User_Count = $numb.count
$OUName += $Query
}
$OUName
我的下一次尝试是只尝试列表视图,但输出非常混乱。它生成一个列表,显示每个 OU 的向下钻取,但由于那里还有其他项目,我收到一个包含很多 0 计数的长列表。由于列表视图和项目数量,报告很难从中获取相关数据。如果我能找到一种方法来清理输出,它就可以很好地满足我的需要。理想情况下,有一种方法可以修改它以排除空 OU 和特定 OU(例如测试组),这样它就可以很好地工作。我肯定有一个 if 命令可以用来执行此操作,但到目前为止我还没有找到正确的语法。
$ous = Get-ADOrganizationalUnit -Filter * -SearchBase "ou=Users,ou=CMSG,dc=contoso,dc=com" | Select-Object -ExpandProperty DistinguishedName
$ous | ForEach-Object{
[psobject][ordered]@{
OU = $_
Count = (Get-ADUser -Filter * -SearchBase "$_").count
}
}
您可以在输出 PsCustomObject 之前简单地获取计数值,并且仅在计数大于 0 时才输出该值
类似于:
$ous = Get-ADOrganizationalUnit -Filter * -SearchBase "ou=Users,ou=CMSG,dc=contoso,dc=com"
$result = $ous | ForEach-Object {
$count = (Get-ADUser -Filter * -SearchBase $_.DistinguishedName).Count
if ($count) {
[PsCustomObject]@{
OU = $_.DistinguishedName
Users = $count
}
}
}
# output as table on screen
$result | Format-Table -AutoSize
# output to CSV you can open in Excel
$result | Export-Csv -Path 'D:\Test\UserCount.csv' -UseCulture -NoTypeInformation
这里使用[PsCustomObject]
,因为默认是有序的