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

时间:2015-05-19 15:18:24

标签: active-directory powershell-v3.0 quest

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

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

我宁愿不依赖这些名字,而是让我成为X和Y以及Z"而是说"让我成为OU XXX"代替。

理想情况下,我也喜欢最后的计数,因为最终这是用于审核"有多少用户拥有VPN访问权限" (虽然我可以将结果发送到.CSV或其他东西,如果那太复杂了)

所以我有一些可以做到这一点的部分,我只是无法想象如何将它们整合在一起。任何帮助,将不胜感激。以下是我的动作部分:

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

get-adgroupmember "group_of_coolness" -recursive | Select name

使用" searchbase"

从用户填写的OU返回结果
Get-ADUser -Filter * -SearchBase 'ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=org' -Properties GivenName, Surname, EmailAddress, Office, Company, Title, distinguishedname | 
select GivenName, Surname, EmailAddress, Office, Company, Title, distinguishedname | Out-GridView 

返回几个特定组的结果,但也给出了一个计数(到目前为止我最高级的补丁工作^^):

    $GroupMembers=(get-ADGroup -filter {(Name -eq "XXXX") -or (Name -eq "YYYY")} |
     get-adgroupmember -Recursive | select distinguishedname -Unique)

    $Users=foreach ($user in $GroupMembers.distinguishedname) {
    Get-ADUser $user
    }

    $Users | Sort-Object DistinguishedName |
    select name, DistinguishedName

    Write-Host
    Write-Host "Total Users = " $Users.count

最后的代码片段似乎最接近我,如果我可以替换" name -eq XXXX或YYYY"与" -searchbase" ou = XXX ..."

你认为聪明人是什么 - 我是否接近答案?再次,感谢任何建议,让我知道如果我是一个杰克屁股,并忽略了已经回答的线程(我发现了一些接近的电话,但没有任何相当的价钱)。

我很高兴看到我在这里失踪的东西:)

2 个答案:

答案 0 :(得分:1)

查找特定 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

答案 1 :(得分:0)

你可以很容易地简化这个:

$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 "Group A") -or (Name -eq "Group B")},就像您使用的那样。

您的示例中没有使用除名称和专有名称之外的任何内容,因此没有理由再次通过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;