#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. Спасибо за помощь, в этом случае я знаю, что все идентификаторы являются положительными результатами, поэтому я не считал, что их там не может быть.