none
Замена значений AD из CSV. RRS feed

  • Вопрос

  • Доброго дня!

    Есть задача:

    В csv файле 2 заполненных столбца

    Полное имя;должность.

    Нужно проверить совпадения по displayname, в случае совпадения проверить title и если не совпадает его заменить.

    Нашел скрипт, который составлял Kazun и немного подделал его под себя:

    $users = Import-Csv c:\2013.csv -Delimiter ";"
    $props = $users | Get-Member -MemberType NoteProperty | Select -Expand Name
    
    foreach ($user in $users)
    {
    $objuser = ([adsisearcher]"(title=$($user.title))").FindOne().GetDirectoryEntry()
    $props | Foreach {
    $prop = $_.ToLower()
    if ($user.$prop -ne $objuser.InvokeGet($prop))
    {
    $objuser.Put("$prop",$user.$prop)
    }
    }
    $objuser.SetInfo()
    }

    Но отрабатывает указывая ошибку null-valued expression.

    Я не силен в таких значениях как adsisearcher и прочих InvokeGet, думал сделать по-простому, аля :

    $users= Get-aduser
    
    $csvuser = get-content 1.csv (import-csv)
    
    if displayname $users -eq 1му столбцу 1.csv, то replace title 2м столбцом.


    Легче не придумать, но не могу допетрить, хелп! :) 





    • Изменено Oleg.A 3 апреля 2013 г. 10:46
    3 апреля 2013 г. 10:28

Ответы

  • Проблем нет, когда правильные данные:
    #Кодировка
    PS > import-csv _2013.csv -del ";"
    
    Displayname                                                 title
    -----------                                                 -----
    ?????? ??????? ??????????                                   ??????? ???????
    ??????? ????? ??????????                                    ??????? ???????
    
    PS > Get-Content _2013.csv | convertfrom-csv -del ";"
    
    Displayname                                                 title
    -----------                                                 -----
    Петров Василий Васильевич                                   Ведущий эксперт
    Петрова Елена Васильевна                                    Ведущий эксперт
    
    
    PS > Get-ADUser -Filter * -Prop Title| Select -Last 2
    
    
    DistinguishedName : CN=Петров Василий Васильевич,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Василий Васильевич
    Name              : Петров Василий Васильевич
    ObjectClass       : user
    ObjectGUID        : a8f5a8ee-0def-42f3-a9b8-edddc0c57f34
    SamAccountName    : vpetrov
    SID               : S-1-5-21-747871228-491688339-2722364590-1127
    Surname           : Петров
    Title             :
    UserPrincipalName : vpetrov@contoso.com
    
    DistinguishedName : CN=Петрова Елена Васильевна,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Петрова
    Name              : Петрова Елена Васильевна
    ObjectClass       : user
    ObjectGUID        : dd913324-d015-4343-aa54-98524f790aea
    SamAccountName    : epetrova
    SID               : S-1-5-21-747871228-491688339-2722364590-1128
    Surname           : Елена Васильевна
    Title             :
    UserPrincipalName : epetrova@contoso.com
    
    PS > $csvusers = Get-Content _2013.csv | convertfrom-csv -del ";"
    PS > $users = Get-ADUser -Filter * -Properties DisplayName,Title
    PS > foreach($csvuser in $csvusers)
    >> {
    >>     foreach($user in $users)
    >>     {
    >>         if($user.Name -eq $csvuser.DisplayName)
    >>         {
    >>             if($user.Title -ne $csvuser.Title)
    >>             {
    >>                 Set-ADUser $user -Title $csvuser.Title
    >>             }
    >>         }
    >>     }
    >> }
    >>
    
    PS > Get-ADUser -Filter * -Prop Title| Select -Last 2
    
    
    DistinguishedName : CN=Петров Василий Васильевич,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Василий Васильевич
    Name              : Петров Василий Васильевич
    ObjectClass       : user
    ObjectGUID        : a8f5a8ee-0def-42f3-a9b8-edddc0c57f34
    SamAccountName    : vpetrov
    SID               : S-1-5-21-747871228-491688339-2722364590-1127
    Surname           : Петров
    Title             : Ведущий эксперт
    UserPrincipalName : vpetrov@contoso.com
    
    DistinguishedName : CN=Петрова Елена Васильевна,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Петрова
    Name              : Петрова Елена Васильевна
    ObjectClass       : user
    ObjectGUID        : dd913324-d015-4343-aa54-98524f790aea
    SamAccountName    : epetrova
    SID               : S-1-5-21-747871228-491688339-2722364590-1128
    Surname           : Елена Васильевна
    Title             : Ведущий эксперт
    UserPrincipalName : epetrova@contoso.com

    • Помечено в качестве ответа Oleg.A 4 апреля 2013 г. 9:22
    4 апреля 2013 г. 7:21
    Отвечающий

