Powershell内存错误,groupmembership

Powershell内存错误,groupmembership,powershell,Powershell,请任何人提出一个更好的解决方案,导出组成员基于过滤器。 每次执行下面的脚本时,我都会收到内存错误,尽管我已经实现了过滤器,但基于L1、L2用户ID进行过滤非常困难,因为有30000多个用户 我在执行时还遇到一个错误,无法解析给定标识powershell的目录对象 ForEach对象:引发了“System.OutOfMemoryException”类型的异常 我对导出组成员资格的要求仅为以下格式。速度非常慢,即使使用了过滤器,也需要4-5个小时才能导出 我的代码: $FilePath = "c:/

请任何人提出一个更好的解决方案,导出组成员基于过滤器。 每次执行下面的脚本时,我都会收到内存错误,尽管我已经实现了过滤器,但基于L1、L2用户ID进行过滤非常困难,因为有30000多个用户

我在执行时还遇到一个错误,无法解析给定标识powershell的目录对象

ForEach对象:引发了“System.OutOfMemoryException”类型的异常

我对导出组成员资格的要求仅为以下格式。速度非常慢,即使使用了过滤器,也需要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
为了避免“System.OutOfMemoryException”错误,您需要一次执行查询较少用户的脚本

[L1-L2]*在get qaduser中有一个Asrange行为,第一次使用L1*执行脚本,然后使用L2*执行脚本。如果这还不够,您需要更多的过滤器:L0*,然后是L10*,然后是L11*,然后是L12*,依此类推

对于调试无法解析给定标识powershell错误的目录对象,您需要知道在错误发生时为获取qadmemberof传递的值,该值可能不存在。

使用Get-QADUser cmdlet的参数-DontuseDefaultIncludeProperties。它减少了从active directory检索的数据

考虑跳过排序。这似乎总是减慢脚本的速度。我看不出在你的脚本中进行排序的原因

如果以后在脚本中不再需要$users,则应该直接处理对象,而不是将用户保存在变量中

Get-QADUser -SamAccountName [L1-L2]* -searchRoot $OuDomain -SizeLimit 0 -DontUseDefaultIncludedProperties | % {...
QADUser对象有两个名为MemberOf和NestedMemberOf的属性。这些属性包含用户是Direct和indirect成员的组的可分辨名称。这些是字符串属性,因此处理速度比cmdlet返回的对象数组快得多。但是,我假设您不需要NestedMemberOf,因为您没有在Get-QADMemberOf cmdlet中使用参数-Indirect

$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

L1和L2是什么?和[L1-L2]*什么是筛选?L1和L2是用户id前缀,如L100394、L200494为什么将用户的可分辨名称存储为域?但有n个用户,之后我需要将这些groupmembership与oracle进行比较,在oracle中,我可以使用powershell导出相同的值,而不会出现任何错误。我通过powershell和查询数据库连接oracle。嗨,Tom,谢谢你的回复,我已经执行了脚本,它在过去30分钟内仍在运行,实际上这个脚本是另一个脚本的一部分,我正在对用户进行排序,因为稍后我会将这些值与oracle数据库进行比较,oracle和AD中都存在用户id,因此我们面临同步问题。这就是为什么我想以这种格式导出user_id,以便比较。我会进一步反馈。我使用了上述建议,但没有任何效果。请查看此链接。谢谢@Naveenk您使用哪个版本的Quest cmdlet?我记得有一个verion是个记忆猪。我可以看到您仍然使用Get-QADMemberOf cmdlets,因为这一个抛出了例外。尝试从用户对象使用memberOf属性。您可以修改此行$user=$|选择对象dn、sAMAccountName、memberOf。您可以使用$user.memberOfActiveRoles管理Shell 1.5.1(Quest ActiveRoles Server 6的一部分)访问groupmemberships。7@Naveenk你现在能把你的密码发出去吗?在不知道您实施了哪些更改的情况下,很难进一步帮助您。也可以在上面我的帖子中看到我的编辑。排序结果比在代码中间排序好。