blackhawk17
Goto Top

Postfachordner mit Powershell Gui erstellen

Guten Morgen,

für verschiedene Anwendungsfälle ist es notwendig z.B. für freigegebene Postfächer, ab und an zusätzliche Ordner anzulegen.

Hierfür wollte ich mir gerne ein kleines Skript bauen.

Folgendes habe ich mir zusammengetragen

# Die ersten beiden Befehle holen sich die .NET-Erweiterungen (sog. Assemblys) für die grafische Gestaltung in den RAM.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")   


# Die nächste Zeile erstellt aus der Formsbibliothek das Fensterobjekt.
$objForm = New-Object System.Windows.Forms.Form

# Position des Fensters festlegen
$objForm.StartPosition = "CenterScreen"  

# Fenstergröße festlegen
$objForm.Size = New-Object System.Drawing.Size(800,800)

# Titelleiste festlegen
$objForm.Text = "Postfachordner erstellen"  

#Globale Befehle abschicken um User aus dem AD in $user zu laden (siehe dropdown)
$user = Get-ADUser -Filter * -SearchBase "DC=contoso,DC=com" | Select -ExpandProperty SamAccountName  

#Ordnerhirachie eines Postfachs auslesen
#$test = Get-MailboxFolder -Identity $objCombobox.SelectedItem -GetChildren -MailFolderOnly


    #Button erstellen

    #OK Button
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(550,720)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"  
    $OKButton.Name = "OK"  
    $OKButton.DialogResult = "OK"  
    $OKButton.Add_Click({New-MailboxFolder -Parent "$($objCombobox.SelectedItem):\$($objComboboxpostfach.SelectedItem)" -Name ($objTextBoxNeuerOrdner.Text)})  
    $objForm.Controls.Add($OKButton) 

    #Abbrechen Button
    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(650,720)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = "Abbrechen"  
    $CancelButton.Name = "Abbrechen"  
    $CancelButton.DialogResult = "Cancel"  
    $CancelButton.Add_Click({$objForm.Close()})
    $objForm.Controls.Add($CancelButton) 

        
        #Textfeld erstellen

        #Neuer Ordner
        $objLabel = New-Object System.Windows.Forms.Label
        $objLabel.Location = New-Object System.Drawing.Size(28,175) 
        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
        $objLabel.Text = "Bitte den Namen des neues Ordners angeben"  
        $objLabel.Name = "Bitte den Namen des neues Ordners angeben"  
        $objForm.Controls.Add($objLabel)
        
            $objTextBoxNeuerOrdner = New-Object System.Windows.Forms.TextBox 
            $objTextBoxNeuerOrdner.Location = New-Object System.Drawing.Size(30,195) 
            $objTextBoxNeuerOrdner.Size = New-Object System.Drawing.Size(200,20) 
            $objForm.Controls.Add($objTextBoxNeuerOrdner)
            $objTextBoxNeuerOrdner.Text = "z.B. Projekte"  

#############################################################################################################

