Войти

Показать полную графическую версию : Ошибки в Powershell при создании пользователей


Baggurd
29-12-2011, 13:34
Что я делаю не так?
Взял скрипт отсюда http://www.howtogeek.com/50187/how-to-create-multiple-users-in-server-2008-with-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

Kazun
29-12-2011, 14:59
Надо указать разделитель в команде Import-CSv - Import-Csv users.csv -Delimiter ";"

Baggurd
29-12-2011, 16:40
Помогло. Спасибо.

Тогда второй вопрос по кодировкам. Excel автоматически сохраняет в ANSI. А powershell у меня ANSI не понимает, слова на русском не записывает. Только если ставить UTF-8 то тогда все OK. Но csv в UTF-8 уже не понимает excel. Есть какое-нибудь решение этой проблемы?

Kazun
29-12-2011, 17:47
$dataSource = Get-Content users.csv | ConvertFrom-Csv -Delimiter ";"

Baggurd
30-12-2011, 10:48
Спасибо! Все заработало. Но появилась следующая проблема. Если у меня какой-то из атрибутов пустой, не вбит в таблице excel то появляется ошибка "Для службы каталогов указан недопустимый синтаксис атрибута" и объект не создается. Можно как-нибудь прописать что если у меня атрибут не вбит что-бы он его и не создавал?

ratibor79
30-12-2011, 11:14
Baggurd
Дружище, извини, что вмешиваюсь в вашу беседу, просто хочу поделиться с тобой, да и с другими кому будет интересно. Я тут давеча скрипт для создание пользователей через модуль Active Directory в PowerShell состряпал. Посмотри может быть будет полезен.

Файл .csv .Разделение между параметрами ";", сохранён в utf8, можно и в utf16
содержимое файла:


LastName;FirstName;login;email;Title;Department;OfficePhone;MobilePhone;Company;Description
Иванов;Иван;i.ivanov;i.ivanov@xxx.kz;Начальник отдела продаж;Отдел продаж;255-55-55 *101;+7 777 1234567;XXX Company, Начальник отдела продаж
Чижов;Сергей;s.chizhov;s.chizhov@xxx.kz;Зам. Начальника отдела продаж;Отдел продаж;255-55-55 *102;+7 777 1234567;XXX Company;Зам. Начальника отдела продаж
Антонов;Антон;a.antonov;a.antonov@xxx.local;Старший сотрудник отдела продаж;Отдел продаж;255-55-55 *103;+7 777 1234567;XXX Company;Старший сотрудник отдела продаж


Содержимое файла .ps1


Import-Module ActiveDirectory
Import-Csv -Delimiter ";" -Path "C:\Users.csv" | Foreach {
New-ADUser -Name ($_.LastName +" "+ $_.FirstName) -GivenName $_.FirstName -Surname $_.LastName `
-DisplayName ($_.LastName +" "+ $_.FirstName) -SamAccountName $_.login -UserPrincipalName ($_.login + "@zzz.local") `
-Path 'OU=Accounts,DC=zzz,DC=local' -EmailAddress $_.email -Company $_.Company -Department $_.Department `
-Title $_.Title -Description $_.Description -OfficePhone $_.OfficePhone -MobilePhone $_.MobilePhone -Country KZ `
-Enabled $true -ChangePasswordAtLogon $true -AccountPassword (ConvertTo-SecureString -string "Passw0rd" -AsPlainText -Force)
}

Kazun
30-12-2011, 11:41
Baggurd
Сделать условие,что переменная определена и имеет значение,и только потом присваивать параметр.

Baggurd
30-12-2011, 20:51
ratibor79, Проблема в том что module active directory есть только на windows 2008 r2 и windows 7.
Kazun, А где бы посмотреть синтаксис?

ratibor79
30-12-2011, 21:15
Baggurd
Попробуй другой вариант. Скрипт испытан, работает. Единственно в нем вместо ";" используется "`t" - табуляция (при желании можно изменить). В архиве также и прилагается к нему файл из которого экспортируются данные. Посмотри, если не нравиться табуляция замени на ";"

Да ещё если не пойдёт, то в скрипте замени $OU на $objOU, а $u на $objUser
Но по идее должно работать и так

Baggurd
30-12-2011, 21:47
ratibor79, К сожалению до 16 января попробовать ничего не смогу. Но мне почему-то кажется что этот скрипт примерно такой-же как и мой и если в каком-нибудь поле (например description) ничего не вбить он точно также выдаст ошибку. Вроде бы проще использовать командлеты от Quest. Не знаю есть ли там те же проблемы, попробую как приеду.

Baggurd
17-01-2012, 14:14
ratibor79, Попробовал твой скрипт. Та же проблема. Если какое-нибудь поле пустое то не создается этот пользователь. Может быть кто-нибудь знает решение проблемы с примером?

Baggurd
19-01-2012, 14:07
Решил пойти другим путем используя командлеты от 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\"

