Active directory PowerShell+;AD:返回特定OU中任何组内的用户,加上计数

Active directory PowerShell+;AD:返回特定OU中任何组内的用户,加上计数,active-directory,powershell-3.0,quest,Active Directory,Powershell 3.0,Quest,PowerShell“白带”在这里,第一次海报。在这里,我会尽量不降低这样一个乐于助人的社区的集体智商!:)我正在运行安装了Quest的PowerShell 3.0 我的组织有一个Active Directory OU,其中有几个安全组,所有这些安全组都控制VPN访问-这些安全组是在我们有命名约定之前创建的(啊!) 我不想依赖这些名字,而是说“给我找X、Y和Z的成员”,而是说“给我找OU XXX中任何东西的成员” 理想情况下,我也希望在最后进行计数,因为最终这是为了审核“有多少用户拥有VPN访问

PowerShell“白带”在这里,第一次海报。在这里,我会尽量不降低这样一个乐于助人的社区的集体智商!:)我正在运行安装了Quest的PowerShell 3.0

我的组织有一个Active Directory OU,其中有几个安全组,所有这些安全组都控制VPN访问-这些安全组是在我们有命名约定之前创建的(啊!)

我不想依赖这些名字,而是说“给我找X、Y和Z的成员”,而是说“给我找OU XXX中任何东西的成员”

理想情况下,我也希望在最后进行计数,因为最终这是为了审核“有多少用户拥有VPN访问权限”(尽管如果太复杂,我可以将结果输出到.CSV或其他文件)

所以我有一些片段可以完成这部分的工作,我只是无法想象如何将它们组合在一起。任何帮助都将不胜感激。以下是我的活动部件:

返回一个特定组中的用户:

使用“searchbase”从用户填写的OU返回结果:

返回几个特定组的结果,但也给出计数(我迄今为止最高级的修补程序工作^^):

如果我可以用“-searchbase”ou=XXX…”替换“name-eq XXXX或YYYY”,那么最后一段代码似乎与我最接近

你认为聪明人是什么?我离答案很近吗?再次感谢你的建议,让我知道我是不是一个蠢货,忽略了一条已经得到答案的线索(我发现了一些很近的电话,但没有什么关于钱的)


我很高兴看到我在这里遗漏了什么:)

你可以很容易地简化这一点:

