问题分解
所以我试图返回一个用户所在的所有安全用户组的列表,但它被管理器分解。为此,我采取了几个步骤:
- 获取所有用户到UserList
- 使用用户列表收集管理器列表。
- 将管理器列表排序为唯一列表。
- 获取Manager SamAccountNames.
- 从管理器中获取directreports属性以创建下属列表。
- 获取SamAccountNames
- 使用SamAccountNames提取AD安全组和描述。
当小块使用时,一切都有效。如果你为$DirectReports声明了一些名字,然后运行最后的for循环,它会正确地返回所有的东西。
但是,当运行该脚本时,它只返回Manager名称、直接报告名称和安全组的所有行,但安全组的行中没有任何内容。
无相关错误信息。提前感谢您的帮助。
<标题>代码#Search Organizational Unit to find all Users
$UserList = @(Get-ADUser -Filter * -SearchBase "COMPANY'S ORG UNITS").SamAccountName
#For every user found in OU, select their manager
foreach ($User in $UserList) {
$Manager = @(Get-ADUser $User -Properties * | Select-Object @{Name = "Manager";Expression = {($_.manager -split ',*..=')[1]}})
$Managers += $Manager
}
#Sort and Select Unique Managers
$Managers = $Managers | Sort-Object -Property Manager -Unique
#Get SamAccountName From Manager Name
for ($a = 0; $a -lt $Managers.Count; $a++) {
$FilterString = "Name -eq '{0}'" -f $Managers[$a].Manager
$SAM = @(Get-ADUser -Filter "$FilterString" | Select SamAccountName)
$SAMs += $SAM
}
#Get subordinates for each manager
for ($b=0; $b -lt 1; $b++) {
#Get direct reporting individuals, second line cleans up output.
$DirectReports = @(Get-ADUser $SAMs[$b].SamAccountName -Properties directreports | select-object -ExpandProperty DirectReports)
$DirectReports = $DirectReports -replace "(CN=)(.*?),.*",'$2'
$Managers[$b+1]
Write-Output "`n"
#Get SAM names for direct reporting individuals and use to get user properties
for ($c = 0; $c -lt $DirectReports.Count; $c++) {
$FilterString2 = "Name -eq '{0}'" -f $DirectReports[$c]
$DirectReports[$c]
$SAM2 = @(Get-ADUser -Filter "$FilterString2")
$SAM2.SamAccountName
Get-ADPrincipalGroupMembership -Identity $SAM2.SamAccountName | Get-ADGroup -Properties * | select name, description
Write-Output "`n"
}
}
标题>
好吧,我们需要在你的解决方案中改进一些东西,但是你在正确的道路上。
你做:
- 获取所有AD用户
- 唯一获取所有管理器
- 获取管理器AD信息
- 获取经理直接报告
- 获取所有直接下属的组成员资格
如果您只想返回每个用户的SG列表,您可以使用:
$users = Get-ADUser -Filter * -Properties MemberOf
foreach ($membership in $users.MemberOf) {
Get-ADGroup -Identity $membership
}
如果你想从经理那里得到什么,你可以:
## Get list of managers (DirectReports not null)
$managers = Get-ADUser -Filter { -not (DirectReports -like '*') } -Properties DirectReports
#Get subordinates for each manager
foreach ($manager in $managers) {
foreach ($user in $manager.DirectReports) {
$groupMembership = Get-ADUser -Identity $user -Properties MemberOf
foreach ($membership in $groupMembership.MemberOf) {
Get-ADGroup -Identity $membership | Select-Object Name, Description
}
}
}
但对我来说,这只是额外的冗余工作。
您也可以使用Get-ADGroup命令来列出所有的组。
现在让我解释一下我对你的脚本做了哪些修改。
foreach循环而不是for循环。这使得对象管理更容易
DistinguishedName与SamAccountName、SID、ObjectGUId…解析CN的DN不可靠。
与其先获得用户,然后获得经理,再获得用户,然后获得组,为什么不直接获得所有组呢?
不需要使用Get-ADPrincipalGroupMembership,在用户对象上有一个名为'MemberOf'的属性。
使用ActiveDirectory PS模块时需要注意的事项:
小心'-Filter *',一些AD结构太大,你会以超时结束。
尽量少使用"-Properties *"。向LDAP查询添加属性会大大降低查询速度!你可能会得到一个暂停。你可以选择特定的属性,比如'-Properties MemberOf'。
即使指定单个属性,标准属性也总是一起出现。这些是:DistinguishedName, Enabled, GivenName, Name, ObjectClassm ObjectGUID, SamAccountName, SID,姓氏,UserPrincipalName。
我希望它有帮助!