Skip to content

Выгрузка ПК/Юзеров

Выгрузка с подсчетом элементов из OU В AD

Принцип работы:

  • Опрос предприятия, от выбора будет присвоенно переменной значение равное OU организации - NTG или NGP
  • Опрос вложенного OU Users или WS для присвоения второй переменно значение вложенного OU
  • Подсчет элементов Выбранного OU со всеми вложенными OU
  • Вывод на экран информации о каждом OU + общее количество

Не стал париться и делать чисто выбор того, что ищем и тд, может позже

Тело скрипта

powershell
function Get-MenuChoice {
    param (
        [string]$Prompt,
        [string[]]$ValidChoices
    )
    do {
        $choice = Read-Host $Prompt
    } until ($ValidChoices -contains $choice)
    return $choice
}

$editChoice = Get-MenuChoice -Prompt "`nЧто за компания? OU Первого уровня`n1. НТГ`n2. НГП`nВыбор: " -ValidChoices @("1", "2")

    switch ($editChoice) {
        "1" {
            $baseOU_first = "NTG"
        }
        "2" {
            $baseOU_first = "NGP"
        }
}

$editChoice = Get-MenuChoice -Prompt "`nИскомые объекты? OU второго уровня`n1. Юзеры`n2. Тачки`nВыбор: " -ValidChoices @("1", "2")

    switch ($editChoice) {
        "1" {
            $baseOU_second = "Users"
        }
        "2" {
            $baseOU_second = "WS"
        }
}

# Укажите DN нужного OU
$baseOU = "OU=$baseOU_second,OU=$baseOU_first,DC=npr,DC=nornick,DC=ru"

# Функция для рекурсивного подсчета объектов в OU
function Get-OUObjectCount {
    param(
        [string]$OUPath
    )
    
    # Получаем все объекты в текущем OU (без рекурсии)
    $currentOUObjects = Get-ADObject -Filter * -SearchBase $OUPath -SearchScope OneLevel
    
    # Получаем все вложенные OU
    $childOUs = Get-ADOrganizationalUnit -Filter * -SearchBase $OUPath -SearchScope OneLevel
    
    # Подсчет объектов по типам для текущего OU
    $objectTypes = @{
        Users = 0
        Computers = 0
        Groups = 0
        Contacts = 0
        Other = 0
        Total = 0
    }
    
    foreach ($obj in $currentOUObjects) {
        switch ($obj.ObjectClass) {
            "user" { $objectTypes.Users++ }
            "computer" { $objectTypes.Computers++ }
            "group" { $objectTypes.Groups++ }
            "contact" { $objectTypes.Contacts++ }
            default { $objectTypes.Other++ }
        }
        $objectTypes.Total++
    }
    
    # Рекурсивный подсчет для вложенных OU
    $childResults = @()
    $childTotal = 0
    
    foreach ($childOU in $childOUs) {
        $childResult = Get-OUObjectCount -OUPath $childOU.DistinguishedName
        $childResults += $childResult
        $childTotal += $childResult.Total
    }
    
    # Создаем объект с результатами
    $result = [PSCustomObject]@{
        OUName = (Get-ADOrganizationalUnit -Identity $OUPath).Name
        OUPath = $OUPath
        Users = $objectTypes.Users
        Computers = $objectTypes.Computers
        Groups = $objectTypes.Groups
        Contacts = $objectTypes.Contacts
        Other = $objectTypes.Other
        TotalCurrentOU = $objectTypes.Total
        TotalIncludingSubOUs = $objectTypes.Total + $childTotal
        ChildOUs = $childResults
        ChildOUCount = $childOUs.Count
    }
    
    return $result
}

# Получаем результат для указанного OU
$result = Get-OUObjectCount -OUPath $baseOU