$Users = Get-ADGroup -SearchBase 'ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=org' -Filter * `
    | Get-ADGroupMember -Recursive `
    | Select-Object -Unique `
    | Sort-Object DistinguishedName;
$Users | Select-Object Name, DistinguishedName;
Write-Output ("Total Users = {0}" -f $Users.Count);
如果要按组名搜索,可以将第一行更改为
Get-ADGroup-Filter{(name-eq“groupa”)-或(name-eq“groupb”)}

在您的示例中,除了名称和可分辨名称之外,您没有任何其他用途,因此没有理由再次运行Get ADUser并从服务器获取与您相同的数据。没有理由浪费DC的时间

如果您确实需要获取名称和可分辨名称以外的其他属性,则确实需要这样做。您可以这样做:

$Users = Get-ADGroup -SearchBase 'ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=org' -Filter * `
    | Get-ADGroupMember -Recursive `
    | Select-Object -Unique `
    | ForEach-Object { Get-ADUser $_ -Properties GivenName, Surname, EmailAddress, Office, Company, Title, distinguishedname; } `
    | Sort-Object DistinguishedName;

查找特定OU中的所有停用用户:

$ExportFile="C:\TempInf\Inaktiv.txt"

Get-ADGroup -Filter{Name -eq "OU Name"}
$OUpath = 'OU=OU Name,OU=OU Parent,DC=WWW,DC=ORGANIZATION,DC=COUNTRY'

$uf = @{Expression={$_.samAccountName};Label="samAccountName";width=30}, `
      @{Expression={$_.GivenName};Label="GivenName";width=50}, `
      @{Expression={$_.whenChanged};Label="whenChanged";width=20}, `
      @{Expression={$_.Description};Label="Description";width=50}, `
      @{Expression={$_.DistinguishedName};Label="DistinguishedName";width=250}

Get-ADUser -Filter {Enabled -eq $false} -SearchBase $OUpath -Properties samAccountName, GivenName, whenChanged, DistinguishedName, Description |
 Format-Table $uf | 
 Out-File -FilePath $ExportFile -Width 400

cooooool…好的,我看到了这是如何将组放入变量中的,然后说“对于每个组,获取用户并获取以下信息”。(请注意,了解有关foreach循环的更多信息!)-这肯定属于“其他改进”的范畴“超出了原始问题的范围,但我想忽略仍然是组成员的任何禁用用户,将结果抛出到gridview,并将计数显示在gridview文档上。我想我可以在“Get-ADGroupMember-Recursive”之后插入一行
,其中{$\u0.Enabled-ne$False}
,但生成的文档仍然包含禁用的帐户(我在“Get-aduser”内容列表中添加了属性“Enabled”)。有什么建议吗?我将在下面发布更新的代码块
$Users=Get-ADGroup-SearchBase'ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=org'-Filter*| Get-ADGroupMember-Recursive |其中{$| Enabled-ne$False}选择对象-Unique | ForEach对象{Get ADUser$|-Properties给定名称、姓氏、电子邮件地址、办公室、公司、标题、区分名称、已启用;}|排序对象区分名称|输出GridView;写入输出(“总用户数={0}”-f$Users.Count)
@3Jake您需要在Get ADUser之后进行筛选,因为Get ADGroupMember的对象中没有启用的属性:
$Users=Get ADGroup-SearchBase'ou=XXX,ou=XXX,dc=XXX,dc=org'-filter*| Get ADGroupMember-Recursive | Select Object-Unique | ForEach对象{Get ADUser$|-Properties-GivenName、姓氏、电子邮件地址、办公室、公司、头衔、DiscrimizedName、enabled;}{$|其中{$.enabled-ne$False}}排序对象DiscrimizedName | Out GridView;写入输出(“总用户={0}”-f$Users.Count
ah,回想起来,这很有道理。我遇到了一个问题,它会将结果输出到gridview,但不会输出计数。在控制台窗口中,它会将用户报告为零。我知道你可以将结果从gridview传输回控制台,也许这就是答案,但这有点超出了我的理解他的观点。Gridview对于任何东西都是理想的,但是删除它并让它打印到控制台窗口就可以了!谢谢你的建议,BB,我觉得我在这里学到了很多!
$Users = Get-ADGroup -SearchBase 'ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=org' -Filter * `
    | Get-ADGroupMember -Recursive `
    | Select-Object -Unique `
    | Sort-Object DistinguishedName;
$Users | Select-Object Name, DistinguishedName;
Write-Output ("Total Users = {0}" -f $Users.Count);
$Users = Get-ADGroup -SearchBase 'ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=org' -Filter * `
    | Get-ADGroupMember -Recursive `
    | Select-Object -Unique `
    | ForEach-Object { Get-ADUser $_ -Properties GivenName, Surname, EmailAddress, Office, Company, Title, distinguishedname; } `
    | Sort-Object DistinguishedName;
$ExportFile="C:\TempInf\Inaktiv.txt"

Get-ADGroup -Filter{Name -eq "OU Name"}
$OUpath = 'OU=OU Name,OU=OU Parent,DC=WWW,DC=ORGANIZATION,DC=COUNTRY'

$uf = @{Expression={$_.samAccountName};Label="samAccountName";width=30}, `
      @{Expression={$_.GivenName};Label="GivenName";width=50}, `
      @{Expression={$_.whenChanged};Label="whenChanged";width=20}, `
      @{Expression={$_.Description};Label="Description";width=50}, `
      @{Expression={$_.DistinguishedName};Label="DistinguishedName";width=250}

Get-ADUser -Filter {Enabled -eq $false} -SearchBase $OUpath -Properties samAccountName, GivenName, whenChanged, DistinguishedName, Description |
 Format-Table $uf | 
 Out-File -FilePath $ExportFile -Width 400