我不熟悉使用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
感谢任何帮助!
答案 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