PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD

Ответить
 • Просмотры: 2
Аватара пользователя
IvanXXL

Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD

Сообщение IvanXXL »

Kazun, если не сложно, то прошу прокомментировать работу кода, в частности мне непонятна строка "$name = $_.Name".
Аватара пользователя
IvanXXL

Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD

Сообщение IvanXXL »

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],$_.Фамилия}
Count Name                      Group
----- ----                      -----
    2 Василий А. Пупкин         {@{Фамилия=Пупкин; Имя=Василий; Отчество=Алибабаевич; ТН=0009876543; ДР=19.02.1966
    1 Адексааа А. Бульба        {@{Фамилия=Бульба; Имя=Адексааа; Отчество=Алибабаевич; ТН=0009876543; ДР=19.02.1966

3) Далее передаем по конвейеру и фильтруем уникальные элементы.



Код:

Код: Выделить всё

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

Сообщение IvanXXL »

Kazun, спасибо за подсказку.



Я отказался от русских имен в заголовках:

было

Фамилия;Имя;Отчество;ТН;ДР;СНИЛС;Организация;Подразделение;Должность;Дата приема;Дата увольнения

стало

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

Сообщение Kazun »

Использовал версию V3,для V2:



Код:

Код: Выделить всё

$_.Group | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $sam -PassThru
Аватара пользователя
IvanXXL

Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD

Сообщение IvanXXL »

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

Сообщение IvanXXL »

Kazun, еще раз спасибо за помощь в решении.

Но если не сложно, то, так сказать "для расширения кругозора" подскажи, как выглядел бы скрипт, если бы не требовалось очищать выгрузку от неуникальных записей "Имя О. Фамилия", но поиск в AD осуществлялся бы только для уникальных записей "Имя О. Фамилия"?
Аватара пользователя
IvanXXL

Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD

Сообщение IvanXXL »

Код:

Код: Выделить всё

 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

Сообщение IvanXXL »

Kazun, ну и последний гипотетический вопрос: как можно организовать поэтапную работу скрипта, на каждом этапе обрабатывая записи с фамилиями только на одну букву (А, Б, В...) из единого файл-источника?
Аватара пользователя
IvanXXL

Re: PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD

Сообщение IvanXXL »

Kazun,
Цитата Kazun:



Делайте двойное группирование.
PowerShell - [решено] Сопоставление сотрудников из 1С учетным записям в AD




Можно немного поподробнее? Я не понял, как это реализуется.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»