Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Ошибки в Powershell при создании пользователей (http://forum.oszone.net/showthread.php?t=224046)

Baggurd 29-12-2011 13:34 1824836

Ошибки в 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

Kazun 29-12-2011 14:59 1824910

Надо указать разделитель в команде Import-CSv - Import-Csv users.csv -Delimiter ";"

Baggurd 29-12-2011 16:40 1824996

Помогло. Спасибо.

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

Kazun 29-12-2011 17:47 1825022

$dataSource = Get-Content users.csv | ConvertFrom-Csv -Delimiter ";"

Baggurd 30-12-2011 10:48 1825454

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

ratibor79 30-12-2011 11:14 1825476

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 1825492

Baggurd
Сделать условие,что переменная определена и имеет значение,и только потом присваивать параметр.

Baggurd 30-12-2011 20:51 1825797

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

ratibor79 30-12-2011 21:15 1825814

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

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

Baggurd 30-12-2011 21:47 1825841

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

Baggurd 17-01-2012 14:14 1837877

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

Baggurd 19-01-2012 14:07 1839561

Решил пойти другим путем используя командлеты от 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 1926462

Добрый день, решил новые темы не пладить и развить эту. Аналогичная ошибка при попытке создать пользователя. Подскажите как решить.

Код:

$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 1926639

У Вас всегда в файле 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 1926765

Пользователь конечно не один. И не одно 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 1927134

Код:

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 1928093

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

Kazun 04-06-2012 23:52 1928186

-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
2 + 3 = 5
PS >  "|{0,10}|" -f 100
|      100|
PS >  "|{0,-10}|" -f 100
|100      |


propsan 06-06-2012 20:04 1929612

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


Время: 11:48.

Время: 11:48.
© OSzone.net 2001-