0

我正在使用此脚本将大量信息提取到另一个程序使用的制表符分隔的纯文本文件中。该脚本运行良好,创建文件并用数据填充它,但是当它达到大约 250MB 的数据时,我收到下面列出的错误。我相信这是因为我只是想收集太多数据,但我不知道如何解决它!

脚本:

Import-module ActiveDirectory
    $Domain = 'DomainName'
    Get-ADGroup -Filter * -Properties * | ForEach-Object {
        $Group = $_
        Get-ADGroup $Group -Properties Members | Select-Object -ExpandProperty Members | Get-ADObject | ?{$_.ObjectClass -eq "user"} |  
            Get-ADUser -Properties * | Select-Object @{
              Name = 'Domain'
                Expression = { $Domain }
          }, @{
              Name = 'Group Name'
                Expression = { $Group.Name }
          }, @{
              Name = 'Type'
                Expression = { $Group.GroupCategory }
          }, @{
              Name = 'Description'
              Expression = { $_.Description }
          }, @{
                Name = 'Distinguished Name'
              Expression = { $_.DistinguishedName }
            }, @{
                Name = 'Managed By'
                Expression = { $Group.ManagedBy }
            }, @{
                Name = 'Members'
              Expression = { $_.MemberOf }
            }, @{
                Name = 'Full Name'
              Expression = { $_.Name }
            }, @{
              Name = 'User Name'
              Expression = { $_.SamAccountName }
          }, @{
              Name = 'Display Name'
              Expression = { $_.DisplayName }
          }
    } | Export-Csv -delimiter "`t" -path C:\Test.txt –nti

错误:

编辑:我曾尝试使用 directorysearcher 工具,因为我知道它可以解决索引问题,但是我无法正确获取代码。我需要获取用户和组信息。我有用户信息,但它没有为所有用户获取数据,我如何搜索域中的所有用户?

    Import-module ACtiveDirectory
    $Domain = 'domain'

    $strFilter = "(&(objectCategory=person)(objectClass=user))"
    $objCollection=@()
    $objDomain = New-Object System.DirectoryServices.DirectoryEntry

    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.PageSize = 1000
    $objSearcher.Filter = $strFilter
    $objSearcher.SearchScope = "Subtree"

    $colProplist = "name", "samaccountname", "description", "distinguishedname", "memberof", "displayname"
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    $colResults = $objSearcher.FindAll()

    $objCollection = $colResults | select -Expand Properties |
    select @{
        n = 'Domain'
            e = { $Domain }
    }, @{
        n = 'Group Name'
            e = { $Group.Name }
    }, @{
        n = 'Type'
            e = { $Group.GroupCategory }
    }, @{
        n = 'Description'
        e = { $_.description }
    }, @{
            n = 'Distinguished Name'
        e = { $_.distinguishedname }
        }, @{
            n = 'Managed By'
            e = { $Group.ManagedBy }
        }, @{
            n = 'Members'
        e = { $_.memberof }
        }, @{
            n = 'Full Name'
        e = { $_.name }
        }, @{
        n = 'User Name'
        e = { $_.samaccountname }
    }, @{
        n = 'Display Name'
        e = { $_.displayname }
    }

    $objCollection | Export-Csv -delimiter "`t" -path C:\Test9.txt -nti
4

1 回答 1

0

我想提供这个作为你的脚本的替代品。它使用 AD 管理单元,并根据需要构建用户列表。

Import-module ActiveDirectory
$Domain = 'DomainName'
$Groups = Get-ADGroup -Filter * -Properties Name,GroupCategory,ManagedBy,Members | ForEach-Object {
$Users = @()
$Results = @()
ForEach($Group in $Groups){
    $Group.Members | ForEach{  
        $UserDN = $_
        If($Users.DistinguishedName -contains $UserDN){
            $User = $Users | Where{$_.DistinguishedName -eq $UserDN}
        }Else{
            $User = Get-ADUser $UserDN -Properties DisplayName,Description,DistinguishedName,MemberOf,Name,SamAccountName
            $Users += $User
        }
        $Results += [PSCustomObject]@{
            'Domain' = $Domain
            'Group Name'= $Group.Name
            'Type' = $Group.GroupCategory
            'Description' = $User.Description
            'Distinguished Name' = $User.DistinguishedName
            'Managed By' = $Group.ManagedBy
            'Members' = $User.MemberOf
            'Full Name' = $User.Name
            'User Name' = $User.SamAccountName
            'Display Name' = $User.DisplayName
        }
    }
} 
$Results | Export-Csv -delimiter "`t" -path C:\Test.txt –nti

现在,如果这给您带来索引错误或内存问题,您可以收集每个组的用户,并将每个组输出到一个 CSV 附件中。为此,您将在ForEach($Group in $Groups){阅读后立即添加一个新行:

$GroupMembers = @()

更改$Results += [PSCustomObject]@{为:

$GroupMembers += [PSCustomObject]@{

最后将最后两行更改为:

    $GroupMembers | Export-Csv -delimiter "`t" -path C:\Test.txt –nti -append
}
于 2014-09-04T17:57:14.697 回答