获取 Active Directory 域服务文件夹 and/or DistingiushedName

Getting Active Directory Domain Services Folder and/or DistingiushedName

我不熟悉使用 Powershell 为 Active Directory 编写脚本,并尝试将用户拉出列表并枚举他们的组;但是,当我这样做时,结果信息仅包含在许多不同名称的 OU 下重复的组名称。在 Member Of 选项卡下的 AD Users and Computers 中查看它们显示了名称和 Active Directory 域服务文件夹,其中包含我需要的差异化信息,或者我可以使用 DistinguishedName,它的格式不是很好以提高可读性,但会也可以。

简化示例的问题:如果一个组名在不同的 OU 中是相同的(如 "TestUsers"),那么脚本当前会转储多个组名而不区分 "TestUsers, TestUsers, TestUsers",而不是在中显示基础 OU干净格式 "Michigan\TestUsers, NewYork\TestUsers" 或专有名称格式 "CN=TestUsers,CN=Michigan,etc";"CN=TestUsers,CN=NewYork,etc".

$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

感谢任何帮助!

由于“$_.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

我同意 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}