none
Powershell: Заполнить данные о пользователе в AD RRS feed

  • Вопрос

  • Добрый день.

    Помогите пож-та посредством PS справиться со следующей задачей:

    Необходимо всем пользователям домена изменить в соответствии с заполненной таблицей Excel некоторые поля в AD, а именно: Должность; Отдел; Телефон; Комната.

    Заполненная таблица Excel с нужными данными, имеет вид:

    Необходимо сделать так, чтобы сценарий опрашивал каждого пользователя AD и в случае его обнаружения, изменял нужные поля пользователя (Должность - title; Отдел - department; Телефон - telephoneNumber; Комната - physicalDeliveryOfficeName), на те которые в таблице.

    Есть сценарий (ранее пробовал по этому пути пойти но не вышло), спасибо форумчанам за помощь в его допилке:

    Function ChangeCompany($user)  
    {
    $s = [adsisearcher]"(samaccountname=$user)"
    $u = $s.FindOne().GetDirectoryEntry()  
    if($u) {  $u.Put("company", 'ОАО "Рога и копыта"')  
    $u.SetInfo()  
    }  
    }
    $searcher = [adsisearcher]"(objectCategory=person)"
    $searcher.searchRoot = [adsi]"LDAP://OU=IT,DC=domain,DC=com"
    $searcher.PropertiesToLoad.AddRange('samaccountname')
    $Users =  $searcher.findall()
    Foreach ($User in $Users){ChangeCompany($user.Properties.samaccountname)}

    Но он меняет всем пользователям OU компанию на заданную в нем. А вот как методом перебора и сравнения сделать - не знаю. Буду очень благодарен за помощь. Спасибо.




    15 октября 2013 г. 8:31

Ответы

  • 1) Сохранить файл в кодироке UTF-8 c именем adusers.csv (notepad - Save AS - Encoding - UTF-8)

    2) Формат файла

    Фамилия,Имя,Отчество,Должность,Отдел,Телефон,Комната
    Иванов,Иван,Иванович,Начальник отдела,Отдел ИТ,200,301
    Сидоров,Сергей,Сергеевич,Водитель,Автотранспортный отдел,300,303

    3) Скрипт

    Import-Csv adusers.csv | Foreach {
    	$sn = $_."Фамилия"
    	$gn = $_."Имя"
    	$s = [adsisearcher]"(&(sn=$sn)(givenname=$gn))" 
    	$u = $s.FindOne().GetDirectoryEntry()  
    	if($u) {  
    		$u.Put("title", $_."Должность") 
    		$u.Put("department", $_."Отдел") 
    		$u.Put("telephoneNumber", $_."Телефон")
    		$u.Put("physicalDeliveryOfficeName", $_."Комната")
    		$u.SetInfo()
    	}
    	else {
    		Write-Host -Fore Yellow "Пользователь с именем и фамилией $sn $gn не найден"
    	}
    }

    Вывод:

    PS > Import-Csv adusers.csv
    
    Фамилия   : Иванов
    Имя       : Иван
    Отчество  : Иванович
    Должность : Начальник отдела
    Отдел     : Отдел ИТ
    Телефон   : 200
    Комната   : 301
    
    Фамилия   : Сидоров
    Имя       : Сергей
    Отчество  : Сергеевич
    Должность : Водитель
    Отдел     : Автотранспортный отдел
    Телефон   : 300
    Комната   : 303
    
    PS > Get-ADUser -LDAPFilter "(|(sn=Сидоров)(sn=Иванов))" -Properties title,department,tele
    phonenumber,physicalDeliveryOfficeName | select name,title,department,telephonenumber,physicalDeliveryOfficeName
    
    
    name                       : Сидоров Сергей Сергеевич
    title                      :
    department                 :
    telephonenumber            :
    physicalDeliveryOfficeName :
    
    name                       : Иванов Иван Иванович
    title                      :
    department                 :
    telephonenumber            :
    physicalDeliveryOfficeName :
    
    После выполнения скрипта:
    PS > Get-ADUser -LDAPFilter "(|(sn=Сидоров)(sn=Иванов))" -Properties title,department,tele
    phonenumber,physicalDeliveryOfficeName | select name,title,department,telephonenumber,physicalDeliveryOfficeName
    
    
    name                       : Сидоров Сергей Сергеевич
    title                      : Водитель
    department                 : Автотранспортный отдел
    telephonenumber            : 300
    physicalDeliveryOfficeName : 303
    
    name                       : Иванов Иван Иванович
    title                      : Начальник отдела
    department                 : Отдел ИТ
    telephonenumber            : 200
    physicalDeliveryOfficeName : 301

    • Помечено в качестве ответа Land-Group 16 октября 2013 г. 8:11
    15 октября 2013 г. 15:47
    Отвечающий

