计算唯一用户并仅显示结果
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
。
我们有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
。