Powershell — показывает количество пользователей только в том случае, если в подразделении есть пользователи для подсчета

#powershell #count #ou

#powershell #подсчет #ou

Вопрос:

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

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

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

С той же попыткой я также попробовал Out-Host, и хотя это разбило массовую таблицу на отдельные таблицы, я все еще застрял с проблемой имени дочернего подразделения.

 $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
  

Моей следующей попыткой было попробовать только для просмотра списка, но результат очень запутанный. Он генерирует список, который показывает детализацию для каждого подразделения, но поскольку там есть и другие элементы, я получаю длинный список с большим количеством 0 отсчетов. Из-за представления списка и количества элементов из отчета сложно получить соответствующие данные. Если бы я мог найти способ очистить вывод, он бы отлично подходил для моих нужд. В идеале был бы способ изменить это, чтобы исключить пустые подразделения и конкретные подразделения (например, тестовые группы), тогда это работало бы достаточно хорошо. Я уверен, что есть команда 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
    }
}
  

Комментарии:

1. У вас есть два разных примера кода и нулевые образцы вывода. Пожалуйста, опубликуйте результат, который вас не устраивает, чтобы мы знали, с чем вам нужна помощь.

Ответ №1:

Вы могли бы просто получить значение 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:TestUserCount.csv' -UseCulture -NoTypeInformation
  

Используйте [PsCustomObject] здесь, потому что оно упорядочено по умолчанию

Комментарии:

1. Это сработало отлично! Я могу использовать часть фильтра ADOrg, чтобы исключить группы, которые мне не нужны, и фильтр для пользователей, чтобы исключить включенные / отключенные учетные записи.