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

Реклама: В северодонецке ремонт с материалом цена узнать
Записка от 26.11.2013

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

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

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

 

Вверх