所以我正在尝试在PowerShell中创建一个函数,该函数嵌套用户在广告中成员的所有组。我将组映射到哈希表中,使用AD中的公用名作为值。
这很顺利,该函数返回一个包含我所有组的哈希表。但是当我使用它查询它
$group = "IT-Avd"
$groups.ContainsValue($group)
function get-groupmemberships ($workDN){
$ADobj = [ADSI]"LDAP://$workDN"
foreach ($currGroup in $ADobj.memberOf.Value){
if (!($currGroup -eq $null)){
#Write-Host "displayN:" $grpDetails.Name " | dn:" $currGroup " | "
if(!$groups.ContainsKey($currGroup)){
$grpDetails = [ADSI]"LDAP://$currGroup"
$groups.Add($currGroup,$grpDetails.Name)
#Write-Host "Adding new pair, " $grpDetails.Name " | " $currGroup
get-groupmembership $currGroup
}
}
}
return $groups
}
function get-DN ($SAMToFetch){
$strFilter = "(samAccountName=$SAMToFetch)"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.Filter = $strFilter
$objPath = $objSearcher.FindOne()
if($objPath){
$objFound = $objPath.GetDirectoryEntry()
$objDN = $objFound.distinguishedName
return $objDN}
else{
return $false
}
}
$groups = @{}
write-host "Start search:",(Get-Date -Format T),",",(get-Date -format fff)
$group = "IT-Avd"
$memberOf = get-GroupMemberships (get-DN jslonsetteig)
$groups.ContainsValue($group)
foreach( $val in $groups.Values){if ($val -eq $group){Write-Host $val "<--It does seem to be there..."}}
write-host "End search:",(Get-Date -Format T),",",(get-Date -format fff)`
答案 0 :(得分:3)
使用ContainsValue
正在使用哈希表的线性搜索,因此您将失去哈希表通常提供的O(1)搜索的好处。您可以尝试创建另一个哈希表,而公共名称是密钥。然后你可以使用ContainsKey
或者只是按名称尝试访问,看看结果是不是$ null。
$group
传递给ContainsValue
时,PowerShell不会对类型强制执行任何操作,因为该方法参数的类型为object
。但是,当它执行$val -eq $group
时,PowerShell可能会做很多工作来强制$group
到$val
的类型。虽然看起来$group
已经是一个字符串了,但是有一些psobject包装错误可能会在这里发挥作用(虽然只是猜测)。如果您尝试$groups.ContainsValue('IT-Avd')
会怎样?
您还可以检查哈希表中存储的类型,例如:
$groups.Values | Get-Member