|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Импорт из CSV в AD с помощью PowerShell |
|
|
PowerShell - [решено] Импорт из CSV в AD с помощью PowerShell
|
Новый участник Сообщения: 29 |
Добрый день!
Такая задача стоит: Из файла .csv (составленного сторонним софтом) импортировать в ActiveDirectory изменения в списоке пользователей, заменяя устаревшую информацию (телефоны, должности) в AD. Новых юзверей создавать не надо. Только менять несоответствующую информацию. Т.е. есть файл типа: В AD есть пользователь Иван Иваныч, с неправильным или пустым email, телефоном и т.п. Нужно, чтобы программа меняла данные в AD, при несовпадении с данными из csv. Долго бьюсь, читал много в интернетах - пока что не получается. Пробовал вот эту тему , подправим под себя (как умел), не помогло. Может кто готовое решение показать? |
|
Отправлено: 17:57, 03-07-2012 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать $users = Import-Csv users.csv -Delimiter ";" $props = $users | Get-Member -MemberType NoteProperty | Select -Expand Name foreach ($user in $users) { $objuser = ([adsisearcher]"(displayname=$($user.displayName))").FindOne().GetDirectoryEntry() $props | Foreach { $prop = $_.ToLower() if ($user.$prop -ne $objuser.InvokeGet($prop)) { $objuser.Put("$prop",$user.$prop) } } $objuser.SetInfo() } |
Отправлено: 22:00, 03-07-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Спасибо огромное за скрипт. Всё заработало (была ошибка - разобрался - дело было в csv, пропущено поле).
Вопрос теперь вот какой,сработает ли скрипт, если в csv будет 700 пользователей? (на 5-10 пробовал - всё ок, разницы никакой по-идее, но всё же...) Можно ли сделать, чтобы он, как критерий отбора, выбирал не displayName, а Mail? (т.е. выбирал по полю email и если оно совпадает с полем email в списке - менял всю несоответствующую информацию). И ещё такой вопрос, если будут пустые поля, будет ли отрабатывать скрипт дальше, или будет останавливаться и дальше юзверя с ошибкой не пойдёт? так? |
Последний раз редактировалось rox33, 04-07-2012 в 10:40. Отправлено: 10:23, 04-07-2012 | #3 |
Старожил Сообщения: 280
|
Профиль | Отправить PM | Цитировать Вот смотри.
Add-PSSnapin Quest.ActiveRoles.ADManagement # Импортируем пользователей из csv файла, где разделителем является ";" $userCSV=import-csv -Path d:\user.csv -Delimiter ";" #$userCSV # Импортируем пользователей из АД $userAD = Get-QADUser -SizeLimit 0 -SearchRoot test.ru/OU #$userAD #сравниваем Пользователей из АД с пользователями в csv файле по свойству Email и выбираем пользователей которых надо добавить в АД $compare = Compare-Object -ReferenceObject $userAD -DifferenceObject $userCSV -Property Email | Where-Object {$_.SideIndicator -eq "=>"} $compare #Проверяем что есть пользователи которых надо добавить if ($compare.Count -ge '1' ) { foreach ($usercompare in $compare) { $user = $userCSV| Where-Object {$_.Email -match $usercompare.email} $user #Добавляем пользователей New-QADUser -name $user.name -DisplayName DisplayName -UserPassword $user.Password -email $user.email -MobilePhone $user.MobilePhone -Description $user.Description -ParentContainer test.ru/OU -WhatIf } } else { 'Новых пользователей нет' } - в csv файлк поле EmailAddress изменил на Email - для работы с AD исползуется модуль ActiveRoles Management Shell for Active Directory. Его надо сначало скачать и подключается он второй строчкой Add-PSSnapin Quest.ActiveRoles.ADManagement. - оставил закоменченные строки с отображением всех перменных. Для просмотра прото раскомменть их. - в строчке New-QADUser.... для создания пользователей убери -WhatIf - тут только для новых пользователей. Если надо и для редактирования существующих то надо изменить "Where-Object {$_.SideIndicator -eq "=>"}" на "Where-Object {$_.SideIndicator -eq "=="}" и вместо New-QADUser использовать Set-QADUser -Identity $user.email -DisplayName $user.DisplayName -UserPassword $user.Password -Description $user.Description -MobilePhone $user.MobilePhone . В принципе это можно реализовать все в одном скрипте. |
Последний раз редактировалось Molchune, 04-07-2012 в 12:06. Отправлено: 11:47, 04-07-2012 | #4 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать 2 Molchune
Спасибо! Есть вопрос по скрипту: Если в списке не будет пароля у существующего пользователя - что произойдёт? Добавлю в csv поле Password, но нужно ли заполнять его у всех юзверей (в принципе это тот же вопрос ![]() Цитата:
ЗЫ проверил работу скрипта - пользователей создаёт (не совсем корректно - но это моя ошибка, наверное). А вот данные при несоответствии - не меняет. Например не поменял телефон (telephonenumber). А мне бы нужно именно замена данных пользователей (телефоны, должности и т.п.) с определением пользователя по mail'у. Создание это уже плюшка, но не обязательная ![]() Ещё раз спасибо! ЗЫЫ после вашего скрипта перестал работать скрипт от Kazun'a Ошибка вот такая: Дальше больше. Возможно ли, чтобы Ваш скрипт поменял имена в AD? Внешне - они не изменились... ЗЫЫЫ Разобрался, Ваш скрипт поменял displayname у большинства пользователей. Со сдвигом по списку. Буду разбираться дальше. Скорее всего дело в лишней ; |
||
Последний раз редактировалось rox33, 04-07-2012 в 13:51. Отправлено: 12:25, 04-07-2012 | #5 |
Старожил Сообщения: 280
|
Профиль | Отправить PM | Цитировать Он только добавляет новых.
Если пользователь был, то он его не трогает. Я просто изначально не правильно понял, думал надо сравнить списки из csv и AD и добавить новые. Если надо изменить инфу уже существующих. То вот так вот. (в принципе это же и прошлый скрипт просто изменены условия) и не создается пользователь а обнвляются параметры. Add-PSSnapin Quest.ActiveRoles.ADManagement $userCSV=import-csv -Path d:\user.csv -Delimiter ";" $userAD = Get-QADUser -SizeLimit 0 -SearchRoot test.ru/OU $compare = Compare-Object -ReferenceObject $userAD -DifferenceObject $userCSV -Property Email | Where-Object {$_.SideIndicator -eq "=="} foreach ($usercompare in $compare) { $user = $userCSV| Where-Object {$_.Email -match $usercompare.email} Set-QADUser -Identity $user.email -DisplayName $user.displayname -UserPassword $user.Password -MobilePhone $user.MobilePhone -Description $user.Description -WhatIf } Цитата rox33:
В случае обновления пользователя просто сбросит пасс. Цитата rox33:
А csv открыть в Exel то можно? и там будет отлично видно что куда могло уехать. |
||
Последний раз редактировалось Molchune, 04-07-2012 в 14:32. Отправлено: 14:22, 04-07-2012 | #6 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать 2 Molchune
Скрипт всё равно пригодится ![]() ![]() В excel открыть сложно ![]() В общем, сейчас всё попробую. Спасибо всем отписавшимся огромнейшее ! ![]() |
Последний раз редактировалось rox33, 04-07-2012 в 18:10. Отправлено: 14:43, 04-07-2012 | #7 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Попробовал.
На QAD скрипт выдаёт такое: Я так понимаю, что он не может считать параметр, который подставляет в Identity. Почему - загадка. Вот CSV: Список перепроверял миллион раз - не понимаю. На скрипт, который дал Kazun - всё срабатывает, с изменением на такой скрипт: Правда выдаёт ошибку, но делает. Ошибка такая: Осталось провести более масштабную проверку (до этого проверял на 4-7 пользователях на тестовой машине). Завтра попробую развернуть на большую - посмотрим, что получится. |
Последний раз редактировалось rox33, 04-07-2012 в 18:16. Отправлено: 18:10, 04-07-2012 | #8 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать Имена свойств в CSV файле должны быть,такими же,как и аттрибуты в AD(Email должен быть mail). Ограничения на количество пользователей нет в худшем случае упрется в производительность.При возникновении ошибки у конкретного пользователя,скрипт не прерывает своей работы.Можно добавить проверку на пустое свойство в CSV:
|
Отправлено: 20:39, 04-07-2012 | #9 |
Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать были ошибки:
Разобался - были поля Name и sn, которые по сути - одно и тоже. Убрал Name - всё заработало. Такой вопрос ещё, возможно ли добавить к скрипту логирование? Что перезаписал скрипт, что нет. Со временем, если можно. |
Последний раз редактировалось rox33, 05-07-2012 в 13:20. Отправлено: 12:30, 05-07-2012 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
MySQL - Импорт XML в SQL | u_ku_shu | Программирование и базы данных | 8 | 22-07-2012 17:47 | |
PowerShell - PowerShell | bort-747 | Скриптовые языки администрирования Windows | 0 | 10-04-2012 11:29 | |
PowerShell - Импорт пользователей с помощью POwerShell и CSV файла. | Temafet | Скриптовые языки администрирования Windows | 19 | 18-01-2012 16:45 | |
Система - Windows PowerShell | shoot | Программное обеспечение Windows | 13 | 27-11-2011 02:23 | |
Разное - PowerShell | Butunin Klim | Программирование и базы данных | 1 | 31-07-2008 18:39 |
|