Корректируем инициалы всех сотрудников в 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
Приведённый выше код использует командлету 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 не внесены!
Всё потому, что не хватало одной командлеты – 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)
RSS комментарии
Обратная ссылка
Поправил строку 6 в крайней редакции сценария:
Причины уже описал.