我正在尝试使用 Powershell 从 Active Directory 中获取一些信息,但我遇到了一些奇怪的行为。这是我的脚本:
$toFind = ( 'bobjones', 'samsmith' )
filter Get-AdUser {
$strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$colProplist = ("name", "department")
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}
($objSearcher.FindAll() | %{$_.Properties})
}
"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!
前者打印出我所期望的,一个属性表;后者最终只是反复打印“0 1”,但我不知道为什么。为什么单一案例可以工作,而不是数组?
您可能必须指定一个 foreach 循环,例如 foreach ($user in $toFind) { get-aduser $user }
如果您只是在提示符处键入 $toFind 会发生什么?我假设它会列出两个名称,每行一个,就像它应该的那样。
我尝试对我的 AD 运行相同的代码并得到以下结果:0 1
名称值 ---- ----- 名称 {Sahnti L. Aphil} adspath {LDAP://CN=Sahnti L. Aphil,OU=Users,OU=Jackson,DC=company,DC=local} 0 1 名称{Hamong Justice} 广告路径 {LDAP://CN=Hamong Justice,OU=Users,OU=Jackson,DC=company,DC=local}
只是一个旁注:我强烈建议查看 Quest AD cmdlet 包 ( http://www.quest.com/powershell/activeroles-server.aspx ) 以了解所有与 AD 相关的 powershell 内容。它填补了一个漏洞,因为 powershell 中的内置 AD 支持非常糟糕。它将为您节省大量的开发时间。
想通了,它与PowerShell无关。创建 DirectoryEntry 时:
它只会为您的域返回结果(即,如果您有一个像“NorthAmerica”和“Europe”这样的 AD 森林,它只会查询您所在的那个)。碰巧我正在搜索的所有名称都在另一个域中。
如果您使用构造函数手动指定域,它工作得很好(虽然还没有弄清楚如何查询所有域......)
您要做的是查询全局目录,因为您要搜索整个森林。有几种方法,但最简单的方法是将搜索根更改为 GC。例如
或者,您可以查询森林,然后向它询问全局目录列表,并将其中一个用作初始目录条目,但这是一个足够简单的更改,只要您正在搜索的字段位于 GC 中,它就可以满足您的需求。在您的情况下,搜索部分应该不是问题,因为您正在按默认情况下是全局的用户名进行搜索,但您不会从搜索结果结果中获取部门字段,因为部门默认情况下不是全局的。要获得它,您将需要使用搜索结果中的专有名称对完整 AD 用户对象的用户域进行后续 AD 查找,然后将部门拉出。您可以更改您的架构,以便 Department 是全球性的,但这会有点激进 IMO。
您可以在此处找到默认全局属性的完整列表。
仅供参考,您获得 0 和 1 输出的原因是因为对 $objSearcher.PropertiesToLoad.Add() 的调用返回了添加的属性的索引(第一个属性为 0,第二个属性为 1)。对于脚本中的每个用户,这将发生一次。您可以通过将返回值传递给 Out-Null 来抑制返回值。