0

我已经尝试了几种方法,并且非常非常接近,但没有雪茄。

我需要帮助的是创建一个显示每个 OU 中用户数量的报告。我知道有几种方法可以做到这一点,但我尝试过的每种方法都给了我不同程度的可用性。我真的很感激一些关于我可以做些什么来改进我的查询的反馈。

我的第一次尝试是创建一个对象表,但不幸的是我对对象表的了解并不是那么好。输出是一张包含所有子 OU 及其计数的大表,但由于我们的许多子 OU 具有相同的名称,所以它没有任何好处。可以为父 OU 添加另一个成员,但我不知道该怎么做。

通过同样的尝试,我还尝试了 Out-Host,虽然这确实将批量表分解为单独的表,但我仍然遇到子 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
    }
}
4

1 回答 1

0

您可以在输出 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],因为它是默认排序的

于 2020-11-18T15:29:51.550 回答