UserMemberOfView.ps1 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. param (
  2. [alias('U')]
  3. [string]$UserName = '',
  4. [alias('G')]
  5. [string]$GroupName = '',
  6. [alias('S')]
  7. [string]$Server = ''
  8. )
  9. function Get-ADGroupTreeViewMemberOf {
  10. #requires -version 4
  11. <#
  12. .SYNOPSIS
  13. Show UpStream tree view hierarchy of memberof groups recursively of a Active Directory user and Group.
  14. .DESCRIPTION
  15. The Show-ADGroupTreeViewMemberOf list all nested group list of a AD user. It requires only valid parameter AD username,
  16. .PARAMETER UserName
  17. 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.
  18. .PARAMETER GroupName
  19. 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.
  20. .INPUTS
  21. Microsoft.ActiveDirectory.Management.ADUser
  22. .OUTPUTS
  23. Microsoft.ActiveDirectory.Management.ADGroup
  24. .NOTES
  25. Version: 1.0
  26. Author: Kunal Udapi
  27. Creation Date: 10 September 2017
  28. Purpose/Change: Get the exact nested group info of user
  29. Useful URLs: http://vcloud-lab.com
  30. .EXAMPLE
  31. PS C:\>.\Get-ADGroupTreeViewMemberOf -UserName Administrator
  32. This list all the upstream memberof group of an user.
  33. .EXAMPLE
  34. PS C:\>.\Get-ADGroupTreeViewMemberOf -GroupName DomainAdmins
  35. This list all the upstream memberof group of a Group.
  36. #>
  37. [CmdletBinding(SupportsShouldProcess=$True,
  38. ConfirmImpact='Medium',
  39. HelpURI='http://vcloud-lab.com',
  40. DefaultParameterSetName='User')]
  41. Param
  42. (
  43. [parameter(ParameterSetName = 'User',Position=0, ValueFromPipelineByPropertyName=$true, ValueFromPipeline=$true, HelpMessage='Type valid AD username')]
  44. [alias('User')]
  45. [String]$UserName = 'Administrator',
  46. [parameter(ParameterSetName = 'Group',Position=0, ValueFromPipelineByPropertyName=$true, ValueFromPipeline=$true, HelpMessage='Type valid AD Group')]
  47. [alias('Group')]
  48. [String]$GroupName = 'Domain Admins',
  49. [parameter(ParameterSetName = 'Group', DontShow=$True)]
  50. [parameter(ParameterSetName = 'User', DontShow=$True)]
  51. [alias('S')]
  52. [String]$Server = 'localhost',
  53. [alias('U')]
  54. $UpperValue = [System.Int32]::MaxValue,
  55. [parameter(ParameterSetName = 'Group', DontShow=$True)]
  56. [parameter(ParameterSetName = 'User', DontShow=$True)]
  57. [alias('L')]
  58. $LowerValue = 2
  59. )
  60. begin {
  61. if (!(Get-Module Activedirectory)) {
  62. try {
  63. Import-Module ActiveDirectory -ErrorAction Stop
  64. }
  65. catch {
  66. Write-Host -Object "ActiveDirectory Module didn't find, Please install it and try again" -BackgroundColor DarkRed
  67. Break
  68. }
  69. }
  70. switch ($PsCmdlet.ParameterSetName) {
  71. 'Group' {
  72. try {
  73. $Group = Get-ADGroup -Server $Server $GroupName -Properties Memberof -ErrorAction Stop
  74. $MemberOf = $Group | Select-Object -ExpandProperty Memberof
  75. $rootname = $Group.Name
  76. }
  77. catch {
  78. Write-Host -Object "`'$GroupName`' groupname doesn't exist in Active Directory, Please try again." -BackgroundColor DarkRed
  79. $result = 'Break'
  80. Break
  81. }
  82. break
  83. }
  84. 'User' {
  85. try {
  86. $User = Get-ADUser -Server $Server $UserName -Properties Memberof -ErrorAction Stop
  87. $MemberOf = $User | Select-Object -ExpandProperty Memberof -ErrorAction Stop
  88. $rootname = $User.Name
  89. }
  90. catch {
  91. Write-Host -Object "`'$UserName`' username doesn't exist in Active Directory, Please try again." -BackgroundColor DarkRed
  92. $result = 'Break'
  93. Break
  94. }
  95. Break
  96. }
  97. }
  98. }
  99. Process {
  100. $Minus = $LowerValue - 2
  101. $Spaces = " " * $Minus
  102. $Lines = "__"
  103. "{0}{1}{2}{3}" -f $Spaces, '|', $Lines, $rootname
  104. $LowerValue++
  105. $LowerValue++
  106. if ($LowerValue -le $UpperValue) {
  107. foreach ($member in $MemberOf) {
  108. $UpperGroup = Get-ADGroup -Server $Server $member -Properties Memberof
  109. $LowerGroup = $UpperGroup | Get-ADGroupMember -erroraction 'silentlycontinue'
  110. $LoopCheck = $UpperGroup.MemberOf | ForEach-Object {$lowerGroup.distinguishedName -contains $_}
  111. if ($LoopCheck -Contains $True) {
  112. $rootname = $UpperGroup.Name
  113. Write-Host "Loop found on $($UpperGroup.Name), Skipping..." -BackgroundColor DarkRed
  114. Continue
  115. }
  116. #"xxx $($LowerGroup.name)"
  117. #$Member
  118. #"--- $($UpperGroup.Name) `n"
  119. Get-ADGroupTreeViewMemberOf -Server $Server -GroupName $member -LowerValue $LowerValue -UpperValue $UpperValue
  120. } #foreach ($member in $MemberOf) {
  121. }
  122. } #Process
  123. }
  124. # Show Message and return bool.
  125. # $asd = Read-MessageBoxDialog -Message "Please press the OK button." -WindowTitle "Message Box Example" -Buttons OKCancel -Icon Exclamation
  126. function Read-MessageBoxDialog(
  127. [string]$Message,
  128. [string]$WindowTitle,
  129. [System.Windows.Forms.MessageBoxButtons]$Buttons = [System.Windows.Forms.MessageBoxButtons]::OK,
  130. [System.Windows.Forms.MessageBoxIcon]$Icon = [System.Windows.Forms.MessageBoxIcon]::None
  131. ){
  132. Add-Type -AssemblyName System.Windows.Forms
  133. return [System.Windows.Forms.MessageBox]::Show($Message, $WindowTitle, $Buttons, $Icon)
  134. }
  135. # Show input box popup and return the value entered by the user.
  136. # $textEntered = Read-InputBoxDialog -Message "Please enter the word 'Banana'" -WindowTitle "Input Box Example" -DefaultText "Apple"
  137. function Read-InputBoxDialog([string]$Message, [string]$WindowTitle, [string]$DefaultText)
  138. {
  139. Add-Type -AssemblyName Microsoft.VisualBasic
  140. return [Microsoft.VisualBasic.Interaction]::InputBox($Message, $WindowTitle, $DefaultText)
  141. }
  142. function ShowText([string]$Message, [string]$WindowTitle){
  143. Add-Type -AssemblyName System.Windows.Forms
  144. Add-Type -AssemblyName System.Drawing
  145. $window = New-Object System.Windows.Forms.Form
  146. # $window.Width = 1000
  147. # $window.Height = 800
  148. $Label = New-Object System.Windows.Forms.Label
  149. $Label.Location = New-Object System.Drawing.Size(10,10)
  150. $Label.Text = $Message
  151. $Label.AutoSize = $True
  152. $window.Controls.Add($Label)
  153. [void]$window.ShowDialog()
  154. }
  155. if ($Server -eq $null -or $Server -eq ""){
  156. $Server = Read-InputBoxDialog -Message "Please enter an AD Server" -WindowTitle "Enter Server" -DefaultText "localhost"
  157. }
  158. if ($Server -eq $null -or $Server -eq ""){
  159. return
  160. }
  161. # if ($args[0] -eq $null -or $args[0] -eq ""){
  162. if ($UserName -eq "" -and $GroupName -eq ""){
  163. $UserName = Read-InputBoxDialog -Message "Please enter an AD Username or cancel to enter Group Name" -WindowTitle "Enter Username" -DefaultText "Administrator"
  164. }
  165. if ($UserName -eq ""){
  166. if ($GroupName -eq ""){
  167. $GroupName = Read-InputBoxDialog -Message "Please enter an AD Group Name" -WindowTitle "Enter Group" -DefaultText "Domain Users"
  168. }
  169. if ($GroupName -eq ""){
  170. return
  171. }
  172. Get-ADGroupTreeViewMemberOf -GroupName $GroupName -Server $Server
  173. }
  174. Get-ADGroupTreeViewMemberOf -UserName $UserName -Server $Server
  175. pause