powershell hashtable.containsValue возвращает false, но цикл значений получает совпадение? - PullRequest
1 голос
/ 22 февраля 2011

Итак, я пытаюсь создать функцию в powershell, которая вложит все группы, в которые входит пользователь, в рекламу. Я отображаю группы в хеш-таблицу с общим именем из AD в качестве значения.

Все идет хорошо, и функция возвращает хеш-таблицу, содержащую все мои группы. но когда я запрашиваю это с помощью $group = "IT-Avd" $groups.ContainsValue($group)

Возвращает значение false, но когда я перебираю значения и выполняю такое же сравнение, я получаю совпадение! что происходит ??

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)`

1 Ответ

3 голосов
/ 22 февраля 2011

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...