【问题标题】:How to get list of selected AD Groups, that a large list of users are members of?如何获取大量用户所属的选定 AD 组列表?
【发布时间】:2017-06-29 18:40:56
【问题描述】:

我有以下工作脚本,用于检查 CSV 文件中的大量用户是否是 AD 组的成员,并将结果写入 results.csv。

不确定如何转换脚本,以便将$group = "InfraLite" 更改为$group = DC .\List_Of_AD_Groups.CSV

因此,该脚本不仅返回一个 AD 组的匹配项,而且还返回 List_of_AD_groups.csv 中包含的 80 个 AD 组的匹配项。在 CSV 的新列中为每个 AD 组写入一个是/否(或者如果不可能为每个组创建一个单独的 .csv 文件并提供结果也可以。

我可以通过更改 $group 的值和导出文件名来手动执行此操作,然后重新运行脚本 80 次,但必须快速使用 PS 来执行此操作?

例如results.csv:

名称 AD_GROUP1 AD_GROUP2 AD_GROUP80 等等等等。
用户 1 是 否 是
用户 2 不 不 是
user3 否 是 否
echo "UserName`InfraLite" >> results.csv

$users = GC .\user_list.csv
$group = "InfraLite"

$members = Get-ADGroupMember -Identity $group -Recursive |
           Select -ExpandProperty SAMAccountName

foreach ($user in $users) {
    if ($members -contains $user) {
        echo "$user $group`tYes" >> results.csv
    } else {
        echo "$user`tNo" >> results.csv
    }
}

【问题讨论】:

    标签: powershell active-directory export-to-csv


    【解决方案1】:

    我玩了一段时间,我想我找到了一种让你得到你想要的东西的方法。

    我认为 Ansgar 走在正确的道路上,但我无法完全按照您的要求去做。他提到在撰写本文时他没有访问 AD 环境。

    这是我想出的:

    $UserArray = Get-Content 'C:\Temp\Users.txt'
    $GroupArray = Get-Content 'C:\Temp\Groups.txt'
    $OutputFile = 'C:\Temp\Something.csv'
    
    # Setting up a hashtable for later use
    $UserHash = New-Object -TypeName System.Collections.Hashtable
    
    # Outer loop to add users and membership to UserHash
    $UserArray | ForEach-Object{
        $UserInfo = Get-ADUser $_ -Properties MemberOf
        # Strips the LPAP syntax to just the SAMAccountName of the group
        $Memberships = $UserInfo.MemberOf | ForEach-Object{
            ($_.Split(',')[0]).replace('CN=','')
        }
        #Adding the User=Membership pair to the Hash
        $UserHash.Add($_,$Memberships)
    }
    
    # Outer loop to create an object per user
    $Results = $UserArray | ForEach-Object{
        # First create a simple object
        $User = New-Object -TypeName PSCustomObject -Property @{
            Name = $_
        }
        # Dynamically add members to the object, based on the $GroupArray
        $GroupArray | ForEach-Object {
            #Checking $UserHash to see if group shows up in user's membership list
            $UserIsMember = $UserHash.($User.Name) -contains $_
            #Adding property to object, and value
            $User | Add-Member -MemberType NoteProperty -Name $_ -Value $UserIsMember
        }
        #Returning the object to the variable
        Return $User
    }
    
    #Convert the objects to a CSV, then output them
    $Results | ConvertTo-CSV -NoTypeInformation | Out-File $OutputFile
    

    希望这一切都说得通。我尽可能多地评论它。如果您没有在运行它的任何机器上安装 RSAT,那么转换为使用 ADSI 将非常简单。如果您需要,请告诉我,我会进行一些快速修改。

    我还在Gist 中提交了一个稍微修改过的版本供以后参考。

    【讨论】:

      【解决方案2】:

      解决问题的简单方法是将现有代码包装在另一个循环中,并为每个组创建一个输出文件:

      $groups = Get-Content 'C:\groups.txt'
      
      foreach ($group in $groups) {
          $members = Get-ADGroupMember ...
          ...
      }
      

      一种更优雅的方法是创建一个组映射模板,为每个用户克隆它,然后用用户的组成员身份填充副本。像这样的东西应该可以工作:

      $template = @{}
      Get-Content 'C:\groups.txt' | ForEach-Object {
        $template[$_] = $false
      }
      
      $groups = @{}
      Get-ADGroup -Filter * | ForEach-Object {
        $groups[$_.DistinguishedName] = $_.Name
      }
      
      Get-ADUser -Filter * -Properties MemberOf | ForEach-Object {
        $groupmap = $template.Clone()
        $_.MemberOf |
          ForEach-Object { $groups[$_] } |
          Where-Object { $groupmap.ContainsKey($_) } |
          ForEach-Object { $groupmap[$_] = $true }
        New-Object -Type PSObject -Property $groupmap
      } | Export-Csv 'C:\user_group_mapping.csv' -NoType
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多