【问题标题】:Output list of all Active Directory users and all groups each user is a member of所有 Active Directory 用户和每个用户所属的所有组的输出列表
【发布时间】:2022-03-29 21:49:48
【问题描述】:

我正在尝试查询 Active Directory 以获取所有用户和每个用户所属的所有组的列表。我只需要每个用户所属的直接组,而不是嵌套组。最终目标是将此列表输出到 CSV 文件。我正在尝试在 Windows Server 2012 R2 中使用 PowerShell 来执行此操作。

更新

所以我现在已经成功地输出了所有用户名的列表,但是只有部分用户组包含在输出中,使用以下命令:

Get-ADuser -LDAPFilter "(objectClass=user)" -property "memberOf" | 
select -Property @{n='name';e={$_.name}},@{n='groups';e
{$($_.MemberOf | Get-adgroup | % {$_.name}) -join ','}}

我无法确定为什么只有 一些 的用户输出(可能总共只有 5-10 个)包含用户所属的组,而其余 (95%) 的users 输出只显示用户名,根本没有任何组。

这里有什么想法吗?

【问题讨论】:

  • 缺少一个大括号,但它在最后一个管道之前。应该是:... | select -exp name}} | where {$_.groups}

标签: powershell active-directory ldap windows-server-2012-r2


【解决方案1】:

首先我担心Get-ADuser -Filter {group -eq 'Domain Users'}什么都不给。

你可以尝试开始:

Get-ADuser -LDAPFilter "(objectClass=user)" -property "memberof" | select -Property @{n='name';e={$_.SamAccountName}},@{n='groups';e={$_.MemberOf -join ','}}

然后您可以修改过滤器以也采用 InetOrgPerson。

Get-ADuser -LDAPFilter "(|(objectClass=user)(objectClass=inetOrgPerson))" -property "memberof" | select -Property @{n='name';e={$_.SamAccountName}},@{n='groups';e={$_.MemberOf -join ','}}

那你可以取组DN的samAccountName

Get-ADuser -LDAPFilter "(|(objectClass=user)(objectClass=inetOrgPerson))" -property "memberof" | select -Property @{n='name';e={$_.SamAccountName}},@{n='groups';e={$($_.MemberOf | Get-adgroup | % {$_.SamAccountname}) -join ','}}

【讨论】:

  • 应该是"group -eq 'Domain Users'" 而不是{group -eq 'Domain Users'}。当参数定义清楚地表明 <string> 时,Microsoft 的任何人都认为将脚本块表示法放在 Get-ADUser 文档的示例中是个好主意,这让我一直感到惊讶。
  • 这就是我使用 LDAPFilter 的原因,我更喜欢真正的 LDAP 过滤器语法。
  • 同上 LDAPFilter 语法。无论谁认为从底层 LDAP 对象中更改 ADUser 对象上的这么多属性名称是个好主意,都需要在镜子中仔细审视自己。
  • 非常感谢您的帖子!查询有效,但输出并不完全是我想要的。它似乎输出了所有 SamAccountname 值,但只有某些值也输出了相应的组成员身份。除此之外,有没有办法将输出导出到 CSV 文件中?像Export-CSV 'Path-to-csv'这么简单吗?
  • 你应该自己验证,但是memberof是正确的属性,区别可能来自安全组和非安全组(查询可以这样调整)。对于 CSV,您可以将结果通过管道传输到其中。
【解决方案2】:

对此帖子的回复较晚,但我构建了一个脚本,用于输出特定 OU 中的所有组以及每个组的所有用户。唯一的缺点是每个组的“所有者”也是成员,所以有一点冗余,但没有什么破坏我的目的。输出被格式化为两列。

$mGroups=@(
Get-ADGroup -filter * -SearchBase "OU=,OU=,OU=,DC=,DC=" | select name);


$col = @()
for ($i=0
 $i -lt $mGroups.Count;
 $i++)
 {
      $agents=@(
      Get-ADGroupMember $mGroups[$i].name | select sAMAccountName)

        for ($n=0
             $n -lt $agents.Count;
             $n++)
             {
              $agentList = [PSCustomObject]@{
              Group = $mGroups[$i].name 
              Agents = $agents[$n].sAMAccountName
             }
            $col+=$agentList;
             }
   }          
$col
$col | Export-CSV -NoTypeInformation C:\Path\to\file.type

【讨论】:

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