Powershell - 如何列出命名组的用户的用户名和组成员身份?

Powershell - 如何列出命名组的用户的用户名和组成员身份?

我对 powershell 比较陌生,在 cmd 行上有两个语句:

get-adgroupmember <group name> | select-object name,samaccountname

制作一个格式良好的表格,其中有两列,分别是人员的真实姓名和用户名。

get-adgroupmember <group name> | get-adprincipalgroupmembership | select-object name

生成命名组中每个用户所属的组列表。

我想把它们结合起来,这样我就有了一个用户的真实姓名+用户名,然后是每个用户所属的组,例如

name                samaccountname          memberof
----                --------------          --------
joe bloggs          jbloggs                 group1
                                            group2
                                            groupq

bob laithwaite      blaithwaite             group2
                                            groupm
                                            groupp
                                            groupq

或者可能

joe bloggs          jbloggs
group1
group2
groupq

bob laithwaite      blaithwaite
group2
groupm
groupp
groupq

有没有什么简单的方法可以实现这个?我并不太在意它是否美观。

如果没有简单的方法,有人能给我指点一下如何用困难的方式创造这种东西吗?如果只有困难的方法,那么虽然一个可行的答案会很好,但我还是希望有指示可以开始,看看我是否可以自己制作一些东西。毕竟我还在学习。

我最初的 Google 搜索发现https://gallery.technet.microsoft.com/scriptcenter/Powershell-Get-users-who-b0420fe1但无法通过用硬编码字符串替换变量来使其在命令行上工作。这是我最终想要实现的,但只有 2 个组,然而,在第一个实例中,我希望从类似上面的输出开始。

我还发现如何生成一组用户所属的安全组列表?在编写这个问题的过程中,但这似乎只产生了与我在第二行中创建的使用 get-adprincipalgroupmembership 的列表类似的列表。

答案1

没有一行代码或一个命令可以满足您的需求,但只需编写一些脚本即可。我在下面起草了一个脚本,可以实现这个功能,它非常简单,您应该能够理解它的作用并根据您的需要进行修改。

ipmo activedirectory

$searchBase = "OU=someOU,DC=yourdomain,DC=com"

$userlist = Get-ADUser -Filter * -SearchBase $searchBase -Properties memberOf

$report = @()

Foreach ($user in $userlist)
{
    $name = $user.Name
    $SAM = $user.SAMAccountName
    $memberOf = $user.memberOf

    $i = 0 #if you only want the user and SAMAccountName to appear once you will need a counter like this, it'se easier to just display it on every row


    Foreach($Group in $memberOf)
    {
        $GroupName = $Group.Replace('CN=','')
        $rowGroup = $GroupName -replace ",.*"

        if($i -eq 0) #if you're happy to have username and SAMAccountName on each row you can skip this bit
        {
            $rowName = $name
            $rowSAM = $SAM
        }
        else
        {
            $rowName = ""
            $rowSAM = ""
        }

        $objRow = New-Object System.Object
        $objRow | Add-Member -MemberType NoteProperty -Name Name -Value $rowName
        $objRow | Add-Member -MemberType NoteProperty -Name SAMAccountName -Value $rowSAM
        $objRow | Add-Member -MemberType NoteProperty -Name GroupName -Value $rowGroup

        $report += $objRow

        $i++

    }

}

$report | ft

答案2

在您的帖子中,您没有指定用户列表的来源。看起来您获取了一个群组的用户,并查看他们还属于哪个群组。这与解决方案基本无关,因此我假设您有一个列表,然后$users从那里开始。

您想要做的是将两个命令的属性组合成一个输出流。这可以通过利用计算属性就像这样……

$Users | %{Select DisplayName,SamAccountName,@{N="Groups";E={(Get-ADuser $_.SamAccountName -Properties memberof).memberof}}}

您还可以使用类似以下方法:

Get-ADGroupMember $GroupName | %{Get-ADUser $_.SamAccountName -Properties memberof | Select Name, SamAccountName, memberof} 

答案3

您可以尝试这种方式,这将为您提供所有组的用户列表

$users = get-content \\filepath.txt
foreach($u in $users){
  $report += Get-Aduser $u -properties memberof| Get-ADGroup |select-object @{N="GroupName";E={$_.samaccountname}},@{N="username";E={$u}}
}

$report | Export-csv \\filepath.csv

相关内容