【问题标题】:Powershell Script Returning Blank Lines, Correct Amount of Lines for Output but nothing in ThemPowershell脚本返回空白行,正确的输出行数,但其中没有
【发布时间】:2022-10-21 20:28:48
【问题描述】:

问题分解

所以我试图返回一个用户所在的所有安全用户组的列表,但让它被经理分解。我采取了几个步骤来做到这一点:

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

    小块使用时,一切都有效。如果您为 $DirectReports 声明一些名称,然后运行最终的 for 循环,它会适当地返回所有内容。

    但是,在运行脚本时,它只返回经理名称、直接报告名称和安全组的所有行,但安全组的行中没有任何内容。

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

    代码

    #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"
        }
    } 
    

【问题讨论】:

  • 我不明白第 5 步 - 您想在搜索单个用户的组成员身份时发现所有具有相同经理的用户?
  • @MathiasR.Jessen 嘿,是的,我找出所有经理,然后找出他们所有的下属,这对于直接报告来说更容易。我知道这是一种回合,但它完成了我需要做的事情。有没有更简单的方法来使用标题管理器拉动用户并从 AD 获取他们的直接报告?
  • 当应用 Format-Table 格式时,如果对象具有 4 个或更少的属性,则会隐式发生这种情况,第一的集合中的对象根据其属性锁定所有显示列。如果后续对象有不同的属性,仅显示与第一个共享的那些;如果给定对象不共享,则显示一个空行。这只是一个显示问题,您可以通过将对象传送到... | Format-List 来验证。请参阅this answer 了解更多信息。
  • 如果这确实是您的问题,我们可以重复关闭您的问题。

标签: powershell active-directory


【解决方案1】:

好的,我们需要在您的解决方案中改进几件事,但您走在正确的道路上。

你正在做的:

  • 获取所有 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 cmdlet 列出所有组。

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

  • 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、Surname、UserPrincipalName。

我希望它有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多