# encoding: ascii
# api: powershell
# title: Get-GroupStructure (GUI)
# description: Same as functionality as http://poshcode.org/5536 but with a GUI on top.
# version: 3.1.26
# type: function
# author: DollarUnderscore
# license: CC0
# function: Call-ExportADGroupMembers_pff
# x-poshcode-id: 5537
# x-archived: 2015-03-24T01:06:46
# x-published: 2015-10-24T11:00:00
#
# Requires PowerShell v.3 and the Active Directory module to run.
# Some information about it is available at my blog:
# http://dollarunderscore.azurewebsites.net/?p=3601
#
#========================================================================
# Code Generated By: SAPIEN Technologies, Inc., PowerShell Studio 2012 v3.1.26
# Generated On: 2014-10-24 12:41
# Generated By: Anders Wahlqvist
# Site: http://dollarunderscore.azurewebsites.net
#========================================================================
#----------------------------------------------
#region Application Functions
#----------------------------------------------
function OnApplicationLoad {
#Note: This function is not called in Projects
#Note: This function runs before the form is created
#Note: To get the script directory in the Packager use: Split-Path $hostinvocation.MyCommand.path
#Note: To get the console output in the Packager (Windows Mode) use: $ConsoleOutput (Type: System.Collections.ArrayList)
#Important: Form controls cannot be accessed in this function
#TODO: Add snapins and custom code to validate the application load
Import-Module ActiveDirectory
return $true #return true for success or false for failure
}
function OnApplicationExit {
#Note: This function is not called in Projects
#Note: This function runs after the form is closed
#TODO: Add custom code to clean up and unload snapins when the application exits
$script:ExitCode = 0 #Set the exit code for the Packager
}
#endregion Application Functions
#----------------------------------------------
# Generated Form Function
#----------------------------------------------
function Call-ExportADGroupMembers_pff {
#----------------------------------------------
#region Import the Assemblies
#----------------------------------------------
[void][reflection.assembly]::Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][reflection.assembly]::Load("System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][reflection.assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][reflection.assembly]::Load("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][reflection.assembly]::Load("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
[void][reflection.assembly]::Load("System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][reflection.assembly]::Load("System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
[void][reflection.assembly]::Load("System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][reflection.assembly]::Load("System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
#endregion Import Assemblies
#----------------------------------------------
#region Generated Form Objects
#----------------------------------------------
[System.Windows.Forms.Application]::EnableVisualStyles()
$formExportGroupMembers = New-Object 'System.Windows.Forms.Form'
$buttonExportTreeStructure = New-Object 'System.Windows.Forms.Button'
$buttonBrowseFolder = New-Object 'System.Windows.Forms.Button'
$textboxFile = New-Object 'System.Windows.Forms.TextBox'
$buttonExportMembers = New-Object 'System.Windows.Forms.Button'
$labelSaveTo = New-Object 'System.Windows.Forms.Label'
$statusbar1 = New-Object 'System.Windows.Forms.StatusBar'
$checkboxRecursive = New-Object 'System.Windows.Forms.CheckBox'
$labelADGroupName = New-Object 'System.Windows.Forms.Label'
$textbox1 = New-Object 'System.Windows.Forms.TextBox'
$openfiledialog1 = New-Object 'System.Windows.Forms.OpenFileDialog'
$folderbrowserdialog1 = New-Object 'System.Windows.Forms.FolderBrowserDialog'
$savefiledialog1 = New-Object 'System.Windows.Forms.SaveFileDialog'
$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
#endregion Generated Form Objects
#----------------------------------------------
# User Generated Script
#----------------------------------------------
$formExportGroupMembers_Load={
#TODO: Initialize Form Controls here
}
$buttonBrowse_Click={
if($openfiledialog1.ShowDialog() -eq 'OK')
{
$textboxFile.Text = $openfiledialog1.FileName
}
}
$buttonExportMembers_Click={
#TODO: Place custom script here
$GroupMembers = $null
if ($checkboxRecursive.Checked) {
try {
$GroupMembers = Get-ADGroupMember -Identity $textbox1.Text -Recursive -ErrorAction 'Stop'
}
catch {
$statusbar1.Text = $Error[0]
return
}
}
else {
try {
$GroupMembers = Get-ADGroupMember -Identity $textbox1.Text -ErrorAction 'Stop'
}
catch {
$statusbar1.Text = $Error[0]
return
}
}
try {
$GroupMembers | Get-ADUser -Properties DisplayName, LastLogonDate, mail, manager, Description -ErrorAction 'SilentlyContinue' | Export-Csv $textboxFile.Text -Delimiter ";" -Encoding utf8 -NoTypeInformation -ErrorAction 'Stop'
}
catch {
$statusbar1.Text = $Error[0]
return
}
$statusbar1.Text = "$($GroupMembers.count) members exported."
}
$buttonBrowseFolder_Click={
if($savefiledialog1.ShowDialog() -eq 'OK')
{
$textboxFile.Text = $savefiledialog1.FileName
}
}
$buttonExportTreeStructure_Click={
#TODO: Place custom script here
$statusbar1.Text = "Working..."
function Get-GroupStructure
{
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
}
}
}
try {
$Structure = Get-GroupStructure -GroupName $textbox1.Text
}
catch {
$statusbar1.Text = $Error[0]
return
}
try {
$Structure | Sort-Object -ErrorAction 'Stop' | Out-File $textboxFile.Text -Encoding utf8 -ErrorAction 'Stop'
}
catch {
$statusbar1.Text = $Error[0]
return
}
$statusbar1.Text = "Group tree structure exported."
}
# --End User Generated Script--
#----------------------------------------------
#region Generated Events
#----------------------------------------------
$Form_StateCorrection_Load=
{
#Correct the initial state of the form to prevent the .Net maximized form issue
$formExportGroupMembers.WindowState = $InitialFormWindowState
}
$Form_Cleanup_FormClosed=
{
#Remove all event handlers from the controls
try
{
$buttonExportTreeStructure.remove_Click($buttonExportTreeStructure_Click)
$buttonBrowseFolder.remove_Click($buttonBrowseFolder_Click)
$buttonExportMembers.remove_Click($buttonExportMembers_Click)
$formExportGroupMembers.remove_Load($formExportGroupMembers_Load)
$formExportGroupMembers.remove_Load($Form_StateCorrection_Load)
$formExportGroupMembers.remove_FormClosed($Form_Cleanup_FormClosed)
}
catch [Exception]
{ }
}
#endregion Generated Events
#----------------------------------------------
#region Generated Form Code
#----------------------------------------------
#
# formExportGroupMembers
#
$formExportGroupMembers.Controls.Add($buttonExportTreeStructure)
$formExportGroupMembers.Controls.Add($buttonBrowseFolder)
$formExportGroupMembers.Controls.Add($textboxFile)
$formExportGroupMembers.Controls.Add($buttonExportMembers)
$formExportGroupMembers.Controls.Add($labelSaveTo)
$formExportGroupMembers.Controls.Add($statusbar1)
$formExportGroupMembers.Controls.Add($checkboxRecursive)
$formExportGroupMembers.Controls.Add($labelADGroupName)
$formExportGroupMembers.Controls.Add($textbox1)
$formExportGroupMembers.ClientSize = '372, 188'
$formExportGroupMembers.FormBorderStyle = 'Fixed3D'
$formExportGroupMembers.Name = "formExportGroupMembers"
$formExportGroupMembers.Text = "Export group members"
$formExportGroupMembers.add_Load($formExportGroupMembers_Load)
#
# buttonExportTreeStructure
#
$buttonExportTreeStructure.Location = '283, 126'
$buttonExportTreeStructure.Name = "buttonExportTreeStructure"
$buttonExportTreeStructure.Size = '81, 34'
$buttonExportTreeStructure.TabIndex = 6
$buttonExportTreeStructure.Text = "Export tree structure"
$buttonExportTreeStructure.UseVisualStyleBackColor = $True
$buttonExportTreeStructure.add_Click($buttonExportTreeStructure_Click)
#
# buttonBrowseFolder
#
$buttonBrowseFolder.Location = '247, 94'
$buttonBrowseFolder.Name = "buttonBrowseFolder"
$buttonBrowseFolder.Size = '30, 23'
$buttonBrowseFolder.TabIndex = 4
$buttonBrowseFolder.Text = "..."
$buttonBrowseFolder.UseVisualStyleBackColor = $True
$buttonBrowseFolder.add_Click($buttonBrowseFolder_Click)
#
# textboxFile
#
$textboxFile.AutoCompleteMode = 'SuggestAppend'
$textboxFile.AutoCompleteSource = 'FileSystemDirectories'
$textboxFile.Location = '13, 96'
$textboxFile.Name = "textboxFile"
$textboxFile.Size = '228, 20'
$textboxFile.TabIndex = 3
#
# buttonExportMembers
#
$buttonExportMembers.Location = '283, 88'
$buttonExportMembers.Name = "buttonExportMembers"
$buttonExportMembers.Size = '81, 34'
$buttonExportMembers.TabIndex = 5
$buttonExportMembers.Text = "Export members"
$buttonExportMembers.UseVisualStyleBackColor = $True
$buttonExportMembers.add_Click($buttonExportMembers_Click)
#
# labelSaveTo
#
$labelSaveTo.Location = '13, 72'
$labelSaveTo.Name = "labelSaveTo"
$labelSaveTo.Size = '100, 23'
$labelSaveTo.TabIndex = 4
$labelSaveTo.Text = "Save to:"
#
# statusbar1
#
$statusbar1.Location = '0, 166'
$statusbar1.Name = "statusbar1"
$statusbar1.Size = '372, 22'
$statusbar1.TabIndex = 3
#
# checkboxRecursive
#
$checkboxRecursive.Checked = $True
$checkboxRecursive.CheckState = 'Checked'
$checkboxRecursive.Location = '283, 40'
$checkboxRecursive.Name = "checkboxRecursive"
$checkboxRecursive.Size = '81, 24'
$checkboxRecursive.TabIndex = 2
$checkboxRecursive.Text = "Recursive"
$checkboxRecursive.UseVisualStyleBackColor = $True
#
# labelADGroupName
#
$labelADGroupName.Location = '12, 11'
$labelADGroupName.Name = "labelADGroupName"
$labelADGroupName.Size = '265, 23'
$labelADGroupName.TabIndex = 1
$labelADGroupName.Text = "AD group name:"
#
# textbox1
#
$textbox1.Location = '12, 40'
$textbox1.Name = "textbox1"
$textbox1.Size = '265, 20'
$textbox1.TabIndex = 0
#
# openfiledialog1
#
$openfiledialog1.DefaultExt = "txt"
$openfiledialog1.Filter = "Text File (.txt)|*.txt|All Files|*.*"
$openfiledialog1.ShowHelp = $True
#
# folderbrowserdialog1
#
#
# savefiledialog1
#
$savefiledialog1.DefaultExt = "csv"
$savefiledialog1.Filter = "*.csv|All files"
#endregion Generated Form Code
#----------------------------------------------
#Save the initial state of the form
$InitialFormWindowState = $formExportGroupMembers.WindowState
#Init the OnLoad event to correct the initial state of the form
$formExportGroupMembers.add_Load($Form_StateCorrection_Load)
#Clean up the control events
$formExportGroupMembers.add_FormClosed($Form_Cleanup_FormClosed)
#Show the Form
return $formExportGroupMembers.ShowDialog()
} #End Function
#Call OnApplicationLoad to initialize
if((OnApplicationLoad) -eq $true)
{
#Call the form
Call-ExportADGroupMembers_pff | Out-Null
#Perform cleanup
OnApplicationExit
}