Импорт из CSV в AD с помощью PowerShell
Добрый день!
Такая задача стоит: Из файла .csv (составленного сторонним софтом) импортировать в ActiveDirectory изменения в списоке пользователей, заменяя устаревшую информацию (телефоны, должности) в AD. Новых юзверей создавать не надо. Только менять несоответствующую информацию. Т.е. есть файл типа: В AD есть пользователь Иван Иваныч, с неправильным или пустым email, телефоном и т.п. Нужно, чтобы программа меняла данные в AD, при несовпадении с данными из csv. Долго бьюсь, читал много в интернетах - пока что не получается. Пробовал вот эту тему , подправим под себя (как умел), не помогло. Может кто готовое решение показать? |
Код:
$users = Import-Csv users.csv -Delimiter ";" |
Спасибо огромное за скрипт. Всё заработало (была ошибка - разобрался - дело было в csv, пропущено поле).
Вопрос теперь вот какой,сработает ли скрипт, если в csv будет 700 пользователей? (на 5-10 пробовал - всё ок, разницы никакой по-идее, но всё же...) Можно ли сделать, чтобы он, как критерий отбора, выбирал не displayName, а Mail? (т.е. выбирал по полю email и если оно совпадает с полем email в списке - менял всю несоответствующую информацию). И ещё такой вопрос, если будут пустые поля, будет ли отрабатывать скрипт дальше, или будет останавливаться и дальше юзверя с ошибкой не пойдёт? так? |
Вот смотри.
Код:
Add-PSSnapin Quest.ActiveRoles.ADManagement - в 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 . В принципе это можно реализовать все в одном скрипте. |
2 Molchune
Спасибо! Есть вопрос по скрипту: Если в списке не будет пароля у существующего пользователя - что произойдёт? Добавлю в csv поле Password, но нужно ли заполнять его у всех юзверей (в принципе это тот же вопрос ;) )? Цитата:
ЗЫ проверил работу скрипта - пользователей создаёт (не совсем корректно - но это моя ошибка, наверное). А вот данные при несоответствии - не меняет. Например не поменял телефон (telephonenumber). А мне бы нужно именно замена данных пользователей (телефоны, должности и т.п.) с определением пользователя по mail'у. Создание это уже плюшка, но не обязательная ;) Ещё раз спасибо! ЗЫЫ после вашего скрипта перестал работать скрипт от Kazun'a Ошибка вот такая: Дальше больше. Возможно ли, чтобы Ваш скрипт поменял имена в AD? Внешне - они не изменились... ЗЫЫЫ Разобрался, Ваш скрипт поменял displayname у большинства пользователей. Со сдвигом по списку. Буду разбираться дальше. Скорее всего дело в лишней ; |
Он только добавляет новых.
Если пользователь был, то он его не трогает. Я просто изначально не правильно понял, думал надо сравнить списки из csv и AD и добавить новые. Если надо изменить инфу уже существующих. То вот так вот. (в принципе это же и прошлый скрипт просто изменены условия) и не создается пользователь а обнвляются параметры. Код:
Цитата:
В случае обновления пользователя просто сбросит пасс. Цитата:
А csv открыть в Exel то можно? и там будет отлично видно что куда могло уехать. |
2 Molchune
Скрипт всё равно пригодится;) создание пользователей в планах ;) В excel открыть сложно;) автономный сервер, пока офис туда ставить не хотел, когда буду тестить перед боевой машиной - попробую. В общем, сейчас всё попробую. Спасибо всем отписавшимся огромнейшее ! =) |
Попробовал.
На QAD скрипт выдаёт такое: Я так понимаю, что он не может считать параметр, который подставляет в Identity. Почему - загадка. Вот CSV: Список перепроверял миллион раз - не понимаю. На скрипт, который дал Kazun - всё срабатывает, с изменением на такой скрипт: Правда выдаёт ошибку, но делает. Ошибка такая: Осталось провести более масштабную проверку (до этого проверял на 4-7 пользователях на тестовой машине). Завтра попробую развернуть на большую - посмотрим, что получится. |
Имена свойств в CSV файле должны быть,такими же,как и аттрибуты в AD(Email должен быть mail). Ограничения на количество пользователей нет в худшем случае упрется в производительность.При возникновении ошибки у конкретного пользователя,скрипт не прерывает своей работы.Можно добавить проверку на пустое свойство в CSV:
Код:
$user.$prop -ne $objuser.InvokeGet($prop)) -and $user.$prop |
были ошибки:
Разобался - были поля Name и sn, которые по сути - одно и тоже. Убрал Name - всё заработало. Такой вопрос ещё, возможно ли добавить к скрипту логирование? Что перезаписал скрипт, что нет. Со временем, если можно. |
Код:
foreach ($user in $users) |
Спасибо, проблема только в том, что result.txt пустой.
Хотя в АД точно данные менялись из csv. Вот с такой ошибкой выбивает: |
Таки всё равно 2 вопроса:
1. При наличии пустых строк в csv файле (например, у пользователя нет мобильного телефона и в csv получается что-то вроде test.test@test.ru;;;company;1) - скрипт выдаёт миллион ошибок и запарывается на первой же пропущенной строке. 2. Логирование работает, но перестаёт, как только видит пустые строки (опять!;) ), и если по какому-то пользователю он ничего не менял он оставляет знак начала новой строки, т.е. резалт.тхт выглядит так: Test: old %% new ** - 19.07.2012 13:34:00 User: old ** new && - 19.07.2012 13:34:01 Как же всё-таки избавится от этой проблемы? |
1. Конкретно в каких строках?
2. Добавить проверку if ($log.ToString()) - имеет не пустое значение. "скрипт выдаёт миллион ошибок и запарывается на первой же пропущенной строке. " - откуда же миллион ошибок,раз все по вашим словам стопорится на первой строке? =))) |
2 Kazun:
Ошибки выдаёт и в саму АД ничего не пишет. Т.е. отрабатывает с ошибками, АД при этом не меняя. |
Да, и ещё - по какой-то причине, при попытке изменить из большого csv файла (порядка 150 строк) он частенько меняет e-mail у сотрудников.
Видимо где-то он видит знак конца строки и вписывает данные, следующего в списке сотрудника, предыдущему сотруднику. Получается ПОЛНЫЙ бардак. Судя по всему происходит это когда он находит в списке сотрудника, которого НЕТ в AD. Можно ли это исправить? |
Изменить немного на:
Код:
Try { |
Заработало, спасибо огромное!
И на последок 2 вопроса: 1. как ошибки вставить в файл result.txt (или error.txt, не обязательно в 1 файл вести запись всех событий работы скрипта, можно в 2) 2. как более красиво писать лог, без пропуска строк? (если сложно - не надо). Спасибо ещё раз огромное! |
1. В блок catch вставьте нужное логирование
2. Сделать проверку if ($log.ToString()) - что значения является не пустым и заменить AppendLine на Append |
Всё сработало, но опять вопрос =(
Как наладить работу скрипта в случае, если в csv файле есть пустые ячейки, например: mail;company;title;phone;mobile;displayname test@test.ru;test;tester;;;tester При наличии пропусков (нет телефона, должность не указана, отдела (в моём ксв несколько больше полей, чем я тут привёл) - ксв не отрабатывает (в АД замену значений не производит). Нашел ваш совет, вставить в код: $user.$prop -ne $objuser.InvokeGet($prop)) -and $user.$prop Для проверки на пустое свойство в CSV. Я туповат и не понимаю куда в код с логом это вставить =( в строку $oldprop = $objuser.InvokeGet($prop) Так: $oldprop = ($objuser.InvokeGet($prop) - and $user.$prop) ? И ещё result.txt записывает изменения только если менялась должность. Телефоны, компанию - не записывает. В чём может быть дело? |
Приведите результат скрипта с тестовым пользователем.
|
Код:
Исключеие при вызове "SetInfo" с "0" аргументами: "Для службы каталогов указан недопустимый синтаксис атрибута." csv: |
Код:
$users = Import-Csv c:\list10.csv -Delimiter ";" |
Всё, теперь код, под мои условия, - ИДЕАЛЕН!!!
ОГРОМНОЕ СПАСИБО! |
Время: 02:31. |
Время: 02:31.
© OSzone.net 2001-