Получение списка групп пользователя через PowerShell

26.06.2012

Центр поддержки пользователей компании, в которой я работаю, запросил меня веб страницу или скрипт, чтобы иметь возможность получить список групп пользователя в текстовом виде и аналогично для получения списка пользователей группы.

Я решил выполнить задачу на 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.

Решение второй части задачи: получение членов группы, - будет описано в следующей заметке.