Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Импорт из CSV в AD с помощью PowerShell

Ответить
Настройки темы
PowerShell - [решено] Импорт из CSV в AD с помощью PowerShell

Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: rox33
Дата: 04-07-2012
Добрый день!
Такая задача стоит:
Из файла .csv (составленного сторонним софтом) импортировать в ActiveDirectory изменения в списоке пользователей, заменяя устаревшую информацию (телефоны, должности) в AD. Новых юзверей создавать не надо. Только менять несоответствующую информацию.
Т.е. есть файл типа:
читать дальше »
displayName;mail;TelephoneNumber;mobile;homephone
Иван Иваныч;ivan.ivanich@test.ru;135;8(921)555-55-55;302

В AD есть пользователь Иван Иваныч, с неправильным или пустым email, телефоном и т.п.
Нужно, чтобы программа меняла данные в AD, при несовпадении с данными из csv.

Долго бьюсь, читал много в интернетах - пока что не получается. Пробовал
вот эту тему , подправим под себя (как умел), не помогло.
Может кто готовое решение показать?

Отправлено: 17:57, 03-07-2012

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
foreach ($user in $users)
{
	$objuser = ([adsisearcher]"(mail=$($user.mail))").FindOne().GetDirectoryEntry()
	$props | Foreach {
		$prop = $_.ToLower()
		$log = New-Object Text.StringBuilder
		$oldprop = $objuser.InvokeGet($prop)
		if ($user.$prop -ne $oldprop)
		{
			$objuser.Put("$prop",$user.$prop)
			$text = "{0} : old {1} new {2} - {3}" -f $objuser.name[0],$oldprop,$user.$prop,(Get-Date)
			$log.AppendLine($text) | Out-Null
		}
	}
	try {
		$objuser.SetInfo()
		$log.ToString() | Out-File result.txt -Append
	}
	catch {
		$_
	}
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:10, 06-07-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, проблема только в том, что result.txt пустой.
Хотя в АД точно данные менялись из csv.

Вот с такой ошибкой выбивает:
читать дальше »
Цитата:
Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:6 знак:79
+ $objuser = ([adsisearcher]"(mail=$($user.mail))").FindOne().GetDirectoryEntry <<<< ()
+ CategoryInfo : InvalidOperation: (GetDirectoryEntry:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:10 знак:32
+ $oldprop = $objuser.InvokeGet <<<< ($prop)
+ CategoryInfo : InvalidOperation: (InvokeGet:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:13 знак:16
+ $objuser.Put <<<< ("$prop",$user.$prop)
+ CategoryInfo : InvalidOperation: (Put:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
C:\modlog.ps1:14 знак:59
+ $text = "{0} : old {1} new {2} - {3}" -f $objuser.name[ <<<< 0],$oldprop,$user.$prop,(Get-Date)
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:10 знак:32
+ $oldprop = $objuser.InvokeGet <<<< ($prop)
+ CategoryInfo : InvalidOperation: (InvokeGet:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:13 знак:16
+ $objuser.Put <<<< ("$prop",$user.$prop)
+ CategoryInfo : InvalidOperation: (Put:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
C:\modlog.ps1:14 знак:59
+ $text = "{0} : old {1} new {2} - {3}" -f $objuser.name[ <<<< 0],$oldprop,$user.$prop,(Get-Date)
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:10 знак:32
+ $oldprop = $objuser.InvokeGet <<<< ($prop)
+ CategoryInfo : InvalidOperation: (InvokeGet:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:13 знак:16
+ $objuser.Put <<<< ("$prop",$user.$prop)
+ CategoryInfo : InvalidOperation: (Put:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
C:\modlog.ps1:14 знак:59
+ $text = "{0} : old {1} new {2} - {3}" -f $objuser.name[ <<<< 0],$oldprop,$user.$prop,(Get-Date)
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:10 знак:32
+ $oldprop = $objuser.InvokeGet <<<< ($prop)
+ CategoryInfo : InvalidOperation: (InvokeGet:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:13 знак:16
+ $objuser.Put <<<< ("$prop",$user.$prop)
+ CategoryInfo : InvalidOperation: (Put:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Не удается индексировать в массив NULL.
C:\modlog.ps1:14 знак:59
+ $text = "{0} : old {1} new {2} - {3}" -f $objuser.name[ <<<< 0],$oldprop,$user.$prop,(Get-Date)
+ CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:10 знак:32
+ $oldprop = $objuser.InvokeGet <<<< ($prop)
+ CategoryInfo : InvalidOperation: (InvokeGet:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Нельзя вызвать метод для выражения со значением NULL.
C:\modlog.ps1:13 знак:16
+ $objuser.Put <<<< ("$prop",$user.$prop)
+ CategoryInfo : InvalidOperation: (Put:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Последний раз редактировалось rox33, 12-07-2012 в 13:08.


Отправлено: 16:50, 11-07-2012 | #12


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Таки всё равно 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


Как же всё-таки избавится от этой проблемы?

Последний раз редактировалось rox33, 19-07-2012 в 13:41.


Отправлено: 13:35, 19-07-2012 | #13


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


1. Конкретно в каких строках?
2. Добавить проверку if ($log.ToString()) - имеет не пустое значение.

"скрипт выдаёт миллион ошибок и запарывается на первой же пропущенной строке. " - откуда же миллион ошибок,раз все по вашим словам стопорится на первой строке? ))
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:12, 19-07-2012 | #14


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


2 Kazun:
Ошибки выдаёт и в саму АД ничего не пишет. Т.е. отрабатывает с ошибками, АД при этом не меняя.

Отправлено: 15:04, 19-07-2012 | #15


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Да, и ещё - по какой-то причине, при попытке изменить из большого csv файла (порядка 150 строк) он частенько меняет e-mail у сотрудников.
Видимо где-то он видит знак конца строки и вписывает данные, следующего в списке сотрудника, предыдущему сотруднику.
Получается ПОЛНЫЙ бардак.
Судя по всему происходит это когда он находит в списке сотрудника, которого НЕТ в AD. Можно ли это исправить?

Отправлено: 16:19, 19-07-2012 | #16


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Изменить немного на:
Код: Выделить весь код
Try {
		$objuser = ([adsisearcher]"(mail=$($user.mail))").FindOne().GetDirectoryEntry()
	}
	catch {
		continue
	}
Еще раз в какой строке ошибка?
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:55, 19-07-2012 | #17


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Заработало, спасибо огромное!
И на последок 2 вопроса:
1. как ошибки вставить в файл result.txt (или error.txt, не обязательно в 1 файл вести запись всех событий работы скрипта, можно в 2)
2. как более красиво писать лог, без пропуска строк? (если сложно - не надо).

Спасибо ещё раз огромное!

Отправлено: 18:12, 19-07-2012 | #18


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


1. В блок catch вставьте нужное логирование
2. Сделать проверку if ($log.ToString()) - что значения является не пустым и заменить AppendLine на Append

Последний раз редактировалось Kazun, 19-07-2012 в 18:39.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:30, 19-07-2012 | #19


Новый участник


Сообщения: 29
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всё сработало, но опять вопрос =(
Как наладить работу скрипта в случае, если в 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 записывает изменения только если менялась должность. Телефоны, компанию - не записывает. В чём может быть дело?

Последний раз редактировалось rox33, 20-07-2012 в 12:47.


Отправлено: 12:19, 20-07-2012 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Импорт из CSV в AD с помощью PowerShell

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход