是否使用Powershell从多个域中提取active directory组中的所有用户?

是否使用Powershell从多个域中提取active directory组中的所有用户?,powershell,ssis,active-directory,ldap,active-directory-group,Powershell,Ssis,Active Directory,Ldap,Active Directory Group,我在Active Directory或Powershell方面没有太多的专业知识,我需要获取所有用户以及属于1000多个安全组的详细信息 我在网上尝试了几种不同的PS脚本,但由于数据量大,脚本需要很长时间才能完成(在脚本持续运行3天后,我停止了脚本) 我还尝试过分解组列表,使用SSI一次运行100个组,但没有效果 我使用下面的第一个脚本来提取组成员,第二个脚本来提取其余的用户详细信息 另外,组和用户是来自多个子域的混合体 脚本1: $groups = Get-Content c:\temp\Gr

我在Active Directory或Powershell方面没有太多的专业知识,我需要获取所有用户以及属于1000多个安全组的详细信息

我在网上尝试了几种不同的PS脚本,但由于数据量大,脚本需要很长时间才能完成(在脚本持续运行3天后,我停止了脚本)

我还尝试过分解组列表,使用SSI一次运行100个组,但没有效果

我使用下面的第一个脚本来提取组成员,第二个脚本来提取其余的用户详细信息

另外,组和用户是来自多个子域的混合体

脚本1:

$groups = Get-Content c:\temp\Groups.txt      
foreach($Group in $Groups) {            
    Get-ADGroupMember -Id $Group | select  @{Expression=    {$Group};Label="Group Name"},* | Export-CSV c:\temp\GroupsInfo.CSV -    NoTypeInformation
}
$objForest =     [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$DomainList = @($objForest.Domains | Select-Object Name)
$Domains = $DomainList | foreach {$_.Name}
$Users = Import-CSV c:\users\public\users.csv
#Act on each domain
foreach($Domain in ($Domains))
{
    Write-Host "Checking $Domain" -fore blue
    Foreach($mail in ($Users.mail))
    {
        Get-ADUser -filter {mail -eq $mail} -Server $domain -properties     mail | select mail,employeeID,title,department,name

        Export-CSV c:\temp\MemberDetails.CSV -NoTypeInformation
    }
}

脚本2:

$groups = Get-Content c:\temp\Groups.txt      
foreach($Group in $Groups) {            
    Get-ADGroupMember -Id $Group | select  @{Expression=    {$Group};Label="Group Name"},* | Export-CSV c:\temp\GroupsInfo.CSV -    NoTypeInformation
}
$objForest =     [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$DomainList = @($objForest.Domains | Select-Object Name)
$Domains = $DomainList | foreach {$_.Name}
$Users = Import-CSV c:\users\public\users.csv
#Act on each domain
foreach($Domain in ($Domains))
{
    Write-Host "Checking $Domain" -fore blue
    Foreach($mail in ($Users.mail))
    {
        Get-ADUser -filter {mail -eq $mail} -Server $domain -properties     mail | select mail,employeeID,title,department,name

        Export-CSV c:\temp\MemberDetails.CSV -NoTypeInformation
    }
}

所以我不知道这是一个多大的答案,但这超出了评论所能容纳的范围。所以我要做的是创建一个空哈希表,查询组的成员,并为哈希表中的每个用户创建一个条目。然后,对于每个额外的组,我会得到成员,我会对照哈希表检查是否已经有了用户信息,如果没有,我会查询该用户并将其添加到哈希表中。嗯,甚至可能有两个哈希表,一个用于组,每个组都有组名作为键,用户列表作为值,然后你可以交叉引用用户的哈希表,你可以这样输出各种信息

$GroupList = Get-Contant c:\temp\Groups.txt
$GroupHash = @{}
$UserHash = @{}
ForEach($Group in $Groups){
    $GroupHash.$Group = Get-ADGroupMember $Group

    ForEach($User in ($GroupHash.$Group|Where{!$UserHash.($_.distinguishedName)})){
        $UserHash.($User.distinguishedName) = Get-ADUser $User.distinguishedName -Server $($User.distinguishedName -replace "^.*?DC=" -replace ",DC=", ".") -Prop Mail
    }
}
在此之后,您将拥有
$GroupHash
,其中包含每个组的每个组成员的列表,并且您将拥有
$UserHash
,其中包含可能在任何组中的任何用户的用户详细信息。那么你如何输出这些信息取决于你

ForEach($Group in $GroupHash.Keys){
    $GroupHash.$Group.distinguishedName | ForEach{%UserHash.$_} | Select mail,employeeID,title,department,name | Export-CSV C:\Temp\$Group.csv -NoType
}
这将在C:\Temp文件夹中为每个组创建一个CSV文件,并包含组中每个人的用户详细信息


现在请注意,这些都不是递归的,因此如果有嵌套组的成员,您就不会得到这些成员,但是您的原始脚本不是递归的,因此我没有对此进行讨论。

针对一个拥有4300多个成员的组运行此操作

花了几分钟

$groupname = <whatever your group name is>
$servername = <whatever domain your group is with>

$dns = get-adgroup $groupname -server $servername -Properties member | select -ExpandProperty member
    $adobjects = @()
    $objqry = {
        param([string[]]$items)
        function GetAdsiObj {
            param($dn)
            $item = [adsi]$("LDAP://$_")
            $item.setinfo()
            return $item
        }
        return $items | select @{n='adsiobj';e={ GetAdsiObj $_}} | `
            select @{n='samaccountname';e={$_.adsiobj.properties.samaccountname[0]}}, `
                   @{n='name';e={$_.adsiobj.properties.name[0]}}, `
                   @{n='objectclass';e={$_.adsiobj.properties.objectclass[$_.properties.adsiobj.objectclass.count - 1]}}, `
                   @{n='dn';e={$_.adsiobj.path}}, `
                   @{n='useraccountcontrol';e={$_.adsiobj.useraccountcontrol[0]}}
    }
    $jobs = @()

    for($i= 0; $i -lt $dns.Count;$i += 250){
        $data = $dns[$i..$($i + 249)] 
        $jobs += Start-Job -ScriptBlock $objqry -ArgumentList (,$data)
    }

    $runningcount = {
        param($j)
        return $($j | ?{ $_.State -eq "Running" }).Count
    }
    $jobcount = $jobs.Count
    while($(&$runningcount $jobs) -gt 0){
        write-progress -activity "Processing members" -status "Progress:" `
        -percentcomplete (($jobcount- $(&$runningcount $jobs))/$jobcount*100)
    }
    $responses = $jobs | Wait-Job | Receive-Job
    $responses | %{ $adobjects += @($_) }
    $adobjects
$groupname=
$servername=
$dns=get-adgroup$groupname-server$servername-Properties成员| select-ExpandProperty成员
$ADObject=@()
$objqry={
参数([string[]]$items)
函数GetAdsiObj{
参数($dn)
$item=[adsi]$(“LDAP://$”)
$item.setinfo()
退货$item
}
return$items | select@{n='adsiobj';e={GetAdsiObj$|}}`
选择@{n='samaccountname';e={$\ adsiobj.properties.samaccountname[0]}`
@{n='name';e={$\u.adsiobj.properties.name[0]}`
@{n='objectclass';e={$\.adsiobj.properties.objectclass[$\.properties.adsiobj.objectclass.count-1]}`
@{n='dn';e={$\u0.adsiobj.path}`
@{n='useraccountcontrol';e={$\u0.adsiobj.useraccountcontrol[0]}
}
$jobs=@()
对于($i=0;$i-lt$dns.Count;$i+=250){
$data=$dns[$i..$($i+249)]
$jobs+=Start Job-ScriptBlock$objqry-ArgumentList(,$data)
}
$runningcount={
参数($j)
返回$($j |?{$|.State-eq“Running”}).Count
}
$jobcount=$jobs.Count
而($(&$runningcount$jobs)-gt 0){
写入进度-活动“处理成员”-状态“进度”:`
-完成百分比(($jobcount-$(&$runningcount$jobs))/$jobcount*100)
}
$responses=$jobs |等待Job |接收Job
$responses |%{$adobjects+=@($)}
$A对象

在哪里运行代码?如果从远程计算机运行,请尝试在DC上运行。@Cavalli-我没有访问DC服务器的权限,我正在运行windows enterprise(而不是windows server)的工作站上运行它。我遇到了完全相同的问题,我已通过在DC上本地运行脚本解决了这个问题。运行脚本时是否监控了工作站的性能(cpu使用率、内存…)?如果您熟悉PowerShell工作流,这可能是一个很好的选择。如果没有,您可能希望尝试将其作为作业运行,以提取组成员,以便可以一次查询多个组。另外,您是否确保删除重复的用户引用?假设一个用户在1000个组中的8个组中,您是尝试拉取用户信息8次还是仅拉取一次?此外,脚本1为每个组反复覆盖同一文件,因此您将得到的唯一输出结果是列表中的最后一个组。