#Drop Down Feld erstellen

        #User aus dem Ad anzeigen

        $objLabel = New-Object System.Windows.Forms.Label
        $objLabel.Location = New-Object System.Drawing.Size(28,60) 
        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
        $objLabel.Text = "Bitte Benutzernamen wählen:"  
        $objForm.Controls.Add($objLabel) 

            $objCombobox = New-Object System.Windows.Forms.Combobox 
            $objCombobox.Location = New-Object System.Drawing.Size(30,80) 
            $objCombobox.Size = New-Object System.Drawing.Size(200,20) 
            $objCombobox.Height = 70
            $objForm.Controls.Add($objCombobox) 
            $objForm.Topmost = $True
            $objForm.Add_Shown({$objForm.Activate()})
            $objCombobox.Items.AddRange($user) #User werden aus der Variable geladen und angezeigt
            $objCombobox.SelectedItem #ausgewählter Username wird übernommen


        #Postfachordner werden ausgelesen und angezeigt

        $objLabel = New-Object System.Windows.Forms.Label
        $objLabel.Location = New-Object System.Drawing.Size(28,120) 
        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
        $objLabel.Text = "Postfachordner wählen:"  
        $objForm.Controls.Add($objLabel) 

            $objComboboxpostfach = New-Object System.Windows.Forms.Combobox 
            $objComboboxpostfach.Location = New-Object System.Drawing.Size(30,140) 
            $objComboboxpostfach.Size = New-Object System.Drawing.Size(200,20) 
            $objComboboxpostfach.Height = 70
            $objForm.Controls.Add($objComboboxpostfach) 
            $objForm.Topmost = $True
            $objForm.Add_Shown({$objForm.Activate()})
            $objComboboxpostfach.Items.AddRange($test) #User werden aus der Variable geladen und angezeigt
            $objComboboxpostfach.SelectedItem #ausgewählter Username wird übernommen


######################################################################################################


            # Laden des ActiveDirectoryModuls
            Import-Module ActiveDirectory

            # Ermitteln des Exchangenamens über das AD
            $exchange_server = Get-ADObject -LDAPFilter 'objectClass=msExchExchangeServer' -SearchBase (([ADSI]"LDAP://RootDse").configurationNamingContext.ToString()) -Properties networkaddress | select -Expand networkaddress | ?{$_ -match 'ncacn_ip_tcp'} | %{$_.split(":")[1]} | select -First 1  
            if (!$exchange_server){Write-Host "Could not determine Exchange Server from AD" -ForegroundColor Red; return}  

            # Verbindung zum Exchange herstellen
            $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://$exchange_server/powershell" -Authentication Kerberos  
            Import-PSSession $session -DisableNameChecking -AllowClobber | out-null

            # Load ActiveDirectory module
            Import-Module ActiveDirectory

            # Load Exchange environment
            Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn


[void] $objForm.ShowDialog()


Das Skript funktioniert soweit auch wunderbar.

Was mir nur fehlt ist in 2. Dropdownfeld würde ich gerne die bereits vorhandenen Postfachordner des im Dropdownfeld 1 ausgewählten User anzeigen lassen.

Ich hatte gedacht, dies mit z.B. $test = Get-MailboxFolder -Identity $objCombobox.SelectedItem -GetChildren -MailFolderOnly abzufragen.

Dies schlägt natürlich fehl, da der Wert für $objCombobox.SelectedItem noch gar nicht da ist.

Zudem bekomme ich vom 2. Dropdownfeld einen Fehler, da in der Variable natürlich nichts drin ist.

Hat jemand von Euch eine Idee wie ich das 2. Dropdownfeld so abbilden kann, dass es die Postfachordner des ausgewählten Users aus Dropdownfeld 1 laden kann?

Alternative wäre natürlich jetzt ein Textfeld zu erstellen und den Postfachordner "händisch" einzugeben, allerdings finde ich das nicht so toll.

Würde mich freuen, wenn da jemand von Euch einen Tipp für mich hätte.

Content-ID: 334131

Url: https://administrator.de/contentid/334131

Ausgedruckt am: 17.11.2024 um 01:11 Uhr

colinardo
colinardo 05.04.2017 aktualisiert um 08:58:10 Uhr
Goto Top
Moin.
Benutze einfach das SelectedIndexChanged Event der ersten Combobox. Im Event holst du dir dann die Ordner und füllst damit die zweite Combobox face-wink
https://msdn.microsoft.com/de-de/library/system.windows.forms.combobox.s ...

$objCombobox.Add_SelectedIndexChanged({
    # hier zweite Box befüllen. Natürlich vorher checken ob Index nicht -1 ist also nichts ausgewählt ist
})

Grüße Uwe
blackhawk17
blackhawk17 05.04.2017 um 10:07:26 Uhr
Goto Top
Sehr cool, funktioniert face-smile

