计算唯一用户并仅显示结果

Count unique user and show the result only

我们有A组和B组以及B组中的嵌套组。
John 是 A 组的成员并且在澳大利亚 1 OU。
Chris 是 B 组的成员,在澳大利亚 2 OU。
May 是 A 组和 B 组的成员,在澳大利亚 1 OU。
Ken是A组成员,在中国OU。

澳大利亚 1 和澳大利亚 2 是澳大利亚的子 OU。

我需要在 A 组和 B 组中找到唯一用户,并且需要 PowerShell 来显示如下结果。

OU                        User Count in A and B Group
Australia 1                             2
Australia 2                             1
Other                                   1

我正在尝试导出 COUNT,但总和不正确。应该改变什么才能使它正确?

$Group2 = $groupA, $GroupB
$Group2 |
    ForEach-Object { $gm += Get-ADGroupMember -Identity "$_" -Recursive } |
    Where-Object { $_.objectClass -ieq "User" } |
    Select-Object -Unique |
    Get-ADUser -Properties canonicalName |
    Select-Object @{Name='container';Expression={$_.canonicalname | Split-Path -Parent}} |
    Group-Object container |
    Select Count |
    Format-Table -Auto

$gm.Count + "," | Out-File $log -Append

这是我想出的。希望这能让你找到答案。我使用了一些额外的变量来分解你的管道。

我还在用于设置 OU、用户和组结构的 PowerShell 中添加了内容。我使用 Group1 和 Group2 而不是 GroupA 和 GroupB。那是我的错误。

我将我的用户创建为 inetOrgPerson,所以在 where-object 中,我将其用于 -ieq。您需要将其更改为用户。

#Environment setup
New-ADOrganizationalUnit -Name Country -Path "DC=TIMHAINTZ,DC=COM"
New-ADOrganizationalUnit -Name Australia -Path "OU=Country,DC=TIMHAINTZ,DC=COM"
New-ADOrganizationalUnit -Name Australia1 -Path "OU=Australia,OU=Country,DC=TIMHAINTZ,DC=COM"
New-ADOrganizationalUnit -Name Australia2 -Path "OU=Australia,OU=Country,DC=TIMHAINTZ,DC=COM"
New-ADOrganizationalUnit -Name China -Path "OU=Country,DC=TIMHAINTZ,DC=COM"
New-ADUser John -Type iNetOrgPerson -Path "OU=Australia1,OU=Australia,OU=Country,DC=timhaintz,DC=com" 
New-ADUser Chris -Type iNetOrgPerson -Path "OU=Australia2,OU=Australia,OU=Country,DC=timhaintz,DC=com"
New-ADUser May -Type iNetOrgPerson -Path "OU=Australia1,OU=Australia,OU=Country,DC=timhaintz,DC=com"  
New-ADUser Ken -Type iNetOrgPerson -Path "OU=China,OU=Country,DC=timhaintz,DC=com"
New-ADOrganizationalUnit -Name Groups -Path "DC=TIMHAINTZ,DC=COM" 
New-ADGroup -Name "Group1" -SamAccountName Group1 -GroupCategory Security -GroupScope Global -DisplayName "Group1" -Path "OU=Groups,DC=TimHaintz,DC=com"  
New-ADGroup -Name "Group2" -SamAccountName Group2 -GroupCategory Security -GroupScope Global -DisplayName "Group2" -Path "OU=Groups,DC=TimHaintz,DC=com"  
Add-ADGroupMember Group1 John  
Add-ADGroupMember Group2 Chris 
Add-ADGroupMember Group1 May  
Add-ADGroupMember Group2 May 
Add-ADGroupMember Group1 Ken

#Iteration through groups
$group2 = 'CN=Group1,OU=Groups,DC=timhaintz,DC=com','CN=Group2,OU=Groups,DC=timhaintz,DC=com'
$users = foreach($group in $group2)
     {
         Get-ADGroupMember -Identity $group -Recursive | Where-Object {$_.objectClass -ieq "inetOrgPerson"}
     }
$uniqueusers = $Users | Select-Object -Unique

从这里开始,您拥有所有 $users 和 $uniqueusers。如果你这样做:

$users.count
$uniqueusers.count

您会看到他们有不同的号码。

然后您可以根据需要使用其余逻辑来获取计数和输出。 例如:

$uniqueusers | `
get-aduser -Properties canonicalname | `
Select-Object @{Name='container';Expression={$_.canonicalname | split-path -parent}} |  `
Group-Object container | ` 
Select-Object @{Name='OU';Expression={($_.name).Split("\")[-1]}},Count | `
Format-Table -AutoSize

输出如下:

OU         Count
--         -----
Australia1     2
China          1
Australia2     1

您也可以使用 $users 并将其通过管道传输到 get-aduser 等。

希望对您有所帮助。

谢谢,蒂姆。

您发布的代码不可能工作,因为您的 ForEach-Object 循环附加到一个变量而不向管道写入任何内容,因此初始循环之后的整个管道不执行任何操作。完全没有。

此外,$gm.Count + "," 应该会产生错误,因为 PowerShell 会尝试将字符串“,”转换为整数以匹配第一个操作数的类型。失败了。您需要将第一个操作数转换为字符串才能使 + 用作串联运算符。但即使那样你也不会得到想要的结果,因为 $gm 包含所有组成员,而不管他们的 OU。

为了使您的代码正常工作,删除 ForEach-Object 循环和 $gm =,以及 select 分组容器名称的名称和计数。

$Group2 |
    <strike>ForEach-Object { $gm +=</strike> Get-ADGroupMember <strike>-Identity "$_"</strike> -Recursive <strike>}</strike> |
    Where-Object { $_.objectClass -ieq "User" } |
    Select-Object -Unique |
    Get-ADUser -Properties canonicalName |
    Select-Object @{Name='container';Expression={$_.canonicalname | Split-Path -Parent}} |
    Group-Object container |
    Select <b>Name,</b> Count |
    Format-Table -Auto

如果您只需要容器名称的尾部,请更改表达式

$_.canonicalname | Split-Path -Parent

$_.canonicalname | Split-Path -Parent | Split-Path -Leaf

如果要将表格输出写入文件,请添加

| Out-String | Out-File $log

Format-Table 语句之后,如果您希望结果为 CSV,则将 Format-Table -Auto 替换为 Export-Csv $log -NoType