Перед каждым системным администратором может встать проблема массового изменения атрибутов пользователей, например название компании или отдела. Когда пользователей не больше сотни, можно напрячься и сделать все вручную, но если пользователей больше сотни, то встает вопрос как все автоматизировать. Об этом и будет данная статься.

Данная статья является в какой то степени продолжении предыдущей.

Автоматизировать назначение нужных атрибутов я буду с помощью PowerShell-скрипта.

Для того, чтобы скрипт отработал, нужно подготовить нужные данные. Данные были предоставленны отделом кадров в виде Excel-файла. В файле были соответствующие столбцы со следующими данными: ФИО, Должность, Город, Отдел. В компании сотрудники работают по всей России, поэтому в качестве местоположения офиса, я решил использовать название города.

Столбцы я назвал следующим образом: displayname, title, physicalDeliveryOfficeName, department.

После этого сохранил текущий лист, как «CSV (разделители — запятые) (*.csv)» . Дальше этот файл открыл для проверки блокнотом, в теккте были одни кракозябры. Помня предыдущий опыт, понял, что такой текст считать не удастся. Начал экспериментировать, пришел к следующему решению:

  1. Сохраняю лист как «CSV (MS-DOS) (*.csv)«
  2.  Открываю получившийся файл с помощью текстового редактора Notepad++. Вижу следующее:

Опять абракадабра. Надо перевести все в читаемый вид. Для этого последовательно выбираю следующие пункты меню: «Encoding -> Character sets -> Cyrillic -> OEM866» .

После этого стало отображаться нормально. В конце файла я обнаружил лишние символы:

Удалил их.

После этого сконвертировал все в UTF-8, и сохранил в файл useratribute_utf8.csv :

Всё, данные готовы, может писать скрипт:

cls
#Импортируем модуль для работы с Active Directory
Import-Module ActiveDirectory -ErrorAction SilentlyContinue
#OU Откуда берем пользователей
$sourceOU="OU=CompanyName_Users,DC=office,DC=local"
# Указываем исходный файл
$impfile = "C:\Scripts\useratribute_utf8.csv"
# Импортируем файл, указывая в качестве разделителя символ точку с запятой
$users = Import-CSV $impFile -Delimiter ";"
#Запускаем цикл и парсим каждую строчку
foreach ($user in $users)
{

#Считыаем данные из каждой ячейки матрицы в свою переменную
$dplname = $user.displayname
$titlename = $user.title
$officename = $user.physicalDeliveryOfficeName
$depname = $user.department

#Имя компании
$companyname = 'ООО "Имя компании"'
#Ищем пользователя в AD и проверяем его актуальность
$userset=get-aduser -f {enabled -eq $false -and name -eq $dplname} -SearchBase $sourceOU
if ($userset -eq $Null)
{

# Если пользователь активен
write-host "Пользователь $dplname активен, $titlename"
#Получаем все данные о пользователе в переменную getname
$getname=get-aduser -f {name -eq $dplname} -SearchBase $sourceOU
$adname=$getname.SamAccountName

#Изменяем атрибуты пользователя
#Департамент
Set-ADUser $adname -Replace @{department = $depname}
#Имя компании
Set-ADUser $adname -Replace @{Company = $companyname}
# Город
Set-ADUser $adname -Replace @{l = $officename}
#Расположение офиса
Set-ADUser $adname -Replace @{physicalDeliveryOfficeName = $officename}
#Должность
Set-ADUser $adname -Replace @{title = $titlename}
# End If True
}
# Конец цикла For
}

Скрипт готов, можно запускать.

Tagged with:  