Vielen Dak
blackhawk17
blackhawk17 06.04.2017 um 08:08:06 Uhr
Goto Top
Dazu evtl. noch eine Verständnisfrage

# Die ersten beiden Befehle holen sich die .NET-Erweiterungen (sog. Assemblys) für die grafische Gestaltung in den RAM.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")   


# Die nächste Zeile erstellt aus der Formsbibliothek das Fensterobjekt.
$objForm = New-Object System.Windows.Forms.Form

# Position des Fensters festlegen
$objForm.StartPosition = "CenterScreen"  

# Fenstergröße festlegen
$objForm.Size = New-Object System.Drawing.Size(800,800)

# Titelleiste festlegen
$objForm.Text = "Postfachordner erstellen"  



#############################################################################################################


#Globale Befehle abschicken um User aus dem AD in $user zu laden (siehe dropdown)
$user = Get-ADUser -Filter * -SearchBase "DC=contoso,DC=com" | Select -ExpandProperty SamAccountName  
$user1 = Get-ADUser -Filter * -SearchBase "DC=contoso,DC=com" | Select -ExpandProperty SamAccountName  



#############################################################################################################

#Button erstellen




    #PostfachOrdnerAnlegen Button
    
    $PostfachOrdnerAnlegenButton = New-Object System.Windows.Forms.Button
    $PostfachOrdnerAnlegenButton.Location = New-Object System.Drawing.Size(28,10)
    $PostfachOrdnerAnlegenButton.Size = New-Object System.Drawing.Size(150,20)
    $PostfachOrdnerAnlegenButton.Text = "Postfach Ordner Anlegen"  
    $PostfachOrdnerAnlegenButton.Name = "Postfach Ordner Anlegen"  
    $PostfachOrdnerAnlegenButton.Add_Click({ })
    $objForm.Controls.Add($PostfachOrdnerAnlegenButton) 
    
    #Dieser löst folgendes aus:      
        


#############################################################################################################

