Powershell 对值和数组的行为有何不同?

Powershell 对值和数组的行为有何不同?

我尝试使用 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”,虽然我不确定为什么。为什么单例可以工作,而数组不行?

答案1

由于您要搜索整个林,因此您要查询全局目录。有几种方法,但最简单的方法是将搜索根更改为 GC。例如

$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)" 

或者,您可以查询林,然后向其请求全局目录列表,并使用其中一个作为初始目录条目,但这是一个足够简单的更改,只要您搜索的字段在 GC 中,它就可以完成您想要的操作。搜索部分在您的情况下应该不是问题,因为您按用户名搜索,默认情况下它是全局的,但您不会从搜索结果中得到部门字段,因为部门默认不是全局的。要获得它,您需要使用搜索结果中的可分辨名称对用户域进行后续 AD 查找以获取完整的 AD 用户对象,然后从中提取部门。您可以更改您的模式,使部门成为全局的,但在我看来这有点激进。

您可以找到此处的默认全局属性。

答案2

您可能必须指定 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} adspath {LDAP://CN=Hamong Justice,OU=Users,OU=Jackson,DC=company,DC=local}

答案3

附注:我强烈建议您研究一下 Quest AD cmdlets 包(http://www.quest.com/powershell/activeroles-server.aspx) 适用于所有与 AD 相关的 powershell 事物。它填补了一个空白,因为 powershell 中的内置 AD 支持非常糟糕。它将为您节省大量的开发时间。

答案4

仅供参考,您得到 0 和 1 的输出的原因是因为对 $objSearcher.PropertiesToLoad.Add() 的调用返回了已添加属性的索引(第一个属性为 0,第二个属性为 1)。脚本中的每个用户都会发生一次这种情况。您可以通过将返回值传递到 Out-Null 来隐藏它。

相关内容