У меня проблемы с работой Powershell Linq "Join" [Явный набор аргументов?] - PullRequest
0 голосов
/ 03 мая 2018

Я работал над подготовкой сценариев между Oracle и Active Directory и, в частности, используя сценарии Powershell. Я нашел отличный ресурс по использованию Linq в Powershell ( High Performance Powershell от Michael Sorens), но у меня возникли проблемы с методом JOIN, и я думаю, что это может быть связано с тем, как я пытаюсь печатать мои аргументы. Я должен признать, что не полностью понял пример на странице ( Cross-Join ). Я создам проблему, а затем покажу, что я пытаюсь (пока что не получилось).

У меня есть запрос к базе данных, который возвращает пользователей, которые должны быть в Active Directory, и у меня есть команда «Get-ADUser», которая получает всех, кто находится в Active Directory. Ранее я использовал оператор «Кроме», уменьшив количество свойств в обоих до идентификатора (samaccountname). Таким образом, на тот момент я мог получить всех, кто должен был быть добавлен, а также всех, кто должен был быть удален. Но теперь я был сокращен до списка идентификаторов (т. Е. Больше не было полного набора полей, которые мне были бы необходимы ... либо для добавления записи AD, либо для отправки электронного письма "Вы собираетесь быть удаленным").

Итак, видя оператора Join, я решил снова присоединить список удаления к набору результатов AD "get all users". Но ... я продолжаю получать ошибку

Cannot find an overload for "Join" and the argument count: "5"

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

$ad_host="my.adserver.edu"

$left = Get-ADUser -Server $ad_host -Identity 'knownuser' -Properties sAMAccountName | select sAMAccountName
$right = Get-ADUser -Server $ad_host -Filter * -SearchBase "OU=KnownUsersOU,OU=Students,OU=Users-Students,DC=my,DC=domain,DC=edu" -Properties sAMAccountName, givenName, sn | select sAMAccountName, givenName, sn

$outerKeyDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,string]] { $args[0].sAMAccountName }
$innerKeyDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,string]] { $args[0].sAMAccountName }
#$resultDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,Microsoft.ActiveDirectory.Management.ADAccount,string,string]] {'{0}, {1}, {2}, {3}, {4}' -f $args[0].sAMAccountName, $args[1].givenName, $args[1].sn, $args[1].mail, $args[1].employeeID }
$resultDelegate = [Func[Microsoft.ActiveDirectory.Management.ADAccount,string,string]] {'{0}, {1}' -f $args[0].sAMAccountName, $args[1].sAMAccountName }

[Linq.Enumerable]::Join($toRemove, $allUsers, $outerKeyDelegate, $innerKeyDelegate, $resultDelegate) | foreach { Add-Content -Path to_delete.csv -Value $_ }

Итак, в этом случае я пытаюсь явно указать свои свойства соединения как объекты Microsoft.ActiveDirectory.Management.ADAccount ... Я фактически изначально использовал «строку», поскольку фактическим свойством соединения было имя samaccountname, и когда я запустил getType (), он вернул «String» ... ну, на самом деле это было «Name: String, BaseType: System.Object».

На данный момент то, что я знаю, перевешивается тем, что я не знаю :) Я мог бы сделать это ЛЕГКО, переместив все это в базу данных, чтобы составить «список», но, похоже, это будет много более элегантно, если бы я мог освоить Powershell-Linq!

1 Ответ

0 голосов
/ 03 мая 2018

Я считаю, что ваша проблема с типами. Рассмотрим эту команду:

$left = Get-ADUser -Server $ad_host -Identity 'knownuser' -Properties sAMAccountName | select sAMAccountName

Тип этого объекта будет ADUser.

И для этой команды:

$right = Get-ADUser -Server $ad_host -Filter * -SearchBase "OU=KnownUsersOU,OU=Students,OU=Users-Students,DC=my,DC=domain,DC=edu" -Properties sAMAccountName, givenName, sn | select sAMAccountName, givenName, sn

Тип объекта будет Object[]. Это должно быть ADUser[].

Вы должны иметь возможность разыграть его так:

$right = [Microsoft.ActiveDirectory.Management.ADUser[]](Get-ADUser -Server $ad_host -Filter * -SearchBase "OU=KnownUsersOU,OU=Students,OU=Users-Students,DC=my,DC=domain,DC=edu" -Properties sAMAccountName, givenName, sn)

Тогда, поскольку вы имеете дело с ADUser объектами, ваши ключевые делегаты также должны совпадать:

$outerKeyDelegate = [Func[Microsoft.ActiveDirectory.Management.ADUser,string]] { $args[0].sAMAccountName } $innerKeyDelegate = [Func[Microsoft.ActiveDirectory.Management.ADUser,string]] { $args[0].sAMAccountName }

и ваш делегат результата также должен соответствовать типу объектов, над которыми вы работаете (вы были ближе к закомментированному коду):

$resultDelegate = [Func[Microsoft.ActiveDirectory.Management.ADUser,Microsoft.ActiveDirectory.Management.ADUser,string]] {'{0}, {1}' -f $args[0].sAMAccountName, $args[1].sAMAccountName }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...