Но оба этих решения сильно замедляют выполнение скрипта. Может быть есть еще какие-нибудь? Кто-нибудь сталкивался?

propsan
01-06-2012, 23:41
Добрый день, решил новые темы не пладить и развить эту. Аналогичная ошибка при попытке создать пользователя. Подскажите как решить.


$objADSI=[ADSI]"LDAP://DC=contoso,DC=com"
$dataSource=import-csv "newusers.csv"
foreach($dataRecord in $dataSource) {
$OU=$dataRecord.OU
$objOU=$objADSI.Create("organizationalUnit","OU="+$OU)
$objOU.SetInfo()
}

$dataSource=import-csv "newusers.csv"
$OU=$dataRecord.OU
$objADSI=[ADSI]"LDAP://OU=$OU,DC=contoso,DC=com"
foreach($dataRecord in $dataSource) {
$CN=$dataRecord.cn
$giveName=$dataRecord.firstName
$objUser=$objADSI.Create("user","CN="+$CN)
$objUser.Put("giveName",$giveName)
$objUser.SetInfo()
}



Сам csv

OU,cn,sAMAccountName,firstName,LastName
Отдел кадров,Александр Ивлев,alex.ivlev,ivlev,AL

Задача. Беря из CSV данные создать несколько OU и поместить вних пользователей(так же создав заново).

Kazun
02-06-2012, 13:09
У Вас всегда в файле csv только один пользователь?

1) $dataSource=import-csv "newusers.csv" - зачем два раза?
2) Почему бы не сделать проверку прежде,чем создать OU?
3) $OU=$dataRecord.OU - выполнится,только при условии,что ТОЛЬКО 1 пользователь в csv файле?

Я бы вообще бы выкинул:

}

$dataSource=import-csv "newusers.csv"
$OU=$dataRecord.OU
$objADSI=[ADSI]"LDAP://OU=$OU,DC=contoso,DC=com"
foreach($dataRecord in $dataSource) {

propsan
02-06-2012, 17:24
Пользователь конечно не один. И не одно OU будет.

1) При создании пользователя, необходимо подключиться к только что созданному OU. при включении ссылки $objOU
в "LDAP://OU=$objOU, то есть на только что созданную OU... вобщем пока еще раз ее не добавил, $objOU не имелл ссылки на созданное OU
и выдавал ошибку.
2)Согласен. Подскажите как? У меня была проблема, когда цикл проходил по второму пользователю, у него было уже создано OU, соответственно выдавал ошибку, что объект уже создан. Решил, забить на эту ошибку, т.к. незнаю как написать проверку.
3) Нет, должен выполняться постоянно создавая новое OU и добовляя туда пользователей (если конечно, ранее не создан уже).

Можно выкинуть, все что угодно, если подскажите как решить проблему :-)
Создать OU, заполнить параметрами, в новое OU добавить пользователей, группы, у которых в csv параметр OU совподает с только что созданным OU.
(вобщем разложить пользователей по OU и группам)

Kazun
03-06-2012, 10:54
Function Test-Exists($path)
{
-not [adsi]::Exists($path)
}

$objADSI=[ADSI]"LDAP://DC=contoso,DC=com"
$dataSource=import-csv "newusers.csv"

foreach($dataRecord in $dataSource) {
$OU="LDAP://OU={0},{1}" -f $dataRecord.ou,$objADSI.distinguishedName.ToString()
if(Test-Exists $ou)
{
$objOU=$objADSI.Create("organizationalUnit","OU="+$dataRecord.ou)
$objOU.SetInfo()
}
else {$objOU = [ADSI]$OU}

$CN=$dataRecord.cn
$giveName=$dataRecord.firstName
$sam=$dataRecord.sAMAccountName
$user="LDAP://CN={0},{1}" -f $cn,($objOU.path.replace("LDAP://",""))

if(Test-Exists $user)
{
$objUser=$objOU.Create("user","CN="+$CN)
$objUser.Put("samaccountname", $sam)
$objUser.Put("givenname",$giveName)
$objUser.SetInfo()
}
}

propsan
04-06-2012, 21:32
Wow! Спасибо, все получилось. Здорово.
А как интерпритировать вот эту конструкцию?
LDAP://OU={0},{1}"

Kazun
04-06-2012, 23:52
-f является сокращением на [String]::Format - более подробно http://msdn.microsoft.com/ru-ru/library/system.string.format.aspx
{X} - является индексом и начинается с нуля

Синтаксис - {index[,alignment][:formatString]}

PS > "{0} + {1} = {2}" -f 2,3,5
2 + 3 = 5
PS > "|{0,10}|" -f 100
| 100|
PS > "|{0,-10}|" -f 100
|100 |

propsan
06-06-2012, 20:04
Спасибо. Большое. Правда ничего не понял. Не силен в програмировании и скриптинге, надо будет серьезнее это изучить.




© OSzone.net 2001-2012