Private/Get-ALHNestetdGroup.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<#PSScriptInfo
 
.VERSION 1.0.0
 
.GUID 780b6167-683c-4d94-a62e-1b85e339206e
 
.AUTHOR Dieter Koch
 
.COMPANYNAME
 
.COPYRIGHT (c) 2021-2023 Dieter Koch
 
.TAGS
 
.LICENSEURI https://github.com/admins-little-helper/ALH/blob/main/LICENSE
 
.PROJECTURI https://github.com/admins-little-helper/ALH
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    1.0.0
    Initial release
 
#>



<#
 
.DESCRIPTION
 Contains a function to search for nested groups in Active Directory.
 
.LINK
https://github.com/admins-little-helper/ALH
 
#>


function Get-ALHNestetdGroup {
    <#
    .SYNOPSIS
    Function to recursively enumerate members of a group.
 
    .DESCRIPTION
    Recursively checks if a given group is member of one of it's childs.
 
    .PARAMETER Identity
    The unique name of the group whose membership is being evaluated (ideally this should be the distinguishedName)
 
    .PARAMETER Parent
    An array of all parent groups of $Identity.
    This parameter can be empty when manually calling the function. It will be used during recursion when the
    function calls it self to iterate through the group membership.
 
    .PARAMETER GroupMember
    Mandatory. A hashtable containing all groups (keys) and associated members (values) to check for.
 
    .PARAMETER Hierarchy
    Will only be used during recursion to show how groups membership hierarchy.
 
    .INPUTS
    Nothing
 
    .OUTPUTS
    System.Object
 
    .NOTES
    Author: Dieter Koch
    Email: diko@admins-little-helper.de
 
    .LINK
    https://github.com/admins-little-helper/ALH/blob/main/Help/Get-ALHNestetdGroup.txt
    #>


    [CmdLetBinding()]
    param (
        [parameter(Mandatory)]
        [String[]]$Identity,

        [String[]]$Parent,

        [parameter(Mandatory)]
        $GroupMember,

        [string]$Hierarchy
    )

    Write-Debug -Message "Checking group nesting of group '$Identity'"

    foreach ($Member In $GroupMember["$Identity"]) {
        Write-Debug -Message "Member: $Member"
        if ($Hierarchy -eq '') {
            $Hierarchy = "'$Identity'"
        }
        else {
            $Hierarchy = "$Hierarchy --> '$Identity'"
        }

        Write-Debug -Message "Hierarchy: $Hierarchy"

        foreach ($ParentItem In $Parent) {
            if ($Member -eq $ParentItem) {
                Write-Verbose "Found circular nested group: Group '$Identity' --> '$ParentItem'"
                return $ParentItem
            }
        }

        # Check all group members for group membership.
        if ($GroupMember.ContainsKey($Member)) {
            # Add this member to array of parent groups.
            # However, this is not a parent for siblings.
            # Recursively call function to find nested groups.
            $Temp = $Parent
            $Temp += $Member
            Get-ALHNestetdGroup -Identity $Member -Parent ($Temp) -GroupMember $GroupMember -Hierarchy $Hierarchy
        }
    }
}

#region EndOfScript
<#
################################################################################
################################################################################
#
# ______ _ __ _____ _ _
# | ____| | | / _| / ____| (_) | |
# | |__ _ __ __| | ___ | |_ | (___ ___ _ __ _ _ __ | |_
# | __| | '_ \ / _` | / _ \| _| \___ \ / __| '__| | '_ \| __|
# | |____| | | | (_| | | (_) | | ____) | (__| | | | |_) | |_
# |______|_| |_|\__,_| \___/|_| |_____/ \___|_| |_| .__/ \__|
# | |
# |_|
################################################################################
################################################################################
# created with help of http://patorjk.com/software/taag/
#>

#endregion