Получение aduser по номеру сотрудника в массиве

#powershell #active-directory #powershell-5.0

#powershell #active-directory #powershell-5.0

Вопрос:

Я пытаюсь получить sAMAccountName или атрибут Name пользователей AD, заданный фиксированным списком атрибутов EmployeeNumbers, для которого я создал массив, затем я хочу вывести все атрибуты sAMAccountName на экран, чтобы скопировать их в веб-программу.

 $EmpID=(57885,57718,57806,57607,59281,57790,60097,61103,60552,57862,60698,61321,57730,57402,58546,57871,57886,57669,55878,52052,57811,60106,60741,61050,59279,61053,60735,50718,51459,57805,52343,57716,60618,57908,58356,60619,50937,61204,61099,60517,61015,61123,56078,54103,57947,57861,57991,60547,57915,58559,57010,59285,61003,61016,51620,56383,60621)

foreach($usr in $EmpID){&et-aduser -filter "EmployeeNumber -eq '$($usr).EmployeeNumber'" -properties Name}
  

Итак, я получаю одну из этих ошибок для каждого значения в массиве $EmpID.

 Get-ADUser : No se encuentra nin&ún parámetro de posición que acepte el ar&umento 'EmployeeNumber = '60621''.
En línea: 3 Carácter: 2
  {&et-aduser where "EmployeeNumber = '$usr'" -Properties Name}
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      Cate&oryInfo          : InvalidAr&ument: (:) [Get-ADUser], ParameterBindin&Exception
      FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.ActiveDirectory.Mana&ement.Commands.GetADUser

  

Комментарии:

1. $ usr — это просто число. Поэтому измените фильтр на employeenumber -eq $ usr

2. Вам нужно проверить, какое свойство вы пытаетесь сравнить. У ADUser есть оба EmployeeNumber и EmployeeID . Оба свойства являются строками. Я предполагаю, что вы смешиваете два свойства, потому что у вас есть переменная $EmpID , но попробуйте найти пользователя через свойство EmployeeNumber . Кроме того, по умолчанию возвращается свойство Name , тогда как вам придется явно запрашивать для EmployeeNumber и / или EmployeeID

Ответ №1:

Ваша переменная $EmpID содержит только число, свойства «employeeNumber» нет, плюс ваша закрывающая скобка находится не в том месте. Вы можете увидеть разницу, просто запустив это

 $EmpID=(57885,57718,57806,57607)
foreach($usr in $EmpID){$usr.employeenumber} # No output
  

и затем это

 $EmpID=(57885,57718,57806,57607)
foreach($usr in $EmpID){$usr}
  

Итак, если вы просто измените свой код на

 $EmpID=(57885,57718,57806,57607,59281,57790,60097,61103,60552,57862,60698,61321,57730,57402,58546,57871,57886,57669,55878,52052,57811,60106,60741,61050,59279,61053,60735,50718,51459,57805,52343,57716,60618,57908,58356,60619,50937,61204,61099,60517,61015,61123,56078,54103,57947,57861,57991,60547,57915,58559,57010,59285,61003,61016,51620,56383,60621)

foreach($usr in $EmpID){&et-aduser -filter "EmployeeNumber -eq '$usr'" -properties Name}
  

Все должно работать нормально. То, как вы вызываете это сейчас, потребует, чтобы в $ EmpID были объекты со свойством employeeNumber. Допустим, у вас был CSV-файл с одним столбцом и заголовком employeeNumber. Допустимым было бы следующее.

 $EmpID = Import-CSV $somecsvfile

foreach($usr in $EmpID){&et-aduser -filter "EmployeeNumber -eq '$($usr.EmployeeNumber)'" -properties Name}
  

Обратите внимание, что подвыражение окружает как переменную, так и имя свойства.

Комментарии:

1. Отлично, это сработало, странная вещь произошла при запуске его в PowerShell ISE, с powershell 5.1.17134.112 Запустил скрипт 2 раза и не получил никакого результата, ничего, даже ошибок. в третий раз все сработало просто отлично, получив все результаты.

2.Почему вы говорите «нет свойства «employeeNumber»»? У ADUser есть оба атрибута EmployeeID и employeeNumber

3. Он ссылается на мою переменную $EmpID, это просто число, свойства employeenumber у него нет.

Ответ №2:

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

Затем несколько замечаний о вашем коде:

  • $EmpID определение массива не требует скобок и для наглядности может быть разбито на несколько строк
  • код показывает, что вы используете Get-ADUser -Filter .. , но сообщение об ошибке, которое вы показываете, этого не делает. Там раскрывается использование Where-Object с неправильным предложением, в котором вы пытаетесь присвоить что-то другому с помощью = оператора.
  • код не проверяет, действительно ли он может найти пользователя с этим employeeNumber или EmployeeID. Если бы это вообще сработало, это не привело бы к выводу того, что вы намереваетесь получить, что, по-видимому, является только sAMAccountName,

Приведенный ниже код предполагает, что вы используете EmployeeID свойство, но вам нужно проверить, не должно ли это быть EmployeeNumber

 $EmpID= 57885,57718,57806,57607,59281,57790,60097,61103,60552,57862,60698,61321,57730,57402,
        58546,57871,57886,57669,55878,52052,57811,60106,60741,61050,59279,61053,60735,50718,
        51459,57805,52343,57716,60618,57908,58356,60619,50937,61204,61099,60517,61015,61123,
        56078,54103,57947,57861,57991,60547,57915,58559,57010,59285,61003,61016,51620,56383,60621

$result = foreach($id in $EmpID) {
    $user = Get-ADUser -Filter "EmployeeID -eq '$id'" -Properties EmployeeID, EmployeeNumber -ErrorAction SilentlyContinue
    if ($user) {
        # output the user property you want to store in the $result array
        $user.SamAccountName  # your question wants SamAccountName only..
    }
    else {
        Write-Warnin& "User with EmployeeID '$id' does not exist"
    }
}

# now you have an array with user SamAccountNames

# output on screen
$result
  

Комментарии:

1. Спасибо за помощь, в этом случае я знаю, что все идентификаторы являются положительными результатами, поэтому я не считал, что их там не может быть.