Все ответы

  • Пример файла csv:

    DisplayName;Title
    "Иванов Иван";"Менеджер"
    "Петров Степан";"Бухгалтер"
    "Сидоров Афанасий";"Мастер"

    $csvusers = Import-Csv c:\2013.csv -Delimiter ";"
    $users = Get-ADUser -Filter * -Properties DisplayName,Title
    
    foreach($csvuser in $csvusers)
    {
    	foreach($user in $users)
    	{
    		if($user.DisplayName -eq $csvuser.DisplayName)
    		{
    			if($user.Title -ne $csvuser.Title)
    			{
    				Set-ADUser $user -Title $csvuser.Title
    			}
    		}
    	}
    }

    3 апреля 2013 г. 10:58
    Отвечающий
  • Пример файла csv:

    DisplayName;Title
    "Иванов Иван";"Менеджер"
    "Петров Степан";"Бухгалтер"
    "Сидоров Афанасий";"Мастер"

    $csvusers = Import-Csv c:\2013.csv -Delimiter ";"
    $users = Get-ADUser -Filter * -Properties DisplayName,Title
    
    foreach($csvuser in $csvusers)
    {
    	foreach($user in $users)
    	{
    		if($user.DisplayName -eq $csvuser.DisplayName)
    		{
    			if($user.Title -ne $csvuser.Title)
    			{
    				Set-ADUser $user -Title $csvuser.Title
    			}
    		}
    	}
    }

    Не отрабатывает.

    CSV файл не имеет заголовков, добавил строку и подписал столбцы DisplayName и title.

    Знаков "" в столбцах конечно же нет, как в примере

    "Петров Степан";"Бухгалтер"

    там

    Displayname;title
    Василий Петрович;Главный эксперт

    Так же, заметил, что выгрузка

    Get-ADUser -Filter * -Properties DisplayName,Title

    Не выдает значения DisplayName, но выдает значение Name.

    Пробовал менять на 

    if($user.Name -eq $csvuser.DisplayName)

    Нет, не меняет!

    3 апреля 2013 г. 11:31
  • Заменить $csvusers = Import-Csv c:\2013.csv -Delimiter ";" на :

    $csvusers = Get-Content c:\2013.csv | ConvertFrom-Csv -Delimiter ";"

    Или сохранить файл в формате UTF-8.

    3 апреля 2013 г. 11:39
    Отвечающий
  • Заменить $csvusers = Import-Csv c:\2013.csv -Delimiter ";" на :

    $csvusers = Get-Content c:\2013.csv | ConvertFrom-Csv -Delimiter ";"

    Или сохранить файл в формате UTF-8.

    Неа...

    Итак, файл выглядит так, открыл wordpad`ом :

    Displayname;title
    Василий Петрович;Главный эксперт

    Петр Василич;Не главный эксперт

    Открывая exel, я просто добавил верхнюю строку руками.

    Скрипт:

    $csvusers = Get-Content c:\2013.csv | ConvertFrom-Csv -Delimiter ";"
    $users = Get-ADUser -Filter * -Properties DisplayName,Title
    
    foreach($csvuser in $csvusers)
    {
    	foreach($user in $users)
    	{
    		if($user.Name -eq $csvuser.DisplayName)
    		{
    			if($user.Title -ne $csvuser.Title)
    			{
    				Set-ADUser $user -Title $csvuser.Title
    			}
    		}
    	}
    }

    Как и с displayname, ничего не выдает, и Job Title не изменяется.Может ли быть это из-за неверного "формата" csv, который редактировался и падом предупреждая об изменении формата? Или что-то где-то мы упускаем? :)

    3 апреля 2013 г. 12:09
  • $csvusers - вывод содержит корректные данные?

    3 апреля 2013 г. 12:32
    Отвечающий
  • $csvusers - вывод содержит корректные данные?


    Абсолютно да...
    3 апреля 2013 г. 12:34
  • $csvusers - вывод содержит корректные данные?


    Абсолютно да...

    Значит неправильные данные в csv.

    3 апреля 2013 г. 12:52
    Отвечающий
  • $csvusers - вывод содержит корректные данные?


    Абсолютно да...

    Значит неправильные данные в csv.

    Как проверить "правильность"? Делаю все в тестовой зоне, копи-паст из ксв в поле DisplayName, остальные поля заполняю рандомно. Ксв выгружали не знаю чем, было много полей и фильтров в нем, все лишнее я удалил. И если вывод данных верен из csv, почему они "неправильные"?

    Вывод $csvusers

    DisplayName                             Title

    --------------------                    ---------------------

    Василий Петрович               Главный эксперт

    Петр Василич                      Не главный эксперт

    3 апреля 2013 г. 13:00
  • $csvusers - вывод содержит корректные данные?


    Абсолютно да...

    Значит неправильные данные в csv.

    Как проверить "правильность"? Делаю все в тестовой зоне, копи-паст из ксв в поле DisplayName, остальные поля заполняю рандомно. Ксв выгружали не знаю чем, было много полей и фильтров в нем, все лишнее я удалил. И если вывод данных верен из csv, почему они "неправильные"?

    Вывод $csvusers

    DisplayName                             Title

    --------------------                    ---------------------

    Василий Петрович               Главный эксперт

    Петр Василич                      Не главный эксперт


    "Так же, заметил, что выгрузка

    Get-ADUser -Filter * -Properties DisplayName,Title

    Не выдает значения DisplayName, но выдает значение Name. " - Ваши слова,поэтому верить сложно. Если бы были реальный вывод или скриншот,тогда можно о чем-то говорить.

    Взять одного пользователя, скопировать атрибут в csv:

    1) $user = Get-ADUser username -Prop DisplayName,Title

    2) Добавить одно значение в csv файл

    3) $csvuser.DisplayName -eq $user.DisplayName

    3 апреля 2013 г. 13:07
    Отвечающий
  • "Так же, заметил, что выгрузка

    Get-ADUser -Filter * -Properties DisplayName,Title

    Не выдает значения DisplayName, но выдает значение Name. " - Ваши слова,поэтому верить сложно. Если бы были реальный вывод или скриншот,тогда можно о чем-то говорить.

    Вывод команды $users имел ввиду, а вот вывод $csvusers значения выдает верное.

    С vmware не копируется буфер, отсюда все ввожу и вывожу руками :(






    • Изменено Oleg.A 3 апреля 2013 г. 13:42
    3 апреля 2013 г. 13:39
  • $csvuser.DisplayName попробовать заменить на $csvuser.DisplayName.Trim()
    • Изменено KazunEditor 3 апреля 2013 г. 14:00
    3 апреля 2013 г. 14:00
    Отвечающий
  • $csvuser.DisplayName попробовать заменить на $csvuser.DisplayName.Trim()

    Откуда же вы это берете? Invoke, Trim?  :) (сам найду-почитаю, спасибо)

    Нет, не отрабатывает, теперь вернулись к ошибке

    You cannot call a method on a null-valued expression.
    ... invalidOperation: (Trim:String) [], RuntimeExeption
    FQEI: InvokeMethodOnNull.

    Получается, тут никак, "по-простому" да?

    Просто на словах (по описанию) скрипт должен выполняться легко и логично. Может пош до 3.0 обновить? =)


    • Изменено Oleg.A 4 апреля 2013 г. 5:15
    4 апреля 2013 г. 5:14
  • $csvuser.DisplayName попробовать заменить на $csvuser.DisplayName.Trim()

    Откуда же вы это берете? Invoke, Trim?  :) (сам найду-почитаю, спасибо)

    Нет, не отрабатывает, теперь вернулись к ошибке

    You cannot call a method on a null-valued expression.
    ... invalidOperation: (Trim:String) [], RuntimeExeption
    FQEI: InvokeMethodOnNull.

    Получается, тут никак, "по-простому" да?

    Просто на словах (по описанию) скрипт должен выполняться легко и логично. Может пош до 3.0 обновить? =)


    Скрипт работает для PowerShell V2,поэтому разницы в обновлении до PowerShell V3 не даст ничего.

    You cannot call a method on a null-valued expression. - Нельзя вызвать метод для нулевого значения,как было сказано выше,правильно заполнить файл CSV не смогли. 

    4 апреля 2013 г. 5:25
    Отвечающий
  • Скрипт работает для PowerShell V2,поэтому разницы в обновлении до PowerShell V3 не даст ничего.

    You cannot call a method on a null-valued expression. - Нельзя вызвать метод для нулевого значения,как было сказано выше,правильно заполнить файл CSV не смогли. 

    Разве тот скрин, что я вложил, не выводит верные значения $csvusers- displayname и title?

    Сам CSV был выгружен из базы данных и я правил его руками, соответственно, чтобы сделать его "правильным", нужно опять править его руками.

    Вот файлик урезанный, подскажите пожалуйста, что там не так?

    https://docs.google.com/file/d/0B6xGcdByVBT0a2Z6eV9EWGgwNFE/edit?usp=sharing

    4 апреля 2013 г. 6:25
  • Проблем нет, когда правильные данные:
    #Кодировка
    PS > import-csv _2013.csv -del ";"
    
    Displayname                                                 title
    -----------                                                 -----
    ?????? ??????? ??????????                                   ??????? ???????
    ??????? ????? ??????????                                    ??????? ???????
    
    PS > Get-Content _2013.csv | convertfrom-csv -del ";"
    
    Displayname                                                 title
    -----------                                                 -----
    Петров Василий Васильевич                                   Ведущий эксперт
    Петрова Елена Васильевна                                    Ведущий эксперт
    
    
    PS > Get-ADUser -Filter * -Prop Title| Select -Last 2
    
    
    DistinguishedName : CN=Петров Василий Васильевич,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Василий Васильевич
    Name              : Петров Василий Васильевич
    ObjectClass       : user
    ObjectGUID        : a8f5a8ee-0def-42f3-a9b8-edddc0c57f34
    SamAccountName    : vpetrov
    SID               : S-1-5-21-747871228-491688339-2722364590-1127
    Surname           : Петров
    Title             :
    UserPrincipalName : vpetrov@contoso.com
    
    DistinguishedName : CN=Петрова Елена Васильевна,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Петрова
    Name              : Петрова Елена Васильевна
    ObjectClass       : user
    ObjectGUID        : dd913324-d015-4343-aa54-98524f790aea
    SamAccountName    : epetrova
    SID               : S-1-5-21-747871228-491688339-2722364590-1128
    Surname           : Елена Васильевна
    Title             :
    UserPrincipalName : epetrova@contoso.com
    
    PS > $csvusers = Get-Content _2013.csv | convertfrom-csv -del ";"
    PS > $users = Get-ADUser -Filter * -Properties DisplayName,Title
    PS > foreach($csvuser in $csvusers)
    >> {
    >>     foreach($user in $users)
    >>     {
    >>         if($user.Name -eq $csvuser.DisplayName)
    >>         {
    >>             if($user.Title -ne $csvuser.Title)
    >>             {
    >>                 Set-ADUser $user -Title $csvuser.Title
    >>             }
    >>         }
    >>     }
    >> }
    >>
    
    PS > Get-ADUser -Filter * -Prop Title| Select -Last 2
    
    
    DistinguishedName : CN=Петров Василий Васильевич,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Василий Васильевич
    Name              : Петров Василий Васильевич
    ObjectClass       : user
    ObjectGUID        : a8f5a8ee-0def-42f3-a9b8-edddc0c57f34
    SamAccountName    : vpetrov
    SID               : S-1-5-21-747871228-491688339-2722364590-1127
    Surname           : Петров
    Title             : Ведущий эксперт
    UserPrincipalName : vpetrov@contoso.com
    
    DistinguishedName : CN=Петрова Елена Васильевна,OU=User Accounts,DC=contoso,DC=com
    Enabled           : False
    GivenName         : Петрова
    Name              : Петрова Елена Васильевна
    ObjectClass       : user
    ObjectGUID        : dd913324-d015-4343-aa54-98524f790aea
    SamAccountName    : epetrova
    SID               : S-1-5-21-747871228-491688339-2722364590-1128
    Surname           : Елена Васильевна
    Title             : Ведущий эксперт
    UserPrincipalName : epetrova@contoso.com

    • Помечено в качестве ответа Oleg.A 4 апреля 2013 г. 9:22
    4 апреля 2013 г. 7:21
    Отвечающий
  • Странно... Вчера все верно выгружал вроде ($csvusers)- скрин вкладывал, сегодня правда такое безобразие...

    Вы как всегда- бог повершелла, спасибо Вам большое! :)

    4 апреля 2013 г. 9:22