PoshCode Archive  Artifact [eae74dbf84]

Artifact eae74dbf844060b4e2512794e1b601dea6eb1968e008891fb2c433ce253e3eb3:

  • File Get-GroupStructure.ps1 — part of check-in [14e7e81c93] at 2018-06-10 13:56:47 on branch trunk — This simple function exports the structure of nested groups in a similar way as folder and file structures are usually presented. (user: DollarUnderscore size: 2748)

# encoding: ascii
# api: powershell
# title: Get-GroupStructure
# description: This simple function exports the structure of nested groups in a similar way as folder and file structures are usually presented.
# version: 0.1
# type: function
# author: DollarUnderscore
# license: CC0
# function: Get-GroupStructure
# x-poshcode-id: 5536
# x-archived: 2015-03-23T13:29:54
# x-published: 2015-10-24T10:55:00
#
# It is also a part of another really simple powershell form that end users can use to export members of Active Directory groups.
# It requires the Active Directory module to run.
# Blog post with a link the PowerShell form is available at:
# http://dollarunderscore.azurewebsites.net/?p=3601
#
#========================================================================
# Created By: Anders Wahlqvist
# Website: DollarUnderscore (http://dollarunderscore.azurewebsites.net)
#========================================================================

function Get-GroupStructure
{
    <#
    .SYNOPSIS
    This cmdlets exports the structure of nested groups and users.

    .DESCRIPTION
    This cmdlets exports the structure of nested groups and users, in a simliar way
    as file structures are presented.

    It requires the Active Directory module to run.

    .EXAMPLE
    Get-GroupStructure -GroupName "Domain Admins"

    .PARAMETER GroupName
    Specify the SamAccountName, DistinguishedName, objectGUID or SID of the user. Supports pipeline input.

    .PARAMETER GroupPath
    Set the "start level" of the returned string. Mostly used internally, you can safely ignore this.

    #>

    param ([string] $GroupPath = '',
           [string] $GroupName)

    $GroupMembers = @()
    $GroupMembers += Get-ADGroupMember $GroupName | Sort-Object objectClass -Descending

    $LoopCount = @($GroupPath -split " \\ " | Where-Object { $_ -eq $GroupName })

    if ($LoopCount.Count -ge 2) {
        Write-Error "Nested group loop detected. Group: $GroupName"
        return;
    }

    if ($GroupPath -eq '') {
        $GroupPath = "$GroupName \ "
    }

    if ($GroupMembers.Count -eq 0) {
        Write-Output $GroupPath
    }

    foreach($GroupMember in $GroupMembers) {
        
        Remove-Variable DrilledDownGroupPath, UserPath -ErrorAction SilentlyContinue

        if ($GroupMember.objectClass -eq 'group') {
            $DrilledDownGroupPath = $GroupPath + "$($GroupMember.name) \ "
            Get-GroupStructure -GroupPath $DrilledDownGroupPath -GroupName $GroupMember.name
        }
        else {
            $UserPath = "$GroupPath$($GroupMember.Name) ($($GroupMember.SamAccountName))"
            Write-Output $UserPath
        }
    }
}