33 Responses to Изменение атрибутов пользователя с помощью PowerShell

  1. Алексей:

    Спасибо! Очень помогло ))

  2. Silver23:

    Добрый день подскажите если пользователи создана и нужно просто добавить всем атрибут телефоны — можно обойтись одной командой?

  3. Добрый день.
    В скрипте обрабатывается каждый пользователь в отдельности. Соответственно, если надо одному пользователю, то достаточно одной команды.

  4. Эмиль:

    Добрый день.
    Отличная статья!
    А как можно изменить дополнительные атрибуты, созданные отдельно, нестандартные?
    Если вас не затруднит, можете показать примерно как менять эти параметры:
    -Name
    -DisplayName
    -EmailAddress
    -OfficePhone
    -Description
    -Department
    -Title
    -Company
    -City
    -MobilePhone
    -PhoneNumber
    -Office
    -StreetAddress
    -OtherAttributes @{‘nISEDUKZIIN’=$iin;’nISEDUKZCLASS’=$class;’nISEDUKZALTEMAIL’=$email;’nISEDUKZROLE’=$role}
    ?

  5. Анатолий:

    Доброго времени суток
    Спасибо за статью!
    Такой вопрос: Обязательно ли искать пользователей? Т.е. мне не нужно знать активен пользователь или нет, а просто изменить определенные атрибуты по списку. Могу ли я сделать подобным образом?

    #Запускаем цикл и парсим каждую строчку
    foreach ($user in $users)
    {
    #Считыаем данные из каждой ячейки матрицы в свою переменную
    $dplname = $user.displayname
    $titlename = $user.title
    $officename = $user.physicalDeliveryOfficeName
    $depname = $user.department
    #Имя компании
    $companyname = ‘ООО «Имя компании»‘
    #Изменяем атрибуты пользователя
    #Департамент
    Set-ADUser $adname -Replace @{department = $depname}
    #Имя компании
    Set-ADUser $adname -Replace @{Company = $companyname}
    # Город
    Set-ADUser $adname -Replace @{l = $officename}
    #Расположение офиса
    Set-ADUser $adname -Replace @{physicalDeliveryOfficeName = $officename}
    #Должность
    Set-ADUser $adname -Replace @{title = $titlename}
    # Конец цикла For
    }

  6. Алексей:

    Советую воспользоваться утилитой «Active Directory Bulk Operations». Программа позволяет пакетно создавать и редактировать учетные записи пользователей, а так же копировать учетные записи с сохранением членства в группах и полной иерархией организационных единиц в другой домен! Скачать можно тут: http://www.sysadminsoft.ru/active-directory-bulk-operations

  7. Егор:

    Подскажите пожалуйста как запонить абрибут info (заметки) если можно пример
    Спасибо
    Пытался так Set-aduser -Identity ivanov info текст не получается

  8. Сергей:

    Добрый день подскажите как правильно выгрузить параметр manager.
    При таком запросе Get-ADUser -identity user1 -Properties manager | select manager, выдает
    CN=Иванов Иван Иванович,OU=Отдел,DC=TEST,DC=LOCAL, а хочется получить только ИВАНОВ ИВАН ИВАНОВИЧ

  9. Олег:

    Стоило бы упомянуть, что переименование пользователя можно сделать с помощью:
    get-aduser UserName | Rename-ADObject -NewName «Новое имя пользователя»

  10. Сергей:

    Подскажите пожалуйста, как в поле атрибута добавить значение. Если сейчас в атрибуте записано «кролик», то как сделать «большой кролик». Пример напишите плиз 🙂 командой -add не получилось, т.к. значение не пустое, а полностью заменять значение атрибута не нужно, т.к. переборе массива необходимо на каждую учетную запись в атрибуте будет добавить текст, в нашем случае слово «большой «, т.ж. Прошу уточнить как добавить значение до и после имеющегося текста в атрибуте и можно ли очистить имеющиеся пробелы» » в поле атрибута. Спасибо 🙂

    • Воспользуйтесь командой с параметром replace
      SET-ADUSER test123 –replace @{info=”Test Info”}

      А в поле подставляйте переменную, которую заранее сформируете исходя из ваших условий

      • Сергей:

        -replace заменяет все данные в поле, а как их дополнить не удаляя текущие?

        • Я же написал, что формируете переменную, значение которой потом вставляете в поле.
          Т.е. считали в переменную текущее значение поле, в переменной в зависимости от условий добавили, удалили, модифицировали значение. Потом новое значение вставили в поле.

  11. Сергей:

    Спасибо за скрипт

  12. Сергей:

    Пытаюсь изменить атрибут Description, возникает ошибка. Подскажите пож-та как исправить.
    Set-ADUser : Не удается проверить аргумент для параметра «Identity». Аргумент и
    меет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего повт
    орите выполнение команды.

  13. Сергей:

    строка:15 знак:11
    Set-ADUser $adname -Replace @{description = $descriptionname}
    CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingV
    alidationException
    FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Activ
    eDirectory.Management.Commands.SetADUser

  14. Евгений:

    Спасибо!

  15. Евгений:

    Алексей, добрый день. Подскажите как скорректировать ваш скрипт, чтоб не изменял поля, а просто аудит учеток на предмет неправильного заполнения полей или пустых полей и вывод в csv файл
    Спасибо

  16. Добрый день.
    Я бы брал атрибуты и сравнивал их с нужным параметром.

  17. Евгений:

    Добрый день!
    Подскажите, а можно ли скриптом править вкладку СРЕДА в АД для нескольких УЗ, чтоб не влазить в каждую?!

  18. Игорь:

    Добрый день!
    Как дописать Ваш скрипт, чтобы он искал учетки в ад по displayname и если учетка не найдена завершал работу при этом выводя сообщение что, например, пользователь » Иванов Александр Сергеевич» не найден, а если найден писал соответственно, что пользователь найден и продолжил заполнение атрибутов.

  19. Ruslan:

    Добрый день! При запуске скрипта сообщается об ошибке.
    PS C:\Windows\system32> C:\PS\script.ps1
    get-aduser : Переменная: «dplname» обнаружена в выражении: $dplname не имеет определения.
    C:\PS\script.ps1:24 знак:11
    + $userset= get-aduser -f {enabled -eq $false -and name -eq $dplname} — …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADU
    ser

    Пользователь активен, test инженер
    get-aduser : Переменная: «dplname» обнаружена в выражении: $dplname не имеет определения.
    C:\PS\script.ps1:30 знак:10
    + $getname=get-aduser -f {name -eq $dplname} -SearchBase $sourceOU
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADU
    ser

    Set-ADUser : Не удается проверить аргумент для параметра «Identity». Аргумент имеет значение NULL. Укажите допустимое значение арг
    умента, после чего повторите выполнение команды.
    C:\PS\script.ps1:34 знак:12
    + Set-ADUser $adname -Replace @{department = $department}
    + ~~~~~~~
    + CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser

  20. Ruslan:

    Добрый день! При запуске скрипта возникает ошибка, помогите пожалуйся разобраться.

    PS C:\Windows\system32> C:\PS\script.ps1
    get-aduser : Переменная: «dplname» обнаружена в выражении: $dplname не имеет определения.
    C:\PS\script.ps1:24 знак:11
    + $userset= get-aduser -f {enabled -eq $false -and name -eq $dplname} — …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADU
    ser
    Пользователь активен, test инженер
    get-aduser : Переменная: «dplname» обнаружена в выражении: $dplname не имеет определения.
    C:\PS\script.ps1:30 знак:10
    + $getname=get-aduser -f {name -eq $dplname} -SearchBase $sourceOU
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADU
    ser

    Set-ADUser : Не удается проверить аргумент для параметра «Identity». Аргумент имеет значение NULL. Укажите допустимое значение арг
    умента, после чего повторите выполнение команды.
    C:\PS\script.ps1:34 знак:12
    + Set-ADUser $adname -Replace @{department = $department}
    + ~~~~~~~
    + CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика