Перед каждым системным администратором может встать проблема массового изменения атрибутов пользователей, например название компании или отдела. Когда пользователей не больше сотни, можно напрячься и сделать все вручную, но если пользователей больше сотни, то встает вопрос как все автоматизировать. Об этом и будет данная статься.
Данная статья является в какой то степени продолжении предыдущей.
Автоматизировать назначение нужных атрибутов я буду с помощью PowerShell-скрипта.
Для того, чтобы скрипт отработал, нужно подготовить нужные данные. Данные были предоставленны отделом кадров в виде Excel-файла. В файле были соответствующие столбцы со следующими данными: ФИО, Должность, Город, Отдел. В компании сотрудники работают по всей России, поэтому в качестве местоположения офиса, я решил использовать название города.
Столбцы я назвал следующим образом: displayname, title, physicalDeliveryOfficeName, department.
После этого сохранил текущий лист, как «CSV (разделители — запятые) (*.csv)» . Дальше этот файл открыл для проверки блокнотом, в теккте были одни кракозябры. Помня предыдущий опыт, понял, что такой текст считать не удастся. Начал экспериментировать, пришел к следующему решению:
- Сохраняю лист как «CSV (MS-DOS) (*.csv)«
- Открываю получившийся файл с помощью текстового редактора 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
}
Скрипт готов, можно запускать.
Спасибо! Очень помогло ))
Пожалуйста, всегда рад, когда мои статьи кому то помогают.
Добрый день подскажите если пользователи создана и нужно просто добавить всем атрибут телефоны — можно обойтись одной командой?
Добрый день.
В скрипте обрабатывается каждый пользователь в отдельности. Соответственно, если надо одному пользователю, то достаточно одной команды.
Добрый день.
Отличная статья!
А как можно изменить дополнительные атрибуты, созданные отдельно, нестандартные?
Если вас не затруднит, можете показать примерно как менять эти параметры:
-Name
-DisplayName
-EmailAddress
-OfficePhone
-Description
-Department
-Title
-Company
-City
-MobilePhone
-PhoneNumber
-Office
-StreetAddress
-OtherAttributes @{‘nISEDUKZIIN’=$iin;’nISEDUKZCLASS’=$class;’nISEDUKZALTEMAIL’=$email;’nISEDUKZROLE’=$role}
?
В AD, в свойствах учетной записи посморите как называется каждый атрибут и меняйте.
Доброго времени суток
Спасибо за статью!
Такой вопрос: Обязательно ли искать пользователей? Т.е. мне не нужно знать активен пользователь или нет, а просто изменить определенные атрибуты по списку. Могу ли я сделать подобным образом?
#Запускаем цикл и парсим каждую строчку
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
}
Доброго времени суток.
Необязательно.
Советую воспользоваться утилитой «Active Directory Bulk Operations». Программа позволяет пакетно создавать и редактировать учетные записи пользователей, а так же копировать учетные записи с сохранением членства в группах и полной иерархией организационных единиц в другой домен! Скачать можно тут: http://www.sysadminsoft.ru/active-directory-bulk-operations
Подскажите пожалуйста как запонить абрибут info (заметки) если можно пример
Спасибо
Пытался так Set-aduser -Identity ivanov info текст не получается
Например так
SET-ADUSER test123 –replace @{info=”Test Info”}
Добрый день подскажите как правильно выгрузить параметр manager.
При таком запросе Get-ADUser -identity user1 -Properties manager | select manager, выдает
CN=Иванов Иван Иванович,OU=Отдел,DC=TEST,DC=LOCAL, а хочется получить только ИВАНОВ ИВАН ИВАНОВИЧ
Стоило бы упомянуть, что переименование пользователя можно сделать с помощью:
get-aduser UserName | Rename-ADObject -NewName «Новое имя пользователя»
Подскажите пожалуйста, как в поле атрибута добавить значение. Если сейчас в атрибуте записано «кролик», то как сделать «большой кролик». Пример напишите плиз 🙂 командой -add не получилось, т.к. значение не пустое, а полностью заменять значение атрибута не нужно, т.к. переборе массива необходимо на каждую учетную запись в атрибуте будет добавить текст, в нашем случае слово «большой «, т.ж. Прошу уточнить как добавить значение до и после имеющегося текста в атрибуте и можно ли очистить имеющиеся пробелы» » в поле атрибута. Спасибо 🙂
Воспользуйтесь командой с параметром replace
SET-ADUSER test123 –replace @{info=”Test Info”}
А в поле подставляйте переменную, которую заранее сформируете исходя из ваших условий
-replace заменяет все данные в поле, а как их дополнить не удаляя текущие?
Я же написал, что формируете переменную, значение которой потом вставляете в поле.
Т.е. считали в переменную текущее значение поле, в переменной в зависимости от условий добавили, удалили, модифицировали значение. Потом новое значение вставили в поле.
Спасибо за скрипт
Пытаюсь изменить атрибут Description, возникает ошибка. Подскажите пож-та как исправить.
Set-ADUser : Не удается проверить аргумент для параметра «Identity». Аргумент и
меет значение NULL. Укажите аргумент, не имеющий значение NULL, после чего повт
орите выполнение команды.
Вы неверно передаете атрибут identity.
строка:15 знак:11
Set-ADUser $adname -Replace @{description = $descriptionname}
CategoryInfo : InvalidData: (:) [Set-ADUser], ParameterBindingV
alidationException
FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Activ
eDirectory.Management.Commands.SetADUser
Спасибо!
Алексей, добрый день. Подскажите как скорректировать ваш скрипт, чтоб не изменял поля, а просто аудит учеток на предмет неправильного заполнения полей или пустых полей и вывод в csv файл
Спасибо
Добрый день.
Я бы брал атрибуты и сравнивал их с нужным параметром.
Добрый день!
Подскажите, а можно ли скриптом править вкладку СРЕДА в АД для нескольких УЗ, чтоб не влазить в каждую?!
Здравствуйте.
А на английском языке можно название вкладки? Если там изменяемые параметры, то можно.
Добрый день!
Как дописать Ваш скрипт, чтобы он искал учетки в ад по displayname и если учетка не найдена завершал работу при этом выводя сообщение что, например, пользователь » Иванов Александр Сергеевич» не найден, а если найден писал соответственно, что пользователь найден и продолжил заполнение атрибутов.
Здравствуйте.
Вы хотите, чтобы за вас написали скрипт?
Добрый день! При запуске скрипта сообщается об ошибке.
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
Помогите пожалуйста, может что то не так я прописал
Добрый день! При запуске скрипта возникает ошибка, помогите пожалуйся разобраться.
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
поставьте после присвоения переменной
$dplname = $user.displayname
вывод на экран значения. Возможно неверно подготовлен файл CSV
Спасибо! Помогло!