Статья размещена автором Бетке Сергей Сергеевич

Корректируем инициалы всех сотрудников в AD средствами powershell

Собственно – subject. Используем ADpowershell (о тонкостях его применения на Windows server 2003 DC уже писал), за основу возьмём сценарий (если можно так его назвать), разработанный нами для выгрузки контактных координат сотрудников в html.

Решим задачу.

Получим “красиво и удобно” ФИО наших сотрудников:

import-module ActiveDirectory

Get-ADUser `
    -Filter {name -notlike 'ПЯ*'} `
    -SearchBase 'OU=Группа Компаний ГАРО,OU=Персонал,OU=Предприятия,OU=iTg,DC=novgaro,DC=ru' `
    -SearchScope Subtree `
    -Properties `
        displayName, givenName, sn, initials  `
    | sort-object displayName `
    | select-object `
        -property `
            @{Name = "ФИО"; Expression = {$_.displayName;}}, `
            @{Name = "Фамилия"; Expression = {$_.sn;}}, `
            @{Name = "Имя"; Expression = {$_.givenName;}}, `
            @{Name = "Инициалы"; Expression = {$_.initials;}} `
    | out-gridView

Корректируем инициалы всех сотрудников в AD средствами powershell Приведённый выше код использует командлету Out-GridView, очень удобную для анализа результатов, и совершенно неприменимую в сценариях, исполнение которых подразумевается без участия администратора либо пользователя.

Итак, мы должны изменить атрибут initials, а также – sn и givenName. Идея следующая. Разбираем displayName в порядке “Фамилия Имя Отчество”, выделяя при этом Фамилию, Имя, Отчество и первые буквы Имени и Отчества. Естественно – применим регулярные выражения.

import-module ActiveDirectory

$reFIO = "(?<Фамилия>\w+)\s+(?<Имя>(?<И>\w)\w*)\s+(?<Отчество>(?<О>\w)\w*)"

Get-ADUser `
    -Filter {name -notlike 'ПЯ*'} `
    -SearchBase 'OU=Группа Компаний ГАРО,OU=Персонал,OU=Предприятия,OU=iTg,DC=novgaro,DC=ru' `
    -SearchScope Subtree `
    -Properties `
        displayName, givenName, sn, initials  `
    | forEach-Object `
        {
            if ($_.displayName -match $reFIO) {
                $_.sn = $matches["Фамилия"] 
                $_.givenName = $matches["Имя"] 
                $_.initials = "$($matches["И"]). $($matches["О"])."
            }
            $_
        } `
    | sort-object displayName `
    | select-object `
        -property `
            @{Name = "ФИО"; Expression = {$_.displayName;}}, `
            @{Name = "Фамилия"; Expression = {$_.sn;}}, `
            @{Name = "Имя"; Expression = {$_.givenName;}}, `
            @{Name = "Инициалы"; Expression = {$_.initials;}} `
    | out-gridView

Корректируем инициалы всех сотрудников в AD средствами powershell Результат видим именно тот, что и хотели, однако, если запустить исходный сценарий, видим, что изменения в AD не внесены!

Всё потому, что не хватало одной командлеты – Set-ADUser (следовало догадаться):

import-module ActiveDirectory

$reFIO = "(?<Фамилия>\w+)\s+(?<Имя>(?<И>\w)\w*)\s+(?<Отчество>(?<О>\w)\w*)"

Get-ADUser `
    -Filter {name -notlike 'ПЯ*'} `
    -SearchBase 'OU=Группа Компаний ГАРО,OU=Персонал,OU=Предприятия,OU=iTg,DC=novgaro,DC=ru' `
    -SearchScope Subtree `
    -Properties `
        displayName, givenName, sn, initials  `
    | forEach-Object `
        {
            if ($_.displayName -match $reFIO) {
                $_.sn = $matches["Фамилия"] 
                $_.givenName = $matches["Имя"] 
                $_.initials = "$($matches["И"]). $($matches["О"])."
            }
            Set-ADUser -Instance $_
            $_
        } `
    | sort-object displayName `
    | select-object `
        -property `
            @{Name = "ФИО"; Expression = {$_.displayName;}}, `
            @{Name = "Фамилия"; Expression = {$_.sn;}}, `
            @{Name = "Имя"; Expression = {$_.givenName;}}, `
            @{Name = "Инициалы"; Expression = {$_.initials;}} `
    | out-gridView

Теперь результат уже сохранён в AD. Собственно говоря, задача выполнена. Регулярные выражения сила, не правда ли :-).

Учитывая, что сценарий может выполняться некоторое время, добавим прогресс бар, powershell и это может!

import-module ActiveDirectory

$reFIO = "(?<Фамилия>\w+)\s+(?<Имя>(?<И>\w)\w*)\s+(?<Отчество>(?<О>\w)\w*)"
$scriptAction = 'Корректировка инициалов сотрудника'

($users = @(Get-ADUser `
    -Filter {name -notlike 'ПЯ*'} `
    -SearchBase 'OU=Группа Компаний ГАРО,OU=Персонал,OU=Предприятия,OU=iTg,DC=novgaro,DC=ru' `
    -SearchScope Subtree `
    -Properties `
        displayName, givenName, sn, initials
)) `
| foreach-object `
    -begin {
        $userIndex = 0;
        write-progress `
            -id 1 `
            -activity $scriptAction `
            -status "Приступаем..."
    } `
    -process {
        $userIndex +=1;
        if ($_.displayName -match $reFIO) {
            $_.sn = $matches["Фамилия"] 
            $_.givenName = $matches["Имя"] 
            $_.initials = "$($matches["И"]). $($matches["О"])."
        }
        Set-ADUser -Instance $_
        write-progress `
            -id 1 `
            -activity $scriptAction `
            -status "Корректируем" `
            -currentOperation "$userIndex из $($users.count)" `
            -percentcomplete ($userIndex/$users.count*100)
        $_
    } `
    -end {
        write-progress `
            -id 1 `
            -activity $scriptAction `
            -status "Завершили..." `
            -completed
    } `
| sort-object displayName `
| select-object `
    -property `
        @{Name = "ФИО"; Expression = {$_.displayName;}}, `
        @{Name = "Фамилия"; Expression = {$_.sn;}}, `
        @{Name = "Имя"; Expression = {$_.givenName;}}, `
        @{Name = "Инициалы"; Expression = {$_.initials;}} `
| out-gridView

Теперь уж точно всё.

Отзывы » (1)

  1. Поправил строку 6 в крайней редакции сценария:

    $users = @(Get-ADUser 
    

    Причины уже описал.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка