foreach l oop выдает ошибку CategoryInfo: InvalidData: (:) [Get-ADUser], ParameterBindingValidationException - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь запустить командлет для каждого элемента списка. но я получаю ошибку ObjectNotFound: (*@{samAccountName=my_ad_username}*:ADUser) [Get-ADUser], ADIdentityNotFoundException для каждого элемента моего списка.

Ниже приведен командлет

$users = Get-ADUser -Filter "*" -SearchBase "OU=Europe,DC=myDC,DC=com" | select samAccountName

$fr_all_grp_assigned_to_different_users = Foreach ($user in $users){ 
        #Get-AdUser $user
    } 

Результат

> Get-ADUser : Cannot validate argument on parameter 'Identity'. The
> Identity property on the argument is null or empty. At line:6 char:20
> +         Get-aduser $user
> +                    ~~~~~
>     + CategoryInfo          : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException
>     + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser
> Get-ADUser : Cannot validate argument on parameter 'Identity'. The
> Identity property on the argument is null or empty. At line:6 char:20
> +         Get-aduser $user

Строка 6 относится к #Get-AdUser $user

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 20 февраля 2020

Внутри вашего l oop вам необходимо указать значение SamAccountName для параметра -Identity Get-ADUser.

Get-ADUser -Identity $user.SamAccountName

Объяснение:

Вы можете выполнить Get-ADUser, указав значения вручную для параметров или добавив объекты в команду, и предоставьте расширенное назначение параметров для динамического сопоставления значений с параметрами. Некоторые параметры позиционны в том смысле, что вам не нужно указывать имя параметра при запуске команды со значением (ями). Эти функции / концепции существуют в большинстве команд PowerShell.

В случае Get-ADUser Value, Value автоматически сопоставляется с параметром -Identity. -Identity ожидает одно из следующих значений:

  • Отличительное имя
  • GUID (objectGUID)
  • Идентификатор безопасности (objectSid)
  • Имя учетной записи SAM (sAMAccountName)

Get-ADUser имеет удобную функцию, позволяющую передавать объект типа Microsoft.ActiveDirectory.Management.ADUser (возвращаемый с сервера каталогов) через pipe или параметру -Identity, он автоматически выполнит поиск на основе предоставленных значений. Если вы предоставите ему какой-либо другой тип объекта, он не будет автоматически выбирать значения свойств для передачи -Identity. Трубопровод к Select SamAccountName возвращает PSCustomObject, а не ADUser объект, и тогда вы теряете удобство.

Как только вы имеете дело с объектами, которые не ADUser, вы должны предоставить -Identity фактическое значение, которое вы хотите запросить. В вашем случае это оставляет две опции.

Опция 1: Выберите только значения SamAccountName в исходном запросе

С помощью этой опции вы можете использовать -ExpandProperty или -Expand параметр Select-Object для возврата только значений целевого свойства.

$users = Get-ADUser -Filter * -SearchBase "OU=Europe,DC=myDC,DC=com" |
    Select-Object -ExpandProperty SamAccountName
$fr_all_grp_assigned_to_different_users = Foreach ($user in $users) {
    Get-ADUser $user
}

Опция 2. Использование оператора доступа к элементу (.) для прямого доступа к Значение SamAccountName

С помощью этой опции вы можете использовать синтаксис object.Property для получения значения Property.

# Using the singular object.Property ($user.SamAccountName)
$users = Get-ADUser -Filter * -SearchBase "OU=Europe,DC=myDC,DC=com" |
    Select-Object SamAccountName
$fr_all_grp_assigned_to_different_users = Foreach ($user in $users) {
    Get-ADUser $user.SamAccountName
}

Начиная с PowerShell v3, вы можете использовать тот же синтаксис в коллекции, чтобы вернуть коллекцию значений (collection.Property).

# Using collection.Property ($users.SamAccountName)
# $user contains only a SamAccountName value here
$users = Get-ADUser -Filter * -SearchBase "OU=Europe,DC=myDC,DC=com" |
    Select-Object -ExpandProperty SamAccountName
$fr_all_grp_assigned_to_different_users = Foreach ($user in $users.SamAccountName) {
    Get-ADUser $user
}
...