【问题标题】:Is there a better way to get AD group members for a given list of AD group ObjectGUIDs?对于给定的 AD 组 ObjectGUID 列表,是否有更好的方法来获取 AD 组成员?
【发布时间】:2018-12-27 23:08:37
【问题描述】:

我有一个存储在 CSV 中的 ObjectGUID(其中 49 个)列表,我正在输出一个 CSV,其中包含这些组的所有成员的列表,格式如下: "LastName, FirstName" , "AD Group姓名” 我让它工作(大部分时间;有时我从 Add-Content cmdlt 收到 IOException 错误),但它非常慢(8000 名成员需要大约 30 分钟)。我对 Powershell 没有很多经验,但我觉得有更好/更有效的方法来做到这一点。关于如何提高效率的任何想法?

注意:我使用“-Server”开关,因为我实际上必须跨几个不同的域运行此脚本,所以我粘贴的代码在我的原始代码中重复了两次,使用不同的 CSV 输入,以及不同的域传递给“-Server”开关。

#read in CSV of ObjectGUIDs
$guids = Import-CSV .\ObjectGUIDs.csv

#loop through each AD group
foreach($group in $guids) {
    $group_name = Get-ADObject -identity $group.objectGUID -server myDomain
    $group_name = $group_name.Name

    #get list of users in current group
    $users = get-adgroupmember  -server myDomain -identity 
             $group.ObjectGUID | where {$_.objectclass -eq 'user'}

    #loop through each user of the current group
    foreach ($user in $users) {
        #get display name of current user
        $display_name = get-aduser -identity $user.objectGUID -server 
                        myDomain -properties DisplayName
        #build the current row
        $row =  ('"' + $display_name.DisplayName + '"' + ',' + '"' + 
                 $group_name + '"')
        add-content -path "C:\Path\to\output.csv"  -value $row
    }
}

正如我上面所说,这通常有效,但需要很长时间。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    [PSCustomObject] 中收集数据并仅使用Export-Csv 一次应该更有效。

    ## Q:\Test\2018\12\27\SO_53946702.ps1
    
    $guids = Import-CSV .\ObjectGUIDs.csv
    $CsvFile = "C:\Path\to\output.csv"
    $Server = myDomain
    
    $CsvData = foreach($group in $guids) {
        $GroupName = (Get-ADObject -identity $group.objectGUID -server $Server).Name
    
        #get list of users in current group
        $users = Get-ADgroupMember  -Server $Server -Identity $group.ObjectGUID |
                  Where-Object ObjectClass -eq 'user'
    
        foreach ($user in $users) {
            [PSCustomObject]@{
                DisplayName = (Get-ADuser -Identity $user.objectGUID -server $Server -Properties DisplayName).DisplayName
                GroupName   = $GroupName
            }
        }
    }
    $CsvData | Export-Csv $CsvFile -NoTypeInformation
    

    【讨论】:

    • 还可以通过用户的 SID 缓存Get-ADUser 的结果,例如,这可以节省一些时间,因为此代码每次遇到任何组中的用户时都会向 AD 请求用户详细信息。这也不考虑 rtansient 组成员身份 - 但 TS 没有说明它是必需的。
    • 你能提供一些'缓存(ing)Get-ADUser'结果的示例代码吗?这与使用每个用户的 ObjectGUID 来获取他们的 DisplayName 有什么不同吗?另外,什么是临时组成员?我用谷歌搜索了它,但没有找到那个具体的名字。
    • 要让@Vesper 注意到您的评论,请像我对领先的@ 那样称呼他
    • @Vesper 见我上面的评论。
    • @deano 瞬态组成员资格是一种结构,其中 Group1 有 Group2 作为其成员,而 Group2 中有用户,然后这些用户也被评估为 Group1 的成员,但不会显示在 Group1 的 @987654326 中@ 列表。缓存是通过字典类型的全局对象完成的,然后您执行if {dic[$_.samaccountname] -eq $null} {dic[$_.samaccountname]=Get-ADUser $_.objectGUID ...},然后寻址dic[$_.samaccountname],而不是始终调用Get-ADUser
    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多