Все ответы

  • 1 Изменить заголовки столбцов на английские на surname,name,secname,title,department,phone,room

    2 сохранить файл как csv, разделитель ;

    3 мегаскрипт в духе

    import-module activedirectory
    $File = import-csv {файл с данными} -delimiter ";" foreach ($User in $file) { $Surname = $Line.Surname $Name = $Line.Name get-aduser -ldapfilter "(sn=$surname)(givenname=$name)" | set-aduser -title $Line.Title -Department $Line.department -Office $Line.Room -OfficePhone $line.Phone }
    Поиск пользователя правится для ваших нужд.

    Устанавливаются поля по порядку Должность, Отдел, Комната и Телефон



    15 октября 2013 г. 9:02
  • 1. Изменил

    2. Сохранил (CSV (разделители - запятые))

    Запускаю\ошибка (да, Active Directory Web Services - не стоит, без него можно как нибудь обойтись?):

    import-module activedirectory
    $File = import-csv {C:\user.csv} -delimiter ";"
    foreach ($User in $file)
    {
    $Surname = $Line.Surname
    $Name = $Line.Name
    get-aduser -ldapfilter "(sn=$surname)(givenname=$name)" | set-aduser -title $Line.Title -Department $Line.department -Office $Line.Room -OfficePhone $line.Phone
    }

    Import-Csv : Cannot evaluate parameter 'Path' because its argument is specified as a script block and there is no input. A script block cannot be
    evaluated without input.
    At line:2 char:19
    + $File = import-csv <<<<  {C:\user.csv} -delimiter ";"
        + CategoryInfo          : MetadataError: (:) [Import-Csv], ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,Microsoft.PowerShell.Commands.ImportCsvCommand
     
    Get-ADUser : Unable to find a default server with Active Directory Web Services running.
    At line:7 char:11
    + get-aduser <<<<  -ldapfilter "(sn=$surname)(givenname=$name)" | set-aduser -title $Line.Title -Department $Line.department -Office $Line.Room -O
    fficePhone $line.Phone
        + CategoryInfo          : ResourceUnavailable: (:) [Get-ADUser], ADServerDownException
        + FullyQualifiedErrorId : Unable to find a default server with Active Directory Web Services running.,Microsoft.ActiveDirectory.Management.Co
       mmands.GetADUser

    15 октября 2013 г. 9:31
  • 1) Сохранить файл в кодироке UTF-8 c именем adusers.csv (notepad - Save AS - Encoding - UTF-8)

    2) Формат файла

    Фамилия,Имя,Отчество,Должность,Отдел,Телефон,Комната
    Иванов,Иван,Иванович,Начальник отдела,Отдел ИТ,200,301
    Сидоров,Сергей,Сергеевич,Водитель,Автотранспортный отдел,300,303

    3) Скрипт

    Import-Csv adusers.csv | Foreach {
    	$sn = $_."Фамилия"
    	$gn = $_."Имя"
    	$s = [adsisearcher]"(&(sn=$sn)(givenname=$gn))" 
    	$u = $s.FindOne().GetDirectoryEntry()  
    	if($u) {  
    		$u.Put("title", $_."Должность") 
    		$u.Put("department", $_."Отдел") 
    		$u.Put("telephoneNumber", $_."Телефон")
    		$u.Put("physicalDeliveryOfficeName", $_."Комната")
    		$u.SetInfo()
    	}
    	else {
    		Write-Host -Fore Yellow "Пользователь с именем и фамилией $sn $gn не найден"
    	}
    }

    Вывод:

    PS > Import-Csv adusers.csv
    
    Фамилия   : Иванов
    Имя       : Иван
    Отчество  : Иванович
    Должность : Начальник отдела
    Отдел     : Отдел ИТ
    Телефон   : 200
    Комната   : 301
    
    Фамилия   : Сидоров
    Имя       : Сергей
    Отчество  : Сергеевич
    Должность : Водитель
    Отдел     : Автотранспортный отдел
    Телефон   : 300
    Комната   : 303
    
    PS > Get-ADUser -LDAPFilter "(|(sn=Сидоров)(sn=Иванов))" -Properties title,department,tele
    phonenumber,physicalDeliveryOfficeName | select name,title,department,telephonenumber,physicalDeliveryOfficeName
    
    
    name                       : Сидоров Сергей Сергеевич
    title                      :
    department                 :
    telephonenumber            :
    physicalDeliveryOfficeName :
    
    name                       : Иванов Иван Иванович
    title                      :
    department                 :
    telephonenumber            :
    physicalDeliveryOfficeName :
    
    После выполнения скрипта:
    PS > Get-ADUser -LDAPFilter "(|(sn=Сидоров)(sn=Иванов))" -Properties title,department,tele
    phonenumber,physicalDeliveryOfficeName | select name,title,department,telephonenumber,physicalDeliveryOfficeName
    
    
    name                       : Сидоров Сергей Сергеевич
    title                      : Водитель
    department                 : Автотранспортный отдел
    telephonenumber            : 300
    physicalDeliveryOfficeName : 303
    
    name                       : Иванов Иван Иванович
    title                      : Начальник отдела
    department                 : Отдел ИТ
    telephonenumber            : 200
    physicalDeliveryOfficeName : 301

    • Помечено в качестве ответа Land-Group 16 октября 2013 г. 8:11
    15 октября 2013 г. 15:47
    Отвечающий
  • Добрый день, Kazun.

    Что делаю: Создал txt-файл, вписал туда данные вида:

    Иванов,Иван,Иванович,Начальник отдела,Отдел ИТ,200,301

    Сохранил в кодировке UTF-8 c именем adusers.csv и поместил его на рабочем столе. Далее запускаю PS, но там ошибка (Active Directory Web Services не запущен):

    PS C:\Users\land-group\Desktop> Import-Csv adusers.csv | Foreach {
    >>     $sn = $_."Фамилия"
    >>     $gn = $_."Имя"
    >>     $s = [adsisearcher]"(&(sn=$sn)(givenname=$gn))"
    >>     $u = $s.FindOne().GetDirectoryEntry()
    >>     if($u) {
    >>         $u.Put("title", $_."Должность")
    >>         $u.Put("department", $_."Отдел")
    >>         $u.Put("telephoneNumber", $_."Телефон")
    >>         $u.Put("physicalDeliveryOfficeName", $_."Комната")
    >>         $u.SetInfo()
    >>     }
    >>     else {
    >>         Write-Host -Fore Yellow "Пользователь с именем и фамилией $sn $gn не найден"
    >>     }
    >> }
    >>
    PS C:\Users\land-group\Desktop> Import-Csv adusers.csv
    PS C:\Users\land-group\Desktop> Get-ADUser -LDAPFilter "(|(sn=Иванов))" -Properties title,department,telephonenumber,
    physicalDeliveryOfficeName | select name,title,department,telephonenumber,physicalDeliveryOfficeName
    Get-ADUser : Unable to find a default server with Active Directory Web Services running.
    At line:1 char:11
    + Get-ADUser <<<<  -LDAPFilter "(|(sn=Иванов))" -Properties title,department,telephonenumber,physicalDeliveryOffic
    eName | select name,title,department,telephonenumber,physicalDeliveryOfficeName
        + CategoryInfo          : ResourceUnavailable: (:) [Get-ADUser], ADServerDownException
        + FullyQualifiedErrorId : Unable to find a default server with Active Directory Web Services running.,Microsoft.Ac
       tiveDirectory.Management.Commands.GetADUser

    Вы уже рекомендовали поставить Active Directory Web Services, но я все тяну. Обязательно поставлю (в домене все DC на 2003, установлю Active Directory Web Services отдельным апдэйтом). Сейчас же разве без него не обойтись?

    16 октября 2013 г. 7:41
  • В моем примере скрипта используется ADSI,поэтому ADWS не требуется. Get-ADUser я привел для показа вывода информации и в работе скрипта не требуется. В формате файла должен быть заголовок обязательно - Фамилия,Имя,Отчество,Должность,Отдел,Телефон,Комната

    16 октября 2013 г. 7:48
    Отвечающий
  • Kazun, Вы МегаМозг :). Который раз помогаете. Огромное спасибо, все заработало.

    p.s. печально что не знаю Вашего имени. Сказал бы руководству кому на самом деле нужно платить премии :)

    16 октября 2013 г. 8:11
  • :) В эксплуатации скрипта столкнулся с проблемой: у тех пользователей, у которых одинаковые фамилии и имена - скрипт не отрабатывает

    Подскажете пож-та как сделать проверку еще и по отчеству?

    + Если скрипт не находит пользователя (удален), он не сообщает что пользователя нет, хотя в скрипте вы ведь явно это указали, не подскажете почему так?



    • Изменено Land-Group 16 октября 2013 г. 12:36
    16 октября 2013 г. 11:36
  • 1) В каком атрибуте у Вас присутствует отчество?

    2) Да, тут моя оплошность,заменить на:

    Import-Csv adusers.csv | Foreach {
    	$sn = $_."Фамилия"
    	$gn = $_."Имя"
    	$s = [adsisearcher]"(&(sn=$sn)(givenname=$gn))" 
    	try {  
    		$u = $s.FindOne().GetDirectoryEntry()
    		$u.Put("title", $_."Должность") 
    		$u.Put("department", $_."Отдел") 
    		$u.Put("telephoneNumber", $_."Телефон")
    		$u.Put("physicalDeliveryOfficeName", $_."Комната")
    		$u.SetInfo()
    	}
    	catch {
    		Write-Host -Fore Yellow "Пользователь с именем и фамилией $sn $gn не найден"
    	}
    }

    16 октября 2013 г. 13:14
    Отвечающий
  • 1) В каком атрибуте у Вас присутствует отчество?

    Вот тут засада, в ADSI есть атрибут отчеству (Initials), но оно заполнено только первой буквой отчества. Может по "cn" (полное ФИО - Иванов Иван Иванович) или по sAMAccountName (ivanov), он то уж точно уникален?

    p.s. Желтым подсветил :)


    • Изменено Land-Group 16 октября 2013 г. 13:57
    16 октября 2013 г. 13:53
  • 1) По CN

    $sn = $_."Фамилия"
    $gn = $_."Имя"
    $o = $_."Отчество"
    $cn = "{0} {1} {2}" -f $sn,$gn,$o
    
    $s = [adsisearcher]"(cn=$cn)"

    2) Если SamAccountName есть

    $s = $_.SamAccountName
    $s = [adsisearcher]"(samaccountname=$s)"

    16 октября 2013 г. 14:01
    Отвечающий
  • Kazun, благодарю. Работает как часы (По CN)



    17 октября 2013 г. 8:19
  • 1 Изменить заголовки столбцов на английские на surname,name,secname,title,department,phone,room

    2 сохранить файл как csv, разделитель ;

    3 мегаскрипт в духе

    import-module activedirectory
    $File = import-csv {файл с данными} -delimiter ";" foreach ($User in $file) { $Surname = $Line.Surname $Name = $Line.Name get-aduser -ldapfilter "(sn=$surname)(givenname=$name)" | set-aduser -title $Line.Title -Department $Line.department -Office $Line.Room -OfficePhone $line.Phone }
    Поиск пользователя правится для ваших нужд.

    Устанавливаются поля по порядку Должность, Отдел, Комната и Телефон



    Роман, использую скрипт и валится ошибка  

    Get-ADUser : Фильтр поиска не опознан
    строка:7 знак:1
    + Get-ADUser -LDAPFilter "(sn=$surname)(givenname=$name)" | set-aduser -title $Lin ...

    подскажите в чем ошибка.

    25 сентября 2014 г. 9:39