Я пробовал это несколькими способами и подошел очень, очень близко, но без сигары.

Мне нужна помощь, так это создание отчета, показывающего количество пользователей в каждом подразделении. Я знаю, что есть несколько способов сделать это, но каждый метод, который я пробовал, дал мне разную степень удобства использования. Я был бы очень признателен за отзывы о том, что я могу сделать, чтобы улучшить свои запросы.

Моя первая попытка заключалась в создании таблицы объектов, но, к сожалению, мои познания в таблицах объектов не так хороши. Результатом была одна большая таблица всех дочерних 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, но, поскольку там есть другие элементы, я получаю длинный список с множеством нулевых значений. Из-за представления списка и количества элементов в отчете трудно получить релевантные данные. Если бы я мог найти способ очистить вывод, он бы отлично подошел для моих нужд. В идеале должен быть способ изменить это, чтобы исключить пустые 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
    }
}
0
Disfunctional Gyroid 18 Ноя 2020 в 18:07

1 ответ

Лучший ответ

Вы можете просто получить значение счетчика перед выводом 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], потому что он упорядочен по умолчанию

0
Theo 18 Ноя 2020 в 15:29