Scripting System.DirectoryServices.DirectorySearcher在从PowerShell调用时工作,但在从cmd.exe调用时不工作

Scripting System.DirectoryServices.DirectorySearcher在从PowerShell调用时工作,但在从cmd.exe调用时不工作,scripting,powershell,active-directory,cmd,powershell-2.0,Scripting,Powershell,Active Directory,Cmd,Powershell 2.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 = $rootEn

我为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()返回一个空结果集

我在Windows2003服务器上运行这个。它不是PowerShell 1.0附带的,所以我下载了它并将其安装在服务器上。它有.NETFramework2.0

有什么建议吗


非常感谢。

通过在本地广告的根目录上定义$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()

通过做两件事,最终实现了这一目标:

  • 升级到PowerShell 2.0
  • 使用-File选项运行
  • 所以命令是这样运行的:

    >>powershell -file ./script.ps1 "dn" "uid"
    
    我不确定-File和-Command选项之间的区别是什么(有人吗?),但它起了作用


    谢谢。

    如果服务器有SP2,则支持PowerShell 2.0。请看是的,谢谢,我试图安装PowerShell 2.0,但它说我需要.Net Framework 2.0 SP1。我不想在客户服务器上安装任何东西,但我会记住这是一个选项。所以我升级到2.0,看看这是否解决了问题。但我还是得到了同样的结果。我只是从PowerShell中调用它。我很少再使用cmd.exe了。我的评论是,现在没有什么理由使用v1.0。好的,是的,我明白了。您知道是否有某些上下文或环境设置阻止DirectorySearcher获取结果吗?我的意思是,我没有在任何地方指定AD服务器ip地址或凭据,因此当从cmd.exe调用脚本时,脚本是否可能使用不正确的值?谢谢。添加了LDAP Url和凭据,但仍然存在问题。我需要导入一些模块还是一些配置文件?我想获取用户组成员信息,因此使用此筛选器(|(member=$dn)(member=$uid))。搜索后,我只打印组的可分辨名称。请您给出在CMD.EXE promptSure中编写的确切命令,这是:>>powershell-command./script.ps1“dn”“uid”我的方法正确,-file允许您执行.ps1文件,它以正确的方式处理参数,在PowerShell V1.0中工作不太好-命令模拟命令与您在PowerShell中的位置完全相同,但要启动脚本,您最好使用“调用表达式”PowerShell-命令和{invoke expression'.\script.ps1\“dn\”“uid\”}谢谢您的帮助。我也会尝试一下。