Ошибка памяти Powershell, членство в группе - PullRequest
0 голосов
/ 10 февраля 2012

Может ли кто-нибудь предложить лучшее решение для экспорта членства в группах на основе фильтра. Каждый раз, когда я выполняю приведенный ниже сценарий, я получаю сообщение об ошибке памяти, хотя я реализовал фильтр, но очень трудно фильтровать базу по идентификатору пользователя L1, L2, потому что в нем более 30000 пользователей.

Также я получаю еще одну ошибку при выполнении "Cannot resolve directory object for the given identity powershell".

ForEach-Object: Exception of type 'System.OutOfMemoryException' was thrown.

Мое требование экспортировать членство в группе только в следующем формате. Это очень медленно, экспорт занимает 4-5 часов даже после использования фильтра.

Мой код:

$FilePath = "c:/Data/L_Accounts_Group_Membership_L1-L2.csv"
$OuDomain = "OU=test,OU=abc,OU=com1,DC=com2,DC=com3,DC=com4"
$users = Get-QADUser -SamAccountName [L1-L2]* -searchRoot $OuDomain -SizeLimit 0
$users | Sort-Object SamAccountName | % {
    $user = $_ | Select-Object dn, sAMAccountName
    if ($lastDomain -eq $user.dn) {
        $lastDomain = ""
    } else {
        $lastDomain = $user.dn
    }
    $groups = Get-QADMemberOf $_ | Select-Object -expandProperty Name
    $groups | % {
        $user2 = New-Object -TypeName PsObject -Property @{
                "Domain" = $lastDomain
                "sAMAccountName" = $user.sAMAccountName
                "Group" = $_
            }
        $user2
    }
} | export-csv $FilePath

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Используйте параметр -DontUseDefaultIncludedProperties для командлета Get-QADUser. Сокращает данные, извлекаемые из активной директории.

Подумайте, чтобы пропустить сортировку. Кажется, это всегда замедляет работу скриптов. В любом случае, я не вижу причины сортировки в вашем скрипте.

Вместо того, чтобы "сохранять" пользователей в переменной, вы должны обрабатывать объекты напрямую (если вам больше не нужны $ users позже в скрипте).

Get-QADUser -SamAccountName [L1-L2]* -searchRoot $OuDomain -SizeLimit 0 -DontUseDefaultIncludedProperties | % {...

Объект QADUser имеет два свойства: "MemberOf" и "NestedMemberOf" . Эти свойства содержат различающееся имя групп, в которые входит пользователь (прямые и косвенные). Это строковые свойства, поэтому они обрабатываются намного быстрее, чем массив объектов, возвращаемых из командлета. Я предполагаю, что вам не понадобится NestedMemberOf, потому что вы не использовали параметр -Indirect для командлета Get-QADMemberOf.

$result = $users | % {
    $SamAccountName = $_.SamAccountName
    if ($lastDomain -eq $_.dn) {
        $lastDomain = ""
    } else {
        $lastDomain = $_.dn
    }

    $_.MemberOf | % {
        $user = New-Object -TypeName PsObject -Property @{
                "Domain" = $lastDomain
                "SamAccountName" = $SamAccountName
                "Group" = $_
            }
        $user
    }
}

$result | sort-object SamAccountName | Export-CSV $FilePath
0 голосов
/ 10 февраля 2012

Во избежание ошибки 'System.OutOfMemoryException' необходимо выполнить скрипт, запрашивающий меньше пользователей одновременно.

[L1-L2] * имеют странное поведение в get-qaduser, выполняйте свой сценарий первый раз с помощью L1 *, а затем с помощью L2 *. Если этого недостаточно, вам нужен дополнительный фильтр: L0 *, затем L10 *, затем L11 *, затем L12 * и т. Д.

Для отладки ошибки "Cannot resolve directory object for the given identity powershell" необходимо знать значение, переданное Get-qadmemberof на момент ошибки, вероятно, не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...