Центр поддержки пользователей компании, в которой я работаю, запросил меня веб страницу или скрипт, чтобы иметь возможность получить список групп пользователя в текстовом виде и аналогично для получения списка пользователей группы.
Я решил выполнить задачу на PowerShell. Но это оказалось не так просто, как виделось с первого взгляда: нужно было не только выгрузить список групп пользователей, но и сделать дружелюбный интерфейс для техников центра поддержки.
Итак, в начале работы скрипта нужно получить учетную запись пользователя, чьи группы нужно выгрузить в файл. Для этого используется команда Read-Host.
Далее, чтобы получить список групп учетной записи, нужно подключить библиотеку ActiveDirectory, из которой использовать команду Get-ADUser. Первая проблема заключется в том, что команда возвращает не массив групп, а простой список, элементы которого разделены запятыми. То есть список нужно преобразовать в массив. Для этого использован цикл ForEach.
Далее нужно обработать ошибки поиска пользователя в домене: если пользователь не найден, то нужно подавить ошибку команды и вывести на экран информацию, что пользователь не найден. В этой задаче использован блок Try..Catch.
Последним этапом работы скрипта является вывод информации в CSV-файл. Здесь используется переменная пути к профилю текущего пользователя, на рабочем столе которого создается CSV файл с таблуляцией в качестве разделителя колонок.
import-module ActiveDirectory Function Get-UserMembership { Param($UserAccount) Process { Try { $Groups = (Get-ADUser -Identity $UserAccount -Properties MemberOf | ` Select-Object MemberOf).MemberOf } Catch { Return $Nothing } $GroupItems = @() ForEach ($Group in $Groups) { $var = $group.split(",") $var1 = $var[0] $ADGroup = $var1.Substring(3) $GrpItems = New-Object -TypeName PSObject -Property @{ Memberof = $ADGroup} $GroupItems += $GrpItems } Return $GroupItems | Sort memberOf } } Function Get-UserMembership_ByName { Param($UserName) Process { Try { $ResultNumber = (Get-ADUser -Filter {Name -eq $UserName} | Measure-Object).Count } Catch { Return $Nothing } If ($ResultNumber -eq 0) { Write-Host "There is no such user in the system." Return $Nothing } ElseIf ($ResultNumber -ge 2) { Write-Host "There are several users in the system with the provided name." ` "Please use the user account way." Return $Nothing } Else { $Groups = (Get-ADUser -Filter {Name -eq $UserName} -Properties memberof | ` Select-Object MemberOf).memberof $GroupItems = @() ForEach ($Group in $Groups) { $var = $group.split(",") $var1 = $var[0] $ADGroup = $var1.Substring(3) $GrpItems = New-Object -TypeName PSObject -Property @{ Memberof = $ADGroup} $GroupItems += $GrpItems } Return $GroupItems | Sort memberOf } } } $UserAccount = $Nothing $UserAccount = Read-Host 'What is the user account? (Type nothing to search by a user name)' If ($UserAccount -eq '') { $UserAccount = Read-Host 'What is the user name? (Last name and first name)' $Result = UserMembership_ByName $UserAccount | Sort Memberof } Else { $Result = Get-UserMembership $UserAccount | Sort Memberof } If ($Result -eq $Nothing) { Write-Host "Nothing is found. The result file is not created." } Else { $OutFile = (Get-Childitem env:USERPROFILE).Value + "\Desktop\$UserAccount.csv" $Result | Export-Csv $OutFile -Delimiter "`t" -Encoding UTF8 Write-Host "The result is in $OutFile file." }
Этот скрипт расширен дополнительной функцией - поиском по имени пользователя. То есть на первом этапе при запросе учетной записи пользователя можно ничего не вводить, тогда скрипт запросит имя пользователя и будет использовать функцию Get-UserMembership_ByName вместо Get-UserMembership.
Решение второй части задачи: получение членов группы, - будет описано в следующей заметке.