Powershell脚本返回空行,正确的输出行数,但其中没有任何内容



问题分解

所以我试图返回一个用户所在的所有安全用户组的列表,但它被管理器分解。为此,我采取了几个步骤:

  1. 获取所有用户到UserList
  2. 使用用户列表收集管理器列表。
  3. 将管理器列表排序为唯一列表。
  4. 获取Manager SamAccountNames.
  5. 从管理器中获取directreports属性以创建下属列表。
  6. 获取SamAccountNames
  7. 使用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。

我希望它有帮助!

相关内容

最新更新