我为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。
有什么建议吗?
非常感谢。
答案 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)
最后通过做两件事来完成它:
所以命令运行如下:
>>powershell -file ./script.ps1 "dn" "uid"
我不确定-File和-Command选项之间有什么区别(有没有人?)但是它有效。
感谢。