Powershell 顯示屬於某個群組的使用者兩次 - 一次直接一次間接一次

Powershell 顯示屬於某個群組的使用者兩次 - 一次直接一次間接一次

我已經開始建立這樣的小組:

  • 部門職員
    • 部門主管
      • 部門主任

其中,部門主管是部門職員的成員,部門主管是部門主管的成員。

我知道如何使用 powershell 列出一個人所屬的群組、直接分配的群組或透過嵌套群組繼承的群組。

但我想要弄清楚的是一個腳本,它將向我顯示直接和間接屬於這些群組之一的所有用戶,例如。使用者A是部門職員和部門主管的直接成員。

我的谷歌搜尋未能找到或編寫一個可以做到這一點的腳本。

編輯:

事實上,嵌套的層次和分支更多,部門也更多,所以會很混亂。我想要取得直接屬於任何群組的成員列表,以及間接屬於同一群組的成員的列表,以便我可以刪除多餘的群組直接成員身分。

答案1

以下將遍歷給定的父組(名稱必須與Get-ADGroupMember語法相容)並填入兩個雜湊值。一個哈希將以用戶 sAMAccountName 作為鍵和一組直接的群組成員身分作為值。第二個雜湊將包含所有已處理群組的密鑰。

它將正確檢測並跳過循環組嵌套(例如父級是子級的子級)。您可以註解掉這些Write-Host行,以減少控制台中的線路雜訊。

Import-Module ActiveDirectory

function Walk-Group ( $group ) {

    Get-ADGroupMember $group | Group-Object objectClass -ash | Foreach-Object {

        # Add each user to $users hash, add current group to their collection
        if ( $_.user ) {
            foreach ( $u in $_.user.GetEnumerator() ) {
                if ( $users[$u.sAMAccountName] ) {
                    $users[$u.sAMAccountName] += $group
                } else {
                    $users.Add( $u.sAMAccountName, @($group) )
                }
            }
        }

        # Recurse into each child group, skip if group is circular member
        if ( $_.group ) {
            foreach ( $g in $_.group.GetEnumerator() ) {
                if ( $groups[$g.Name] ) {
                    Write-Host "Existing:" $g.Name
                } else {
                    Write-Host "New Group:" $g.Name
                    $groups.Add( $g.Name, $true )
                    Walk-Group $g.Name
                }
            }
        }

    }
}

# Hash to collect user/group info.
$users = @{}

# Hash to collect processed groups.
$groups = @{}

# Root group to walk
Walk-Group "Department-staff"

# Display users with mulitple direct memberships
$users.GetEnumerator() | Where-Object { $_.Value.Count -gt 1 }

答案2

編輯:根據您更新的描述,類似的內容應該有效。請注意,我沒有處理群組成員資格中的循環,因此您可能會發現它永遠運行。

$RootGroup=Get-ADGroup "your group here" 
$username = "test user here"

Function RecurseMembership( $FromAbove, $username ) 
{
"------------------------------------------------------"
    $FromAbove


    $LevelUsers=$FromAbove | Get-ADGroupMember | where { $_.objectClass -eq "user" -and $_.SamAccountName -eq "$username" }
    $LevelGroups=$FromAbove | Get-ADGroupMember | where { $_.objectClass -eq "group" }

    $LevelUsers
    $LevelGroups | ForEach-Object { RecurseMembership $_ $username } 

}

RecurseMembership $RootGroup $username 

相關內容