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

时间:2017-09-27 05:41:52

标签: powershell active-directory powershell-v2.0

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

澳大利亚1和澳大利亚2是澳大利亚的子目录。

我需要在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

2 个答案:

答案 0 :(得分:0)

这是我想出的。希望这能让你得到答案。我用了一些额外的变量来打破你的管道。

我还在PowerShell中添加了用于设置OU,用户和组结构的内容。我使用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等。

希望这有帮助。

谢谢,蒂姆。

答案 1 :(得分:0)

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

此外,$gm.Count + ","会产生错误,因为PowerShell会尝试转换字符串","到一个整数以匹配第一个操作数的类型。失败了。您需要将第一个操作数强制转换为字符串,以使+作为连接运算符工作。但即便如此,您也无法获得所需的结果,因为$gm包含所有组成员,无论其OU如何。

要使代码正常工作,请删除ForEach-Object循环和$gm =,并选择分组容器名称的名称和计数。

$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 Name, 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