如果从PowerShell调用System.DirectoryServices.DirectorySearcher,则工作,但如果从cmd.exe调用则不行

时间:2011-05-29 23:50:44

标签: scripting powershell active-directory cmd powershell-v2.0

我为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()

在调用DirectorySearcher实例的FindAll()方法之后,我打印结果以查看我得到的内容。

问题是,如果我启动PowerShell.exe并在提示符上调用脚本,我就能看到结果。但是,如果我尝试使用相同的过滤器使用cmd.exe调用它,我看不到任何结果。 FindAll()返回一个空结果集。

我在Windows 2003 Server上运行它。 PowerShell 1.0没有附带,所以我下载并将其安装在服务器上。它确实有.Net Framework 2.0。

有什么建议吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

通过默认您在本地AD的根目录上的$ rootEntry点,您在服务器上运行,并使用当前进程的凭据。你没有显示你的过滤器是什么以及你如何使用你的结果。

以下是PowerShell的一小部分ADSI搜索

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","administrateur@societe.fr","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()

答案 1 :(得分:1)

最后通过做两件事来完成它:

  1. 升级到PowerShell 2.0。
  2. 使用-File选项运行。
  3. 所以命令运行如下:

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

    我不确定-File和-Command选项之间有什么区别(有没有人?)但是它有效。

    感谢。