PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Kazun, если не сложно, то прошу прокомментировать работу кода, в частности мне непонятна строка "$name = $_.Name".
-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
1) Import-Csv users.csv -Delimiter ";" - Импортируем данные из CSV
2) Далее передаем по конвейеру командлету Group-Object, для поиска объектов, которые получаются одинаковые при приведении к виду Василий А Пупкин(если требуется Василий А. Пупкин - то изменить на "{0} {1}. {2}").
Код:
3) Далее передаем по конвейеру и фильтруем уникальные элементы.
Код:
4) $name = $_.Name - Будет содержать Адексааа А. Бульба(текущий элемент в конвейере)
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 - Добавляем новое свойство к объекту
Код:
Код:
2) Далее передаем по конвейеру командлету Group-Object, для поиска объектов, которые получаются одинаковые при приведении к виду Василий А Пупкин(если требуется Василий А. Пупкин - то изменить на "{0} {1}. {2}").
Код:
Код: Выделить всё
PS > Import-Csv users.csv -Delimiter ";" | Group {"{0} {1}. {2}" -f $_.Имя,$_.Отчество[0],$_.Фамилия}
Count Name Group
----- ---- -----
2 Василий А. Пупкин {@{Фамилия=Пупкин; Имя=Василий; Отчество=Алибабаевич; ТН=0009876543; ДР=19.02.1966
1 Адексааа А. Бульба {@{Фамилия=Бульба; Имя=Адексааа; Отчество=Алибабаевич; ТН=0009876543; ДР=19.02.19663) Далее передаем по конвейеру и фильтруем уникальные элементы.
Код:
Код: Выделить всё
PS Import-Csv 1.csv -Delimiter ";" | Group {"{0} {1}. {2}" -f $_.Имя,$_.Отчество[0],$_.Фамилия} | Where{ $_.Count -eq 1}
Count Name Group
----- ---- -----
1 Адексааа А. Бульба {@{Фамилия=Бульба; Имя=Адексааа; Отчество=Алибабаевич; ТН=0009876543; ДР=19.02.1966;...4) $name = $_.Name - Будет содержать Адексааа А. Бульба(текущий элемент в конвейере)
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 ";" |
Group {"{0} {1}. {2}" -f $_.Имя,$_.Отчество[0],$_.Фамилия} | Where {$_.Count -eq 1} | Foreach {
$name = $_.Name
$sam = (Get-ADUser -Filter "DisplayName -eq '$name'").SamAccountName
if($sam) {
$_.Group | Add-Member -NotePropertyName SamAccountName -NotePropertyValue $sam -PassThru
}
else {
$_.Group | Add-Member -NotePropertyName SamAccountName -NotePropertyValue "" -PassThru
}
}Код:
Код: Выделить всё
PS > $result
Фамилия : Иванов
Имя : Иван
Отчество : Иванович
ТН : 0009876543
ДР : 19.02.1966
СНИЛС : 888-777-666 55
Организация : ООО "Рога и копыта"
Подразделение : Бухгалтерия
Должность : шредерщик
Дата приема : 08.07.2000
Дата увольнения :
SamAccountName : iivanov-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Kazun, спасибо за подсказку.
Я отказался от русских имен в заголовках:
было
Фамилия;Имя;Отчество;ТН;ДР;СНИЛС;Организация;Подразделение;Должность;Дата приема;Дата увольнения
стало
LastName;Name1;Name2;ID;Birthday;SNILS;Organization;Department;Role;Employment;Dismissal
Выполняю вот такой скрипт:
Код:
Получаю такие сообщения об ошибках:
Код:
Что не так?
Я отказался от русских имен в заголовках:
было
Фамилия;Имя;Отчество;ТН;ДР;СНИЛС;Организация;Подразделение;Должность;Дата приема;Дата увольнения
стало
LastName;Name1;Name2;ID;Birthday;SNILS;Organization;Department;Role;Employment;Dismissal
Выполняю вот такой скрипт:
Код:
Код: Выделить всё
cls
$path="d:\_ps\1s-AD"
$result = Import-Csv $path\users.csv -Delimiter ";" |
Group {"{0} {1} {2}" -f $_.Name1,$_.Name2[0],$_.LastName} | Where {$_.Count -eq 1} | Foreach {
$name = $_.Name
$sam = (Get-QADUser -DisplayName $name).SamAccountName
if($sam) {
$_.Group | Add-Member -NotePropertyName SamAccountName -NotePropertyValue $sam -PassThru
}
else {
$_.Group | Add-Member -NotePropertyName SamAccountName -NotePropertyValue "" -PassThru
}
}
$result|export-csv $path\filtered-users.csv -Delimiter ";" -Encoding DefaultПолучаю такие сообщения об ошибках:
Код:
Код: Выделить всё
Add-Member : Не удается найти параметр, соответствующий имени параметра "NotePropertyName".
D:\_ps\1s-AD\0.ps1:11 знак:43
+ $_.Group | Add-Member -NotePropertyName <<<< SamAccountName -NotePropertyValue "" -PassThru
+ CategoryInfo : InvalidArgument: (:) [Add-Member], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.AddMemberCommand
Export-Csv : Не удается привязать аргумента к параметру "InputObject", так как он имеет значение NULL.
D:\_ps\1s-AD\0.ps1:14 знак:19
+ $result|export-csv <<<< $path\filtered-users.csv -Delimiter ";" -Encoding Default
+ CategoryInfo : InvalidData: (:) [Export-Csv], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ExportCsvCommandЧто не так?
-
Kazun
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Использовал версию V3,для V2:
Код:
Код:
Код: Выделить всё
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $sam -PassThru-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Kazun,
Не успеваю за прогрессом!
А по существу: огромное спасибо за помощь! Небольшое дополнение: для корректного поиска нужна была точка после инициала отчества тут:
Код:
Вопрос решен - тему можно считать закрытой.
Итоговый скрипт:
Код:
Не успеваю за прогрессом!

А по существу: огромное спасибо за помощь! Небольшое дополнение: для корректного поиска нужна была точка после инициала отчества тут:
Код:
Код: Выделить всё
Group {"{0} {1}. {2}" -f $_.Name1,$_.Name2[0],$_.LastName} | Where {$_.Count -eq 1} | Foreach {Вопрос решен - тему можно считать закрытой.
Итоговый скрипт:
Код:
Код: Выделить всё
cls
$path="d:\_ps\1s-AD"
$result = Import-Csv $path\users.csv -Delimiter ";" |
Group {"{0} {1}. {2}" -f $_.Name1,$_.Name2[0],$_.LastName} | Where {$_.Count -eq 1} | Foreach {
$name = $_.Name
$sam = (Get-QADUser -DisplayName $name).SamAccountName
if($sam) {
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $sam -PassThru
}
else {
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value "" -PassThru
}
}
$result|export-csv $path\filtered-users.csv -Delimiter ";" -Encoding Default-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Kazun, еще раз спасибо за помощь в решении.
Но если не сложно, то, так сказать "для расширения кругозора" подскажи, как выглядел бы скрипт, если бы не требовалось очищать выгрузку от неуникальных записей "Имя О. Фамилия", но поиск в AD осуществлялся бы только для уникальных записей "Имя О. Фамилия"?
Но если не сложно, то, так сказать "для расширения кругозора" подскажи, как выглядел бы скрипт, если бы не требовалось очищать выгрузку от неуникальных записей "Имя О. Фамилия", но поиск в AD осуществлялся бы только для уникальных записей "Имя О. Фамилия"?
-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Код:
Код: Выделить всё
Group {"{0} {1}. {2}" -f $_.Name1,$_.Name2[0],$_.LastName} | Foreach {
if($_.Count -eq 1) {
$name = $_.Name
$sam = (Get-QADUser -DisplayName $name).SamAccountName
if($sam) {
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $sam -PassThru
}
else {
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value "" -PassThru
}
}
else {
$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value "неуникальный" -PassThru
}
}-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Kazun, ну и последний гипотетический вопрос: как можно организовать поэтапную работу скрипта, на каждом этапе обрабатывая записи с фамилиями только на одну букву (А, Б, В...) из единого файл-источника?
-
IvanXXL
Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Kazun,
Цитата Kazun:
Делайте двойное группирование.
Можно немного поподробнее? Я не понял, как это реализуется.
Цитата Kazun:
Делайте двойное группирование.
PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD
Можно немного поподробнее? Я не понял, как это реализуется.