![]() |
Сопоставление сотрудников из 1С учетным записям в AD
Прошу помочь по возможности в решении задачи:
Есть csv-выгрузка из 1С такого вида: Код:
Фамилия;Имя;Отчество;ТН;ДР;СНИЛС;Организация;Подразделение;Должность;Дата приема;Дата увольнения Учитывая, что в домене отчество обозначено только первым символом, а в выгрузке полностью, то возможны совпадения при сравнении, т.к. в выгрузке есть еще , например, сотрудник "Пупкин Василий Алексеевич". Необходимо очистить выгрузку от неуникальных в этом отношении записей, т.е. в данном случае удалить обоих Пупкиных, и дополнить очищенную выгрузку графой "samaccountname", заполнив ее соответствующими данными из AD (если есть). Все учетные записи в AD находятся в OU Domain\Сотрудники. CSV в win-кодировке. |
Цитата:
|
Цитата:
|
IvanXXL, рано или поздно отчество придётся вносить полностью.
|
Цитата:
А если по существу, то вы лично можете мне помочь в решении сформулированной задачи? |
ТН;ДР;СНИЛС;Организация;Подразделение;Должность;Дата приема;Дата увольнения - Атрибуты в AD требуется угадать, если есть дублирующие записи?
Подразделение;Должность - Присутствуют в AD? |
Текущая структура в AD - это свалка, которую еще мне предстоит разгрести. Там привязаться не к чему. Выводимое имя - это единственное, чему можно сейчас доверять. Поэтому дубли имен из выгрузки надо отбрасывать. Их надо будет вручную выверять. Поля выгрузки, кроме имени, отчества и фамилии, в решении текущей задачи использовать не предполагалось, они потребуются впоследствии для актуализации информации в AD после сопоставления сотрудников с учетными записями.
|
Код:
$result = Import-Csv users.csv -Delimiter ";" | |
Kazun, если не сложно, то прошу прокомментировать работу кода, в частности мне непонятна строка "$name = $_.Name".
|
1) Import-Csv users.csv -Delimiter ";" - Импортируем данные из CSV
2) Далее передаем по конвейеру командлету Group-Object, для поиска объектов, которые получаются одинаковые при приведении к виду Василий А Пупкин(если требуется Василий А. Пупкин - то изменить на "{0} {1}. {2}"). Код:
PS > Import-Csv users.csv -Delimiter ";" | Group {"{0} {1}. {2}" -f $_.Имя,$_.Отчество[0],$_.Фамилия} Код:
PS Import-Csv 1.csv -Delimiter ";" | Group {"{0} {1}. {2}" -f $_.Имя,$_.Отчество[0],$_.Фамилия} | Where{ $_.Count -eq 1} 5) $sam = (Get-ADUser -Filter "DisplayName -eq '$name'").SamAccountName - Производим поиск в AD и пробуем получить свойство SamAccountName 6) Дальше, случайно , добавил лишнюю проверку. if(Get-ADUser -Filter "DisplayName -eq '$name'") - Достаточно if($sam) 7) $_.Group | Add-Member -NotePropertyName SamAccountName -NotePropertyValue $sam -PassThru - Добавляем новое свойство к объекту Код:
$result = Import-Csv users.csv -Delimiter ";" | Код:
PS > $result |
Kazun, спасибо за подробные комментарии.
Но возникла одна проблема: на контроллере домена не установлены веб-службы AD. Возможно заменить командлет Get-ADUser на Get-QADUser? |
Конечно возможно:
Код:
(Get-QADUser -DisplayName $name).SamAccountName |
Kazun, спасибо за подсказку.
Я отказался от русских имен в заголовках: было Фамилия;Имя;Отчество;ТН;ДР;СНИЛС;Организация;Подразделение;Должность;Дата приема;Дата увольнения стало LastName;Name1;Name2;ID;Birthday;SNILS;Organization;Department;Role;Employment;Dismissal Выполняю вот такой скрипт: Код:
cls Код:
Add-Member : Не удается найти параметр, соответствующий имени параметра "NotePropertyName". |
Использовал версию V3,для V2:
Код:
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $sam -PassThru |
Kazun,
Не успеваю за прогрессом! :) А по существу: огромное спасибо за помощь! Небольшое дополнение: для корректного поиска нужна была точка после инициала отчества тут: Код:
Group {"{0} {1}. {2}" -f $_.Name1,$_.Name2[0],$_.LastName} | Where {$_.Count -eq 1} | Foreach { Итоговый скрипт: Код:
cls |
Kazun, еще раз спасибо за помощь в решении.
Но если не сложно, то, так сказать "для расширения кругозора" подскажи, как выглядел бы скрипт, если бы не требовалось очищать выгрузку от неуникальных записей "Имя О. Фамилия", но поиск в AD осуществлялся бы только для уникальных записей "Имя О. Фамилия"? |
Код:
Group {"{0} {1}. {2}" -f $_.Name1,$_.Name2[0],$_.LastName} | Foreach { |
Kazun, ну и последний гипотетический вопрос: как можно организовать поэтапную работу скрипта, на каждом этапе обрабатывая записи с фамилиями только на одну букву (А, Б, В...) из единого файл-источника?
|
Делайте двойное группирование.
Код:
$data = Import-Csv $path\users.csv -Delimiter ";" |
Kazun,
Цитата:
|
Код:
PS > $al Код:
$k = $al | Where {$_.Name -eq "К"} | Foreach {$_.Group} Код:
$result = $k | |
Kazun, спасибо! Теперь доходчиво получилось! :)
|
Время: 05:17. |
Время: 05:17.
© OSzone.net 2001-