System.DirectoryServices.DirectorySearcher работает при вызове из PowerShell, но не при вызове из cmd.exe

Я написал скрипт для PowerShell 1.0 (теперь использую 2.0), который выполняет поиск в моей Active Directory. Код следующий:

$filter = "some filter"

$rootEntry = New-Object System.DirectoryServices.DirectoryEntry

$searcher = New-Object System.DirectoryServices.DirectorySearcher
$searcher.SearchRoot = $rootEntry
$searcher.Filter = $filter
$searcher.SearchScope = "Subtree"

$colResults = $searcher.FindAll()

После вызова метода FindAll() экземпляра DirectorySearcher я распечатываю результаты, чтобы посмотреть, что у меня получилось.

Дело в том, что если я запускаю PowerShell.exe и вызываю скрипт в командной строке, я могу увидеть результаты. Но если я попытаюсь вызвать его с помощью cmd.exe, используя тот же фильтр, я не увижу никаких результатов. FindAll() возвращает пустой набор результатов.

Я запускаю это на сервере Windows 2003. Он не поставлялся с PowerShell 1.0, поэтому я скачал его и установил на сервер. У него есть .Net Framework 2.0.

Какие-либо предложения?

Большое спасибо.


person jmend    schedule 29.05.2011    source источник
comment
Если на сервере установлен пакет обновления 2 (SP2), то поддерживается PowerShell 2.0. См. support.microsoft.com/kb/968929.   -  person TrueWill    schedule 30.05.2011
comment
Да, спасибо, я пытался установить PowerShell 2.0, но он говорит, что мне требуется .Net Framework 2.0 SP1. Я бы предпочел ничего не устанавливать на серверы клиентов, но это вариант, который я буду иметь в виду.   -  person jmend    schedule 30.05.2011
comment
Поэтому я обновился до 2.0, чтобы посмотреть, решит ли это проблему. Но я все еще получаю те же результаты.   -  person jmend    schedule 30.05.2011
comment
Я бы просто назвал это из PowerShell. Я редко использую cmd.exe больше. Мой комментарий заключался в том, что сейчас нет особых причин использовать v1.0.   -  person TrueWill    schedule 30.05.2011
comment
Хорошо, да, я понял тебя. Знаете ли вы, есть ли какие-то настройки контекста или среды, которые мешают DirectorySearcher получать результаты? Я имею в виду, что я нигде не указываю ip-адрес или учетные данные сервера AD, поэтому может ли быть так, что при вызове из cmd.exe скрипт использует неверные значения?   -  person jmend    schedule 30.05.2011
comment
Извините, я не знаю. Я бы предложил изменить пометку как powershell-v2.0; это может привлечь больше людей, чтобы посмотреть на вопрос.   -  person TrueWill    schedule 30.05.2011
comment
Я снова пометил powershell-v2.0. Спасибо за вашу помощь.   -  person jmend    schedule 30.05.2011
comment
Вы также можете проверить quest.com/powershell/activeroles-server.aspx. - это то, что мы используем в работе. Они делают AD очень легким.   -  person TrueWill    schedule 30.05.2011


Ответы (2)


По умолчанию ваша $rootEntry указывает на корень вашего локального AD, если вы работаете на сервере, и это с учетными данными текущего процесса. вы не показываете, какой у вас фильтр и как вы используете свой результат.

Вот небольшой пример поиска ADSI из PowerShell.

Clear-Host
# ADSI Bind with current process credentials
#$dn = [adsi] "LDAP://192.168.30.200:389/dc=dom,dc=fr"
# ADSI Bind with specific credentials
$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://192.168.183.138:389/dc=societe,dc=fr","[email protected]","test.2011")


# Look for users

$Rech = new-object System.DirectoryServices.DirectorySearcher($dn)
$rc = $Rech.filter = "((objectCategory=person))"
$rc = $Rech.SearchScope = "subtree"
$rc = $Rech.PropertiesToLoad.Add("distinguishedName");
$rc = $Rech.PropertiesToLoad.Add("sAMAccountName");  
$rc = $Rech.PropertiesToLoad.Add("ipphone");  
$rc = $Rech.PropertiesToLoad.Add("telephoneNumber");
$rc = $Rech.PropertiesToLoad.Add("memberOf");
$rc = $Rech.PropertiesToLoad.Add("distinguishedname");
$rc = $Rech.PropertiesToLoad.Add("physicalDeliveryOfficeName"); # Your attribute

$liste = $Rech.findall()
person JPBlanc    schedule 30.05.2011
comment
Спасибо. Добавил URL-адрес LDAP и учетные данные, но проблема не устранена. Нужно ли мне импортировать какой-то модуль или какой-то профиль? Я хочу получить информацию о членстве в группе пользователей, поэтому я использую этот фильтр (|(member=$dn)(member=$uid)). После поиска я просто печатаю отличительное имя группы. - person jmend; 30.05.2011
comment
Пожалуйста, не могли бы вы дать точную команду, которую вы пишете в командной строке CMD.EXE - person JPBlanc; 30.05.2011
comment
Конечно, вот оно: ››powershell -command ./script.ps1 dn uid - person jmend; 31.05.2011
comment
Я был на правильном пути, -file позволяет вам выполнять файл .PS1, он правильно обрабатывает аргументы, которые не работают в PowerShell V1.0 -command имитирует команду так же, как вы, где в Powershell, но для запуска скрипта вам лучше использовать invoke-expression powershell -command & {invoke-expression '.\script.ps1 \dn\ \uid\ '} - person JPBlanc; 31.05.2011
comment
Спасибо за вашу помощь. Я тоже попробую. - person jmend; 01.06.2011

Наконец, он заработал, выполнив две вещи:

  1. Обновите до PowerShell 2.0.
  2. Запустите с опцией -File.

Таким образом, команда выполнялась следующим образом:

>>powershell -file ./script.ps1 "dn" "uid"

Я не уверен, в чем разница между параметрами -File и -Command (кто-нибудь знает?), но это сработало.

Спасибо.

person jmend    schedule 30.05.2011