我们在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
答案 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
。