Инструмент имеет простенький интерфейс и уже готов к работе без доп. модулей для PS
Сохраните скрипт ( .ps1 ) в директорию доступную для записи и выгружайте на здоровье. :)
Поиск групп осуществляется по началу имени группы, если потребуется выгрузить членов по нескольким группам, просто укажите начало имени групп и скрипт найдет все. После чего выгрузит по каждой группе в отдельную .csv в директории скрипта.
ЗЫ. Для ускорения поиска групп можно указать OU в которой будет выполнятся поиск в переменной LDAP_DIR в самом начале в в виде LDAP пути (пример: "LDAP://OU=,DC=" ).
$LDAP_DIR = ""
###Функция для получения членов групп более 1500
function Get_MemGr {
$AdsPath = $Args
$range = -1
$GroupMember =$Null
Do {
$range += 15
$Filter = "(objectClass=*)"
$Properties = "member;range=" + ($range - 14) + "-" + $range
$Searcher = New-Object DirectoryServices.DirectorySearcher($AdsPath, $Filter, $Properties, "Base")
$Group = $Null
$Group = $Searcher.FindOne().Properties
$NameVal = ($Group.PropertyNames -match "member")
if ( $Group -ne $null){$GroupMember += $Group.$NameVal}
} While ( $Group -ne $null )
return $GroupMember
}
###
########
For($Flag_end -eq 'end'){
Clear-Host
Write-Host "Добро пожаловать`nУтилита для выгрузки пользователей и из группы`nГотова к работе" -ForegroundColor green
if ($LDAP_DIR -ne ""){Write-Host "Сканируемая директория:" ($LDAP_DIR -replace "LDAP://" -replace ",DC=.+$" -replace "^.+=")}ELSE{Write-Host "Сканируемая директория: Весь домен" }
Write-Host "Директория для выгрузки:" (%{(Get-Location).Path})
Write-Host "Введите имя группы или начало её имени" -ForegroundColor yellow
$PRX = Read-Host
#Выход если введена переменная выхода
if ($PRX -eq 'end' -or $PRX -eq '*' -or $PRX -eq " " -or $PRX -eq ""){exit}
###################################
$search = New-Object system.DirectoryServices.DirectorySearcher
if ($LDAP_DIR -ne ""){$search.SearchRoot = $LDAP_DIR}
$search.Filter = "(&(objectCategory=Group)(cn=$PRX*))"
$search.PageSize = 100000
$Group_list = $search.Findall() | %{$_.path}
if($Group_list.Count -ne 0){
$Count_members = 0
foreach($GRP in $Group_list){
$Members = $Null
$Name_Group = $GRP -replace 'LDAP://CN=' -replace '.+$' -replace ',OU.+$'
Write-Host "\\" $Name_Group
$PATH = ".\" + $Name_Group + ".csv"
$Members = Get_MemGr $GRP
$Count_members = $Members.count
For($IND=0;$IND -lt $Members.Count;$IND++){
$ADobj = 'LDAP://' + $Members
$ADobj = $ADobj
$Members = $ADobj.name + ';' + $ADobj.sAMAccountName + ';' + $ADobj.mail + ';' + $ADobj.company + ';'+ $ADobj.department + ';' + $ADobj.title + ';' + $ADobj.l + ';' + $ADobj.streetAddress + ';' + $ADobj.physicalDeliveryOfficeName
$Count_members--
Write-Host $Count_members : $ADobj.name
}
Set-Content -Path $PATH -Value $Members
sleep 2
}
}
}