Как отфильтровать AD с помощью конкатенированной переменной в Powershell

Я использую PowerShell v2 и модуль Microsoft AD для поиска в AD учетных записей, чей EmployeeID соответствует определенному идентификатору. Идентификатор обычно хранится в AD как «00000123456», но значение, которое я должен искать, — это только часть «123456». проблема в том, что я не могу понять, как сделать -подобный поиск в AD. вот мой текущий код

$EmpInfo = Import-csv "PSfile.csv"
$EmplID = EmpInfo.ID 
$EmpAD = get-aduser -Filter {employeeId -like "*$EmplID"} -Properties * -EA Stop

На данный момент EmpAD всегда пуст

Я могу обойти это, изменив EmpID так, чтобы он содержал «*123456», прежде чем вызывать Get-ADUser, и это работает. Но я не могу не думать, что есть проблема синтаксиса, препятствующая очевидному подходу. Исследования, направленные на ее устранение, оказались безрезультатными.


person uSlackr    schedule 27.09.2011    source источник


Ответы (2)


Если ваша строка действительно находится в атрибуте employeeID, вы можете проверить:

$EmpAD = get-aduser -LDAPFilter "(employeeId=*$EmplID)" -SearchBase 'DC=dom,DC=fr' -Properties *

вы можете использовать LDP.EXE (или ADSI.EXE), чтобы проверить, что именно существует в вашем каталоге.

----- Отредактировано -----

Для меня это работает, если я тестирую с LDIF:

C:\temp>ldifde -f eid.ldf -d "dc=dom,dc=fr" -r "(employeeId=*)"
Connexion à « WM2008R2ENT.dom.fr » en cours
Connexion en tant qu'utilisateur actuel en utilisant SSPI
Exportation de l'annuaire dans le fichier eid.ldf
Recherche des entrées...
Création des entrées...
3 entrées exportées

Есть 3 объекта

В PowerShell с командлетами AD это дает следующее:

PS C:\>  get-aduser -LDAPFilter "(employeeID=*)" | Measure-Object

    Count    : 3

А также

    $var = "123456"
    PS C:\>  get-aduser -LDAPFilter "(employeeID=*$var)" -properties employeeID

    DistinguishedName : CN=user1 Users,OU=MonOu,DC=dom,DC=fr
    EmployeeID        : 00000123456
    Enabled           : True
    GivenName         : user1
    Name              : user1 Users
    ObjectClass       : user
    ObjectGUID        : b5e5ea59-93a6-4b24-9c3e-043a825c412e
    SamAccountName    : user1
    SID               : S-1-5-21-3115856885-816991240-3296679909-1107
    Surname           : Users
    UserPrincipalName : [email protected]

Будьте осторожны: я не понимаю, почему, но между модификацией в каталоге с MMC и результатом в приглашении PowerShell прошло некоторое время. Я перезагружаю новый интерпретатор PowerShell и повторно импортирую модуль AD.

person JPBlanc    schedule 28.09.2011
comment
будет ли (employeeId=*$EmplID) соответствовать, если сохраненное значение равно 0000123456? Я использую (ну, во всяком случае, пытаюсь) * для соответствия оператору -like. Будет ли это работать с = ? - person uSlackr; 28.09.2011
comment
Спасибо @JP. Я протестирую это сегодня - person uSlackr; 29.09.2011

С точки зрения производительности, если вы знаете, что идентификаторы всегда представляют собой определенное количество цифр (с ведущими нулями), вам будет НАМНОГО лучше просто отформатировать идентификатор заранее.

Если ваш идентификатор должен состоять из 11 цифр, сделайте что-то вроде этого $EmplID.ToString("D11"), чтобы его заполнить.

person Brian Desmond    schedule 27.09.2011
comment
Мы будем обновлять 900 учетных записей раз в неделю, так что я не слишком беспокоюсь о производительности. Что касается набивки, я пытаюсь сделать это пуленепробиваемым. Если мне не нужно, чтобы идентификатор сотрудника был дополнен до полной длины, я бы предпочел не требовать его, поскольку это вызовет только ненужную ошибку. - person uSlackr; 28.09.2011