# Функция для вывода результатов
function Display-Results {
    param(
        [PSCustomObject]$OUResult,
        [int]$IndentLevel = 0
    )
    
    $indent = "  " * $IndentLevel
    $subIndent = "  " * ($IndentLevel + 1)
    
    Write-Host "$indent[$($OUResult.OUName)]" -ForegroundColor Green
    Write-Host "$subIndent Путь: $($OUResult.OUPath)" -ForegroundColor Gray
    Write-Host "$subIndent Объекты в этом OU:" -ForegroundColor Yellow
    Write-Host "$subIndent  Пользователи: $($OUResult.Users)"
    Write-Host "$subIndent  Компьютеры: $($OUResult.Computers)"
    Write-Host "$subIndent  Группы: $($OUResult.Groups)"
    Write-Host "$subIndent  Контакты: $($OUResult.Contacts)"
    Write-Host "$subIndent  Другие объекты: $($OUResult.Other)"
    Write-Host "$subIndent  Всего объектов в этом OU: $($OUResult.TotalCurrentOU)" -ForegroundColor Cyan
    Write-Host "$subIndent  Всего объектов включая вложенные OU: $($OUResult.TotalIncludingSubOUs)" -ForegroundColor Cyan
    Write-Host "$subIndent  Количество вложенных OU: $($OUResult.ChildOUCount)" -ForegroundColor Magenta
    
    if ($OUResult.ChildOUs.Count -gt 0) {
        Write-Host "$subIndentВложенные OU:" -ForegroundColor Yellow
        foreach ($child in $OUResult.ChildOUs) {
            Display-Results -OUResult $child -IndentLevel ($IndentLevel + 2)
        }
    }
    
    Write-Host ""
}

# Выводим результаты
Display-Results -OUResult $result

# Сводная информация
Write-Host "=== СВОДНАЯ ИНФОРМАЦИЯ ===" -ForegroundColor White -BackgroundColor DarkBlue
Write-Host "Корневой OU: $($result.OUName)" -ForegroundColor Green
Write-Host "Общее количество объектов: $($result.TotalIncludingSubOUs)" -ForegroundColor Green
Write-Host "Из них:" -ForegroundColor Yellow
Write-Host "  Пользователи: $($result.Users + ($result.ChildOUs | Measure-Object -Property Users -Sum).Sum)"
Write-Host "  Компьютеры: $($result.Computers + ($result.ChildOUs | Measure-Object -Property Computers -Sum).Sum)"
Write-Host "  Группы: $($result.Groups + ($result.ChildOUs | Measure-Object -Property Groups -Sum).Sum)"
Write-Host "  Контакты: $($result.Contacts + ($result.ChildOUs | Measure-Object -Property Contacts -Sum).Sum)"
Write-Host "  Другие объекты: $($result.Other + ($result.ChildOUs | Measure-Object -Property Other -Sum).Sum)"

Пример отработки

pic

Архивная более мелкая, и не автоматизированная версия (Но более легкая и чистая)

Тут уже надо менять переменные ручками:

  • во первых - Массив $ous, чтоб совпадал с вложенными OU внутри целевой OU
  • во вторых - Переменную $domain, например, если нужны юзеры в НГП, то вид будет $domain = 'OU=Users,OU=NGP,DC=npr,DC=nornick,DC=ru'

Тело скрипта

powershell

Import-Module ActiveDirectory

# Организационные единицы
$ous = @('AIZ',
         'Dudinka',
         'GRS1',
         'Messoyaha',
         'Pelyatka',
         'Severnoe',
         'Tuhard',
         'Yugnoe')
# Домен
$domain = 'OU=Users,OU=NTG,DC=npr,DC=nornick,DC=ru'

foreach ($ou in $ous){
    $ou = "OU=$ou,$domain"
    Get-ADUser -Filter * -Properties description -SearchBase $ou | Select-Object SamAccountName, Surname, Givenname, Description, distinguishedName | Export-Csv -Path "C:\Users\NovoselovVI\Documents\User-Domain-NTG.csv" -NoTypeInformation -Encoding UTF8 -Append -Delimiter "`;"
}