|
|
@@ -0,0 +1,171 @@
|
|
|
+param (
|
|
|
+ [string]$inputname = ''
|
|
|
+)
|
|
|
+
|
|
|
+function Get-ADGroupTreeViewMemberOf {
|
|
|
+#requires -version 4
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Show UpStream tree view hierarchy of memberof groups recursively of a Active Directory user and Group.
|
|
|
+.DESCRIPTION
|
|
|
+ The Show-ADGroupTreeViewMemberOf list all nested group list of a AD user. It requires only valid parameter AD username,
|
|
|
+.PARAMETER UserName
|
|
|
+ Prompts you valid active directory User name. You can use first character as an alias, If information is not provided it provides 'Administrator' user information.
|
|
|
+.PARAMETER GroupName
|
|
|
+ Prompts you valid active directory Group name. You can use first character as an alias, If information is not provided it provides 'Domain Admins' group[ information.
|
|
|
+.INPUTS
|
|
|
+ Microsoft.ActiveDirectory.Management.ADUser
|
|
|
+.OUTPUTS
|
|
|
+ Microsoft.ActiveDirectory.Management.ADGroup
|
|
|
+.NOTES
|
|
|
+ Version: 1.0
|
|
|
+ Author: Kunal Udapi
|
|
|
+ Creation Date: 10 September 2017
|
|
|
+ Purpose/Change: Get the exact nested group info of user
|
|
|
+ Useful URLs: http://vcloud-lab.com
|
|
|
+.EXAMPLE
|
|
|
+ PS C:\>.\Get-ADGroupTreeViewMemberOf -UserName Administrator
|
|
|
+
|
|
|
+ This list all the upstream memberof group of an user.
|
|
|
+.EXAMPLE
|
|
|
+ PS C:\>.\Get-ADGroupTreeViewMemberOf -GroupName DomainAdmins
|
|
|
+
|
|
|
+ This list all the upstream memberof group of a Group.
|
|
|
+#>
|
|
|
+
|
|
|
+[CmdletBinding(SupportsShouldProcess=$True,
|
|
|
+ ConfirmImpact='Medium',
|
|
|
+ HelpURI='http://vcloud-lab.com',
|
|
|
+ DefaultParameterSetName='User')]
|
|
|
+Param
|
|
|
+(
|
|
|
+ [parameter(ParameterSetName = 'User',Position=0, ValueFromPipelineByPropertyName=$true, ValueFromPipeline=$true, HelpMessage='Type valid AD username')]
|
|
|
+ [alias('User')]
|
|
|
+ [String]$UserName = 'Administrator',
|
|
|
+ [parameter(ParameterSetName = 'Group',Position=0, ValueFromPipelineByPropertyName=$true, ValueFromPipeline=$true, HelpMessage='Type valid AD Group')]
|
|
|
+ [alias('Group')]
|
|
|
+ [String]$GroupName = 'Domain Admins',
|
|
|
+ [parameter(ParameterSetName = 'Group', DontShow=$True)]
|
|
|
+ [parameter(ParameterSetName = 'User', DontShow=$True)]
|
|
|
+ [alias('U')]
|
|
|
+ $UpperValue = [System.Int32]::MaxValue,
|
|
|
+ [parameter(ParameterSetName = 'Group', DontShow=$True)]
|
|
|
+ [parameter(ParameterSetName = 'User', DontShow=$True)]
|
|
|
+ [alias('L')]
|
|
|
+ $LowerValue = 2
|
|
|
+)
|
|
|
+ begin {
|
|
|
+ if (!(Get-Module Activedirectory)) {
|
|
|
+ try {
|
|
|
+ Import-Module ActiveDirectory -ErrorAction Stop
|
|
|
+ }
|
|
|
+ catch {
|
|
|
+ Write-Host -Object "ActiveDirectory Module didn't find, Please install it and try again" -BackgroundColor DarkRed
|
|
|
+ Break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ switch ($PsCmdlet.ParameterSetName) {
|
|
|
+ 'Group' {
|
|
|
+ try {
|
|
|
+ $Group = Get-ADGroup $GroupName -Properties Memberof -ErrorAction Stop
|
|
|
+ $MemberOf = $Group | Select-Object -ExpandProperty Memberof
|
|
|
+ $rootname = $Group.Name
|
|
|
+ }
|
|
|
+ catch {
|
|
|
+ Write-Host -Object "`'$GroupName`' groupname doesn't exist in Active Directory, Please try again." -BackgroundColor DarkRed
|
|
|
+ $result = 'Break'
|
|
|
+ Break
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+ 'User' {
|
|
|
+ try {
|
|
|
+ $User = Get-ADUser $UserName -Properties Memberof -ErrorAction Stop
|
|
|
+ $MemberOf = $User | Select-Object -ExpandProperty Memberof -ErrorAction Stop
|
|
|
+ $rootname = $User.Name
|
|
|
+
|
|
|
+ }
|
|
|
+ catch {
|
|
|
+ Write-Host -Object "`'$($User.Name)`' username doesn't exist in Active Directory, Please try again." -BackgroundColor DarkRed
|
|
|
+ $result = 'Break'
|
|
|
+ Break
|
|
|
+ }
|
|
|
+ Break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Process {
|
|
|
+ $Minus = $LowerValue - 2
|
|
|
+ $Spaces = " " * $Minus
|
|
|
+ $Lines = "__"
|
|
|
+ "{0}{1}{2}{3}" -f $Spaces, '|', $Lines, $rootname
|
|
|
+ $LowerValue++
|
|
|
+ $LowerValue++
|
|
|
+ if ($LowerValue -le $UpperValue) {
|
|
|
+ foreach ($member in $MemberOf) {
|
|
|
+ $UpperGroup = Get-ADGroup $member -Properties Memberof
|
|
|
+ $LowerGroup = $UpperGroup | Get-ADGroupMember -erroraction 'silentlycontinue'
|
|
|
+ $LoopCheck = $UpperGroup.MemberOf | ForEach-Object {$lowerGroup.distinguishedName -contains $_}
|
|
|
+
|
|
|
+ if ($LoopCheck -Contains $True) {
|
|
|
+ $rootname = $UpperGroup.Name
|
|
|
+ Write-Host "Loop found on $($UpperGroup.Name), Skipping..." -BackgroundColor DarkRed
|
|
|
+ Continue
|
|
|
+ }
|
|
|
+ #"xxx $($LowerGroup.name)"
|
|
|
+ #$Member
|
|
|
+ #"--- $($UpperGroup.Name) `n"
|
|
|
+ Get-ADGroupTreeViewMemberOf -GroupName $member -LowerValue $LowerValue -UpperValue $UpperValue
|
|
|
+ } #foreach ($member in $MemberOf) {
|
|
|
+ }
|
|
|
+ } #Process
|
|
|
+}
|
|
|
+
|
|
|
+# Show Message and return bool.
|
|
|
+# $asd = Read-MessageBoxDialog -Message "Please press the OK button." -WindowTitle "Message Box Example" -Buttons OKCancel -Icon Exclamation
|
|
|
+function Read-MessageBoxDialog(
|
|
|
+ [string]$Message,
|
|
|
+ [string]$WindowTitle,
|
|
|
+ [System.Windows.Forms.MessageBoxButtons]$Buttons = [System.Windows.Forms.MessageBoxButtons]::OK,
|
|
|
+ [System.Windows.Forms.MessageBoxIcon]$Icon = [System.Windows.Forms.MessageBoxIcon]::None
|
|
|
+){
|
|
|
+ Add-Type -AssemblyName System.Windows.Forms
|
|
|
+ return [System.Windows.Forms.MessageBox]::Show($Message, $WindowTitle, $Buttons, $Icon)
|
|
|
+}
|
|
|
+
|
|
|
+# Show input box popup and return the value entered by the user.
|
|
|
+# $textEntered = Read-InputBoxDialog -Message "Please enter the word 'Banana'" -WindowTitle "Input Box Example" -DefaultText "Apple"
|
|
|
+function Read-InputBoxDialog([string]$Message, [string]$WindowTitle, [string]$DefaultText)
|
|
|
+{
|
|
|
+ Add-Type -AssemblyName Microsoft.VisualBasic
|
|
|
+ return [Microsoft.VisualBasic.Interaction]::InputBox($Message, $WindowTitle, $DefaultText)
|
|
|
+}
|
|
|
+
|
|
|
+function ShowText([string]$Message, [string]$WindowTitle){
|
|
|
+Add-Type -AssemblyName System.Windows.Forms
|
|
|
+Add-Type -AssemblyName System.Drawing
|
|
|
+$window = New-Object System.Windows.Forms.Form
|
|
|
+# $window.Width = 1000
|
|
|
+# $window.Height = 800
|
|
|
+
|
|
|
+ $Label = New-Object System.Windows.Forms.Label
|
|
|
+ $Label.Location = New-Object System.Drawing.Size(10,10)
|
|
|
+ $Label.Text = $Message
|
|
|
+ $Label.AutoSize = $True
|
|
|
+
|
|
|
+$window.Controls.Add($Label)
|
|
|
+[void]$window.ShowDialog()
|
|
|
+}
|
|
|
+
|
|
|
+# if ($args[0] -eq $null -or $args[0] -eq ""){
|
|
|
+if ($inputname -eq $null -or $inputname -eq ""){
|
|
|
+ $inputname = Read-InputBoxDialog -Message "Please enter an AD Groupname" -WindowTitle "Enter Groupname" -DefaultText "Domänen-Benutzer"
|
|
|
+}
|
|
|
+if ($inputname -eq $null -or $inputname -eq ""){
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+Get-ADGroupTreeViewMemberOf -groupname $inputname
|
|
|
+# Get-ADGroupTreeViewMemberOf -UserName $inputname
|
|
|
+#Get-ADGroupTreeViewMemberOf -UserName user1
|
|
|
+pause
|