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

Powershell Script Returning Blank Lines, Correct Amount of Lines for Output but nothing in Them

问题分解

所以我正在尝试 return 一个用户所在的所有安全用户组的列表,但让管理员将其分解。我采取了几个步骤来做到这一点:

  1. 将所有用户放入UserList
  2. 使用用户列表收集管理员列表。
  3. 将经理列表排序为唯一列表。
  4. 获取经理 SamAccountNames。
  5. 从经理处获取 directreports 属性以创建下属列表。
  6. 获取他们的 SamAccountNames
  7. 使用 SamAccountNames 提取 AD 安全组和描述。

小块使用时一切正常。如果您为 $DirectReports 声明了一些名称,然后 运行 最后一个 for 循环它 return 一切都适当。

然而,当 运行 运行脚本时,它 return 只有经理姓名、直接下属姓名和安全组的所有行,但安全行中没有任何内容组。

没有相关的错误信息。在此先感谢您的帮助。

代码

#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=)(.*?),.*",'' 
    
    $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用户
  • 获得唯一的所有经理
  • 获取管理员广告信息
  • 直接向经理汇报
  • 获取所有直接下属的群组成员资格

如果您只想 return 每个用户的 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 cmdlet 列出所有组。

现在让我解释一下我对您的脚本所做的更改。

  • foreach 循环而不是 for 循环。这使对象管理更容易

  • DistinguishedName 与 SamAccountName、SID、ObjectGUId 一起是一个身份...为 CN 解析 DN 不可靠。

  • 与其获取用户,然后获取管理员,然后再次获取用户,然后获取组,不如获取所有组?

  • 无需使用Get-ADPrincipalGroupMembership,用户对象上有一个名为'MemberOf'的属性。

使用 ActiveDirectory PS 模块时值得一提的事情:

  • 小心'-Filter *',一些广告结构太大,你最终会超时。

  • 尽可能少地使用“-Properties *”。向 LDAP 查询添加属性会大大降低它的速度!你可能会超时。您可以改用特定属性,例如“-Properties MemberOf”。

  • 即使指定单个属性,标准属性也总是在一起。它们是:DistinguishedName、Enabled、GivenName、Name、ObjectClassm ObjectGUID、SamAccountName、SID、Surname、UserPrincipalName。

希望对您有所帮助!