获取Active Directory域服务文件夹和/或DistingiushedName

时间:2015-01-06 19:35:54

标签: powershell

我不熟悉使用Powershell for Active Directory编写脚本,并试图提取列表中的用户并枚举他们的组;但是,当我这样做时,结果信息只包含在许多不同命名的OU下重复的组的名称。在“成员”选项卡下的“AD用户和计算机”中查看它们会显示名称和Active Directory域服务文件夹,其中包含我需要的差异化信息,或者我可以使用DistinguishedName,它不是格式良好的可读性但也会奏效。

简化示例的问题:如果组名在不同的OU之间是相同的(例如" TestUsers")那么脚本当前转储多个组名而不区分" TestUsers,TestUsers,TestUsers&#34 ;而不是以干净的格式显示底层的OU" Michigan \ TestUsers,NewYork \ TestUsers"或专有名称格式" CN = TestUsers,CN =密歇根州等&#34 ;;" CN = TestUsers,CN = NewYork等"。

$alist = "Name`tAccountName`tDescription`twhenCreated`tAcctEnabled`tGroups`n"
$userlist = Get-ADUser -SearchBase "OU=Service Accounts,OU=Information Systems,DC=conteso,DC=local" -Filter * -Properties * | Select-Object -Property Name,SamAccountName,Description,EmailAddress,LastLogonDate,Manager,Title,Department,Company,whenCreated,Enabled,MemberOf | Sort-Object -Property Name
$userlist | ForEach-Object {
    $grps = $_.MemberOf | Get-ADGroup | ForEach-Object {$_.Name} | Sort-Object
    $arec = $_.Name,$_.SamAccountName,$_.Description,$_.whenCreated,$_.Enabled
    $aline = ($arec -join "`t") + "`t" + ($grps -join "`t") + "`n"
    $alist += $aline
}
$alist | Out-File C:\psscripts\service_accounts_groups.csv

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我同意DistinguishedName已经拥有此信息,但我认为使用Get-AdGroup获取更友好的信息会更容易。在CanonicalName组中进行一些小的字符串操作,虽然效率不高,但更容易使用。

$grps = $_.MemberOf | Get-AdGroup -Properties CanonicalName | ForEach-Object{
    $CN = ($_.CanonicalName -Split "/")
    "{0}\{1}" -f $CN[-2],$CN[-1]
}

或如果您愿意,可以作为一个班轮。

$grps = $_.MemberOf | Get-AdGroup -Properties CanonicalName | ForEach-Object{$CN = ($_.CanonicalName -Split "/"); "{0}\{1}" -f $CN[-2],$CN[-1]}

我们所做的是使用CanonicalName,它可以被视为Active Directory中对象的路径。由于您只想要父容器,我们将路径分开并仅连接最后两个部分。组对象及其容器。

同样的结果可能来自于从CanonicalName获取第二个最后一个元素并将组名附加到它。可能会看得更好

$grps = $_.MemberOf | Get-AdGroup -Properties CanonicalName | ForEach-Object{"{0}\{1}" -f ($_.CanonicalName -Split "/")[-2],$_.Name}

答案 1 :(得分:0)

由于“$ _。memberof”属性已具有专有名称,因此您无需再次将其传递给Get-Adgroup。所以只需像这样替换你的$ grps一行

$grps = $_.MemberOf -replace "CN=","" -replace "OU=","" -replace "DC=","" -replace ",","\" | Sort-Object

或者如果您仍想继续使用您的方法,请将其与distinguishedname属性一起使用,而不是name属性 - 就像这样(使用文本替换)

$grps = $_.MemberOf | Get-ADGroup | ForEach-Object {$_.DistinguishedName -replace "CN=","" -replace "OU=","" -replace "DC=","" -replace ",","\"} | Sort-Object

或者如评论中Matt所建议的那样,只需使用canonicalname属性即可。

$grps = $_.MemberOf | Get-ADGroup -Properties canonicalname | select -ExpandProperty canonicalname

干杯,GJ