#Drop Down Feld erstellen

        #User aus dem Ad anzeigen

        $objLabel = New-Object System.Windows.Forms.Label
        $objLabel.Location = New-Object System.Drawing.Size(28,60) 
        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
        $objLabel.Text = "Bitte Benutzernamen wählen:"  
        $objForm.Controls.Add($objLabel) 

            $objCombobox = New-Object System.Windows.Forms.Combobox 
            $objCombobox.Location = New-Object System.Drawing.Size(30,80) 
            $objCombobox.Size = New-Object System.Drawing.Size(200,20) 
            $objCombobox.Height = 70
            $objForm.Controls.Add($objCombobox) 
            $objForm.Topmost = $True
            $objForm.Add_Shown({$objForm.Activate()})
            $objCombobox.Items.AddRange($user) #User werden aus der Variable geladen und angezeigt
            $objCombobox.SelectedItem #ausgewählter Username wird übernommen
            
            $objCombobox.Add_SelectedIndexChanged({ 


                   $postfachordner = Get-MailboxFolder -Identity $objCombobox.SelectedItem -Recurse



                        $objLabel = New-Object System.Windows.Forms.Label
                        $objLabel.Location = New-Object System.Drawing.Size(28,120) 
                        $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
                        $objLabel.Text = "Postfachordner wählen:"  
                        $objForm.Controls.Add($objLabel) 

                            $objComboboxpostfach = New-Object System.Windows.Forms.Combobox 
                            $objComboboxpostfach.Location = New-Object System.Drawing.Size(30,140) 
                            $objComboboxpostfach.Size = New-Object System.Drawing.Size(200,20) 
                            $objComboboxpostfach.Height = 70
                            $objForm.Controls.Add($objComboboxpostfach) 
                            $objForm.Topmost = $True
                            $objForm.Add_Shown({$objForm.Activate()})
                            $objComboboxpostfach.Items.AddRange($postfachordner) #User werden aus der Variable geladen und angezeigt
                            $objComboboxpostfach.SelectedItem #ausgewählter Username wird übernommen

                            $objComboboxpostfach.Add_SelectedIndexChanged({  })        

                 }) 

                                    #Textfeld erstellen

                                            #Neuer Ordner, welcher erstellt werden soll
                                            $objLabel = New-Object System.Windows.Forms.Label
                                            $objLabel.Location = New-Object System.Drawing.Size(28,175) 
                                            $objLabel.Size = New-Object System.Drawing.Size(1000,20) 
                                            $objLabel.Text = "Bitte den Namen des neues Ordners angeben"  
                                            $objLabel.Name = "Bitte den Namen des neues Ordners angeben"  
                                            $objForm.Controls.Add($objLabel)
        
                                                $objTextBoxNeuerOrdner = New-Object System.Windows.Forms.TextBox 
                                                $objTextBoxNeuerOrdner.Location = New-Object System.Drawing.Size(30,195) 
                                                $objTextBoxNeuerOrdner.Size = New-Object System.Drawing.Size(200,20) 
                                                $objForm.Controls.Add($objTextBoxNeuerOrdner)
                                                $objTextBoxNeuerOrdner.Text = "z.B. Projekte"  

                                               
                                                
                           
                                            #OK Button anzeigen lassen
                                            $OKButton = New-Object System.Windows.Forms.Button
                                            $OKButton.Location = New-Object System.Drawing.Size(500,720)
                                            $OKButton.Size = New-Object System.Drawing.Size(75,23)
                                            $OKButton.Text = "OK"  
                                            $OKButton.Name = "OK"  
                                            $OKButton.DialogResult = "OK"  
                                            $OKButton.Add_Click({New-MailboxFolder -Parent "$($objCombobox.SelectedItem):\$($objComboboxpostfach.SelectedItem)" -Name ($objTextBoxNeuerOrdner.Text)})  
                                            $objForm.Controls.Add($OKButton) 



Ich habe jetzt hinter der 2. Checkbox das $objComboboxpostfach.Add_SelectedIndexChanged({ })

})

Gesetzt, damit die 2. Checkbox erst dann erscheint, wenn auch erst die Auswahl in der ersten Checkbox gemacht wurde.

Jetzt dachte ich mir, es wäre ja super, wenn man das Textfeld und sogar den OK Button auch gleich in eine Abhängigkeit bringe, also habe ich die Klammern dementsprechend erweitert und ans Ende gesetzt.

Klappt soweit auch ganz gut bis auf die Meldung, dass er Befehl, welchen ich mit dem OK Button ausführt sagt "dass das Textfeld" leer ist.

Sprich der Inhalt meines Textfeldes wird mit einmal nicht mehr mitgegeben.

Ich verstehe aber nicht so wirklich warum das so ist. Warum schneidet er den Inhalt des Textfeldes jetzt mit einmal weg? Ohne Klammern geht es ja, nur dann in das Textfeld halt von Anfang an sichtbar und das ist natürlich vom Design her auch nicht so schön.

Kann mir das evtl. jemand erklären, warum dies so ist?

Vielen Dank
colinardo
colinardo 06.04.2017 aktualisiert um 10:45:38 Uhr
Goto Top
Das liegt am Variable-Scope!
Bitte dazu erst mal die Grundlagen lesen, dann verstehst du warum Variablen in Skriptblocks "{}" und "Funktionen" anders gehandhabt werden.
Folgende Seite ist sehr essentiell für das grundlegende Verstehen von Powershell-Variablen und deswegen solltest du sie sehr aufmerksam durchlesen und mit Üben verinnerlichen:
https://technet.microsoft.com/de-de/library/hh847849.aspx
Bei GUIs arbeitet man deswegen meist mit Globalen Variablen wenn sie aus allen Subexpressions angesprochen und beschrieben werden sollen ($global:varname).