【问题标题】:Powershell script to return all Groups for a list of users from an import file用于从导入文件返回用户列表的所有组的 Powershell 脚本
【发布时间】:2014-05-02 15:50:48
【问题描述】:

这个脚本有点倒退,因为它需要返回用户所属的所有组。我让脚本工作,但它只返回导入文件中第一个用户的组,并为每个其他用户复制相同的组。

输入的示例:

"NetworkID","DisplayName"
"jasonid",Jason
anotherid
"mikeid","Mens, Mike"

我对 powershell(带有 AD 模块的第 2 版)相对较新,因此我们将不胜感激。这是我创建的脚本:

$out = @()

Import-Csv "$env:userprofile\Desktop\ADUsers.txt" | SELECT NetworkID | ForEach { 
$NetworkIDs = $_

ForEach ($NetworkID in $NetworkIDs) 
    {

    ForEach ($group in $groups) 
        {
            $obj = New-Object -TypeName PSObject

            $obj | Add-Member -MemberType NoteProperty -Name UserName -Value $NetworkIDs.NetworkID
            $obj | Add-Member -MemberType NoteProperty -Name GroupName -Value $group.name

            $out += $obj
        }
    }
}

$out | Format-table -AutoSize
$out | Export-Csv -path $env:userprofile\Desktop\ADUsers.csv –NoTypeInformation 

输出的一个例子是:

"UserName","GroupName"
"jasonid","Domain Group 1"
"jasonid","Domain Group 2"
"jasonid","Domain Group 3"
"anotherid","Domain Group 1"
"anotherid","Domain Group 2"
"anotherid","Domain Group 3"
"mikeid","Domain Group 1"
"mikeid","Domain Group 2"
"mikeid","Domain Group 3"

我 100% 确信“jasonid”是所有 3 个组的成员,“anotherid”不是“Domain Group 1”的成员,“mikeid”不是“Domain Group 3”的成员”。

【问题讨论】:

    标签: powershell active-directory powershell-2.0 active-directory-group activedirectorymembership


    【解决方案1】:

    有这么多嵌套的 ForEach 循环,这看起来相当复杂。让我们尝试简化它...

    这将加载 ActiveDirectory 模块,以便我们可以在 AD 中查找用户。然后它就像你一样制作空数组。然后,当它加载 CSV 时,它会选择并展开 NetworkID 属性并将其传递到管道中。我这样做的原因是,在管道中我们可以直接寻址字符串而不是具有 NetworkID 属性的对象(不需要$_.NetworkID,只需$_)。

    然后我从 AD 中提取用户的信息,并在用户的 MemberOf 属性上运行 ForEach,就像您一样为每个组添加一个条目。我以稍微不同的方式形成了新对象,因此所有属性都在那里开始,而不是创建一个对象,然后向它添加一个属性,然后向它添加另一个属性。它读起来非常相似,但更简单。

    Import-Module ActiveDirectory -ea sc
    $out = @()
    
    Import-Csv "$env:userprofile\Desktop\ADUsers.txt" | SELECT -Expand NetworkID | ForEach { 
        $User = Get-ADUser $_ -Prop MemberOf
        ForEach ($group in $User.MemberOf) {
            $obj = New-Object -TypeName PSObject -Property @{
                UserName = $User.samAccountName
                GroupName = $group  -replace "(CN=)(.+?)(,OU=.*)", "`$2"
            }
            $out += $obj
        }
    }
    
    $out | Format-table -AutoSize
    $out | Export-Csv -path $env:userprofile\Desktop\ADUsers.csv –NoTypeInformation 
    

    因此,就像我回应的大多数与 AD 组相关的事情一样,我们在这里有一个警告......这不涉及嵌套组。如果您想深入了解嵌套组,那么事情就会变得更加复杂,我们最好创建一个函数来做到这一点。作为嵌套组的示例,您可以查看我对 this question 的回答中最后一个脚本块中的 GetNestedUsers 函数。

    【讨论】:

    • 这更接近我希望实现的目标。经过几次调整,我能够让输出看起来更接近我需要的东西,但我被一个部分困住了。从 GroupName 中获取名称的最佳方法是什么?输出是这样的:“CN=Citrix Users,OU=Global,OU=Groups,DC=mycompany,DC=com”但我需要这样的东西:“Citrix Users”
    • 这样就完成了,但有没有更好的方法? GroupName = $group.SubString(3,$group.IndexOf(",")-3)
    • 使用正则表达式更新了答案,该正则表达式应该可以满足您的需求,并且在组或其他名称中有逗号的情况下会更加灵活。很抱歉回复慢,那里几天生病了。
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 2012-09-04
    • 2019-08-11
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多