Appearance
Выгрузка ПК/Юзеров
Выгрузка с подсчетом элементов из 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)"Пример отработки

Архивная более мелкая, и не автоматизированная версия (Но более легкая и чистая)
Тут уже надо менять переменные ручками:
- во первых - Массив
$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 "`;"
}