![]() |
Ошибки в Powershell при создании пользователей
Что я делаю не так?
Взял скрипт отсюда http://www.howtogeek.com/50187/how-t...th-powershell/ тупо скопировал его поменял домен $objOU=[ADSI]“LDAP://OU=abc,DC=contoso,DC=com” $dataSource=import-csv “users.csv” foreach($dataRecord in $datasource) { $cn=$dataRecord.FirstName + ” ” + $dataRecord.LastName $sAMAccountName=$dataRecord.FirstName + “.” + $dataRecord.LastName $givenName=$dataRecord.FirstName $sn=$dataRecord.LastName $sAMAccountName=$sAMAccountName.ToLower() $displayName=$sn + “, ” + $givenName $userPrincipalName=$sAMAccountName + “@contoso.com” $objUser=$objOU.Create(“user”,”CN=”+$cn) $objUser.Put(“sAMAccountName”,$sAMAccountName) $objUser.Put(“userPrincipalName”,$userPrincipalName) $objUser.Put(“displayName”,$displayName) $objUser.Put(“givenName”,$givenName) $objUser.Put(“sn”,$sn) $objUser.SetInfo() $objUser.SetPassword(“P@assw0rd”) $objUser.psbase.InvokeSet(“AccountDisabled”,$false) $objUser.SetInfo() } так выглядит csv FirstName;LastName Avis;Flamm Kurt;Pharris В результате получаю кучу ошибок Исключение при вызове "Create" с "2" аргументами: "Был передан недопустимый путь службы каталогов " C:\ADscripts\testscript.ps1:11 знак:23 + $objUser=$objOU.Create <<<< (“user”,”CN=”+$cn) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))" C:\ADscripts\testscript.ps1:15 знак:13 + $objUser.Put <<<< (“givenName”,$givenName) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))" C:\ADscripts\testscript.ps1:16 знак:13 + $objUser.Put <<<< (“sn”,$sn) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)" C:\ADscripts\testscript.ps1:17 знак:17 + $objUser.SetInfo <<<< () + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "SetPassword" с "1" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)" C:\ADscripts\testscript.ps1:18 знак:21 + $objUser.SetPassword <<<< (“P@assw0rd”) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "InvokeSet" с "2" аргументами: "Свойства службы каталогов не могут быть найдены в кэше. " C:\ADscripts\testscript.ps1:19 знак:26 + $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodTargetInvocation Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)" C:\ADscripts\testscript.ps1:20 знак:17 + $objUser.SetInfo <<<< () + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "Create" с "2" аргументами: "Был передан недопустимый путь службы каталогов " C:\ADscripts\testscript.ps1:11 знак:23 + $objUser=$objOU.Create <<<< (“user”,”CN=”+$cn) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))" C:\ADscripts\testscript.ps1:15 знак:13 + $objUser.Put <<<< (“givenName”,$givenName) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))" C:\ADscripts\testscript.ps1:16 знак:13 + $objUser.Put <<<< (“sn”,$sn) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)" C:\ADscripts\testscript.ps1:17 знак:17 + $objUser.SetInfo <<<< () + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "SetPassword" с "1" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)" C:\ADscripts\testscript.ps1:18 знак:21 + $objUser.SetPassword <<<< (“P@assw0rd”) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI Исключение при вызове "InvokeSet" с "2" аргументами: "Свойства службы каталогов не могут быть найдены в кэше. " C:\ADscripts\testscript.ps1:19 знак:26 + $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false) + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodTargetInvocation Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)" C:\ADscripts\testscript.ps1:20 знак:17 + $objUser.SetInfo <<<< () + CategoryInfo : NotSpecified: ( [], MethodInvocationException + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI |
Надо указать разделитель в команде Import-CSv - Import-Csv users.csv -Delimiter ";"
|
Помогло. Спасибо.
Тогда второй вопрос по кодировкам. Excel автоматически сохраняет в ANSI. А powershell у меня ANSI не понимает, слова на русском не записывает. Только если ставить UTF-8 то тогда все OK. Но csv в UTF-8 уже не понимает excel. Есть какое-нибудь решение этой проблемы? |
$dataSource = Get-Content users.csv | ConvertFrom-Csv -Delimiter ";"
|
Спасибо! Все заработало. Но появилась следующая проблема. Если у меня какой-то из атрибутов пустой, не вбит в таблице excel то появляется ошибка "Для службы каталогов указан недопустимый синтаксис атрибута" и объект не создается. Можно как-нибудь прописать что если у меня атрибут не вбит что-бы он его и не создавал?
|
Baggurd
Дружище, извини, что вмешиваюсь в вашу беседу, просто хочу поделиться с тобой, да и с другими кому будет интересно. Я тут давеча скрипт для создание пользователей через модуль Active Directory в PowerShell состряпал. Посмотри может быть будет полезен. Файл .csv .Разделение между параметрами ";", сохранён в utf8, можно и в utf16 содержимое файла: Цитата:
Цитата:
|
Baggurd
Сделать условие,что переменная определена и имеет значение,и только потом присваивать параметр. |
ratibor79, Проблема в том что module active directory есть только на windows 2008 r2 и windows 7.
Kazun, А где бы посмотреть синтаксис? |
Вложений: 1
Baggurd
Попробуй другой вариант. Скрипт испытан, работает. Единственно в нем вместо ";" используется "`t" - табуляция (при желании можно изменить). В архиве также и прилагается к нему файл из которого экспортируются данные. Посмотри, если не нравиться табуляция замени на ";" Да ещё если не пойдёт, то в скрипте замени $OU на $objOU, а $u на $objUser Но по идее должно работать и так |
ratibor79, К сожалению до 16 января попробовать ничего не смогу. Но мне почему-то кажется что этот скрипт примерно такой-же как и мой и если в каком-нибудь поле (например description) ничего не вбить он точно также выдаст ошибку. Вроде бы проще использовать командлеты от Quest. Не знаю есть ли там те же проблемы, попробую как приеду.
|
ratibor79, Попробовал твой скрипт. Та же проблема. Если какое-нибудь поле пустое то не создается этот пользователь. Может быть кто-нибудь знает решение проблемы с примером?
|
Решил пойти другим путем используя командлеты от Quest.
Установил Quest отсюда http://www.quest.com/powershell/activeroles-server.aspx дальше пишем Add-PSSnapin quest.ActiveRoles.admanagement Написал скрипт Get-Content "c:\ADscripts\Создание пользователей.csv" | ConvertFrom-csv -Delimiter ";" | ForEach-Object {New-QADUser -name $_.cn -sam $_.sAMAcountName -FirstName $_.Имя -LastName $_.Фамилия -org $_.OU -password $_.password -Office $_.Комната -PhoneNumber $_.Телефон -StreetAddress $_.Улица -City $_.Город -Fax $_.Факс -Title $_.Должность -Department $_.Отдел -Company $_.Организация -DisplayName $_.cn -UserPrincipalName ($_.sAMAcountName + "@contoso.com") -Email ($_.sAMAcountName + "@contoso.com") |Set-QADUser -userMustChangePassword $true} Все работает если запускать из powergui. Но ничего не работает если запускать из "выполнить с помощью powershell" Нашел два решения этой проблемы: 1-е если добавлять в скрипт Add-PSSnapin quest.ActiveRoles.admanagement в начало. Или в реестре правим на: [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\shell\Выполнить с помощью PowerShell\command] C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-ImportSystemModules" "-file" "%1\" Но оба этих решения сильно замедляют выполнение скрипта. Может быть есть еще какие-нибудь? Кто-нибудь сталкивался? |
Добрый день, решил новые темы не пладить и развить эту. Аналогичная ошибка при попытке создать пользователя. Подскажите как решить.
Код:
$objADSI=[ADSI]"LDAP://DC=contoso,DC=com" Сам csv Код:
OU,cn,sAMAccountName,firstName,LastName |
У Вас всегда в файле csv только один пользователь?
1) $dataSource=import-csv "newusers.csv" - зачем два раза? 2) Почему бы не сделать проверку прежде,чем создать OU? 3) $OU=$dataRecord.OU - выполнится,только при условии,что ТОЛЬКО 1 пользователь в csv файле? Я бы вообще бы выкинул: Код:
} |
Пользователь конечно не один. И не одно OU будет.
1) При создании пользователя, необходимо подключиться к только что созданному OU. при включении ссылки $objOU в "LDAP://OU=$objOU, то есть на только что созданную OU... вобщем пока еще раз ее не добавил, $objOU не имелл ссылки на созданное OU и выдавал ошибку. 2)Согласен. Подскажите как? У меня была проблема, когда цикл проходил по второму пользователю, у него было уже создано OU, соответственно выдавал ошибку, что объект уже создан. Решил, забить на эту ошибку, т.к. незнаю как написать проверку. 3) Нет, должен выполняться постоянно создавая новое OU и добовляя туда пользователей (если конечно, ранее не создан уже). Можно выкинуть, все что угодно, если подскажите как решить проблему :-) Создать OU, заполнить параметрами, в новое OU добавить пользователей, группы, у которых в csv параметр OU совподает с только что созданным OU. (вобщем разложить пользователей по OU и группам) |
Код:
Function Test-Exists($path) |
Wow! Спасибо, все получилось. Здорово.
А как интерпритировать вот эту конструкцию? LDAP://OU={0},{1}" |
-f является сокращением на [String]::Format - более подробно http://msdn.microsoft.com/ru-ru/libr...ng.format.aspx
{X} - является индексом и начинается с нуля Синтаксис - {index[,alignment][:formatString]} Код:
PS > "{0} + {1} = {2}" -f 2,3,5 |
Спасибо. Большое. Правда ничего не понял. Не силен в програмировании и скриптинге, надо будет серьезнее это изучить.
|
Время: 07:48. |
Время: 07:48.
© OSzone.net 2001-