none
Powershell GUI Aktion beim klicken auf OK-Button RRS feed

  • Frage

  • Hallo zusammen,

    Erst einmal, ich bin eine Neuling was Powershell angeht.

    Ich möchte eine Skript mit GUI machen bei dem die Gruppenmitglieder ausgelesen werden und in einem auswählbaren Ablageort abgelegt werden können.

    Die Eingaben funktionieren, jetzt müsste nur noch das Get-ADGroupMember funktionieren sobald man auf den OKButton klickt.

    Wie geht das?

    LG Wirzu

    Mein Code:

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.StartPosition = "CenterScreen"
    
    
    
    #TextBox Gruppe
    $objTextBoxGruppe = New-Object System.Windows.Forms.TextBox 
    $objTextBoxGruppe.Location = New-Object System.Drawing.Size(100,50) 
    $objTextBoxGruppe.Size = New-Object System.Drawing.Size(150,20) 
    $objTextBoxGruppe.Text = "Bitte Gruppe eingeben"
    $objForm.Controls.Add($objTextBoxGruppe)
    
    
    #Ordner auswählen button
    $SelectButton = New-Object System.Windows.Forms.Button
    $SelectButton.Location = New-Object System.Drawing.Size(280,100)
    $SelectButton.Size = New-Object System.Drawing.Size(75,23)
    $SelectButton.Text = "Ordner auswählen"
    $SelectButton.Name = "Ordner auswählen"
    $SelectButton.Add_Click({$pfad = Read-FolderBrowserDialog;
    $objTextBoxSpeicherort.Text = $pfad[1] })
    $objForm.Controls.Add($SelectButton)
    
    
    #TextBox Speicherort
    $objTextBoxSpeicherort = New-Object System.Windows.Forms.TextBox 
    $objTextBoxSpeicherort.Location = New-Object System.Drawing.Size(100,100) 
    $objTextBoxSpeicherort.Size = New-Object System.Drawing.Size(150,20) 
    $objForm.Controls.Add($objTextBoxSpeicherort)
    
    #Label Gruppe
    $objLabelGruppe = New-Object System.Windows.Forms.Label
    $objLabelGruppe.Location = New-Object System.Drawing.Size(10,50) 
    $objLabelGruppe.Size = New-Object System.Drawing.Size(100,20) 
    $objLabelGruppe.Text = "Gruppe:"
    $objLabelGruppe.Name = "Gruppe"
    $objForm.Controls.Add($objLabelGruppe)
    
    
    #Label Speicherort
    $objLabelSpeicherort = New-Object System.Windows.Forms.Label
    $objLabelSpeicherort.Location = New-Object System.Drawing.Size(10,100) 
    $objLabelSpeicherort.Size = New-Object System.Drawing.Size(100,20) 
    $objLabelSpeicherort.Text = "Speicherort:"
    $objLabelSpeicherort.Name = "Speicherort"
    $objForm.Controls.Add($objLabelSpeicherort)
    
    
    #OKbutton
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,150)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Name = "OK"
    $OKButton.Add_Click({
    $Gruppe = $objTextBoxGruppe.Text
    #script
    
    Get-ADGroupMember -identity $Gruppe | Select distinguishedName |Export-csv -encoding utf8 -path $pfad[1]\$Gruppe.csv
    
    
    
    })
    $objForm.Controls.Add($OKButton)
    
    
    function Read-FolderBrowserDialog()
    {
        Add-Type -AssemblyName System.Windows.Forms
        $openFolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
        $openFolderDialog.ShowNewFolderButton = $true
        $openFolderDialog.ShowDialog()
        return $openFolderDialog.SelectedPath
    }
    
    
    
    [void] $objForm.ShowDialog()
    

    Freitag, 21. August 2015 11:12

Antworten

  • Hier einmal komplett:

    der Index [1] ist nun in die Order-öffnen-Funktion gewandert, dadurch bleibt die $pfad Variable sauber und du kannst unten den kompletten Pfad besser zusammenlegen.

    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Drawing') 
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.StartPosition = 'CenterScreen'
    $objForm.Width = 420
    $objForm.Height = 250
    
    #TextBox Gruppe
    $objTextBoxGruppe = New-Object System.Windows.Forms.TextBox 
    $objTextBoxGruppe.Location = New-Object System.Drawing.Size(100,50) 
    $objTextBoxGruppe.Size = New-Object System.Drawing.Size(150,20) 
    $objTextBoxGruppe.Text = 'Bitte Gruppe eingeben'
    $objForm.Controls.Add($objTextBoxGruppe)
    
    
    #Ordner auswählen button
    $SelectButton = New-Object System.Windows.Forms.Button
    $SelectButton.Location = New-Object System.Drawing.Size(280,100)
    $SelectButton.Size = New-Object System.Drawing.Size(110,23)
    $SelectButton.Text = 'Ordner auswählen'
    $SelectButton.Name = 'Ordner auswählen'
    $SelectButton.Add_Click({
        $pfad = (Read-FolderBrowserDialog)[1];
        $objTextBoxSpeicherort.Text = $pfad
    })
    $objForm.Controls.Add($SelectButton)
    
    #TextBox Speicherort
    $objTextBoxSpeicherort = New-Object System.Windows.Forms.TextBox 
    $objTextBoxSpeicherort.Location = New-Object System.Drawing.Size(100,100) 
    $objTextBoxSpeicherort.Size = New-Object System.Drawing.Size(150,20) 
    $objForm.Controls.Add($objTextBoxSpeicherort)
    
    #Label Gruppe
    $objLabelGruppe = New-Object System.Windows.Forms.Label
    $objLabelGruppe.Location = New-Object System.Drawing.Size(10,50) 
    $objLabelGruppe.Size = New-Object System.Drawing.Size(100,20) 
    $objLabelGruppe.Text = 'Gruppe:'
    $objLabelGruppe.Name = 'Gruppe'
    $objForm.Controls.Add($objLabelGruppe)
    
    #Label Speicherort
    $objLabelSpeicherort = New-Object System.Windows.Forms.Label
    $objLabelSpeicherort.Location = New-Object System.Drawing.Size(10,100) 
    $objLabelSpeicherort.Size = New-Object System.Drawing.Size(100,20) 
    $objLabelSpeicherort.Text = 'Speicherort:'
    $objLabelSpeicherort.Name = 'Speicherort'
    $objForm.Controls.Add($objLabelSpeicherort)
    
    
    #OKbutton
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,150)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = 'OK'
    $OKButton.Name = 'OK'
    $OKButton.Add_Click({
    $Gruppe = $objTextBoxGruppe.Text
    #script
    $pfadkomplett = $pfad + $Gruppe
    
    Get-ADGroupMember -identity $Gruppe | Select-Object distinguishedName | Export-csv -encoding utf8 -path "$pfadkomplett.csv"
    
    })
    $objForm.Controls.Add($OKButton)
    
    function Read-FolderBrowserDialog()
    {
        Add-Type -AssemblyName System.Windows.Forms
        $openFolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
        $openFolderDialog.ShowNewFolderButton = $true
        $openFolderDialog.ShowDialog()
        return $openFolderDialog.SelectedPath
    }
    
    [void] $objForm.ShowDialog()


    • Bearbeitet psott Freitag, 21. August 2015 12:20
    • Als Antwort markiert Wirzu Freitag, 21. August 2015 12:27
    Freitag, 21. August 2015 12:20

Alle Antworten

  • Hallo,

    du nutzt $path und auch $path[1] - instanziierst du das irgendwo vorher?

    Versuch mal das auszuführen:

    $path=""
    $path[1]

    Diesen Pfad benutzt du auch beim ButtonClick. Da sollte also auch auf jeden Fall ne Abfrage drum, ob $path bereits belegt ist.

    Kriegst du irgendeine Fehlermeldung? Geht der ButtonClick für den SelectButton?


    Greetings,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - München

    Blog    

    Caution: This post may contain errors.

    Freitag, 21. August 2015 11:34
  • Hallo, 

    da Problem ist, dass $pfad beim auswählen vom Ordner auch das OK vom Button speichert. Ich habe dann herausgefunden, dass $pfad[1] nur den gewünschten Pfad ausgibt. Daher benutze ich $pfad[1] dann auch beim Button.

    Fehlermeldung:

    Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
    In Zeile:61 Zeichen:1
    + Get-ADGroupMember -identity $Gruppe | Select distinguishedName |Export-csv -enco ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : NullArray

    Freitag, 21. August 2015 11:44
  • Hier einmal komplett:

    der Index [1] ist nun in die Order-öffnen-Funktion gewandert, dadurch bleibt die $pfad Variable sauber und du kannst unten den kompletten Pfad besser zusammenlegen.

    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Drawing') 
    [void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.StartPosition = 'CenterScreen'
    $objForm.Width = 420
    $objForm.Height = 250
    
    #TextBox Gruppe
    $objTextBoxGruppe = New-Object System.Windows.Forms.TextBox 
    $objTextBoxGruppe.Location = New-Object System.Drawing.Size(100,50) 
    $objTextBoxGruppe.Size = New-Object System.Drawing.Size(150,20) 
    $objTextBoxGruppe.Text = 'Bitte Gruppe eingeben'
    $objForm.Controls.Add($objTextBoxGruppe)
    
    
    #Ordner auswählen button
    $SelectButton = New-Object System.Windows.Forms.Button
    $SelectButton.Location = New-Object System.Drawing.Size(280,100)
    $SelectButton.Size = New-Object System.Drawing.Size(110,23)
    $SelectButton.Text = 'Ordner auswählen'
    $SelectButton.Name = 'Ordner auswählen'
    $SelectButton.Add_Click({
        $pfad = (Read-FolderBrowserDialog)[1];
        $objTextBoxSpeicherort.Text = $pfad
    })
    $objForm.Controls.Add($SelectButton)
    
    #TextBox Speicherort
    $objTextBoxSpeicherort = New-Object System.Windows.Forms.TextBox 
    $objTextBoxSpeicherort.Location = New-Object System.Drawing.Size(100,100) 
    $objTextBoxSpeicherort.Size = New-Object System.Drawing.Size(150,20) 
    $objForm.Controls.Add($objTextBoxSpeicherort)
    
    #Label Gruppe
    $objLabelGruppe = New-Object System.Windows.Forms.Label
    $objLabelGruppe.Location = New-Object System.Drawing.Size(10,50) 
    $objLabelGruppe.Size = New-Object System.Drawing.Size(100,20) 
    $objLabelGruppe.Text = 'Gruppe:'
    $objLabelGruppe.Name = 'Gruppe'
    $objForm.Controls.Add($objLabelGruppe)
    
    #Label Speicherort
    $objLabelSpeicherort = New-Object System.Windows.Forms.Label
    $objLabelSpeicherort.Location = New-Object System.Drawing.Size(10,100) 
    $objLabelSpeicherort.Size = New-Object System.Drawing.Size(100,20) 
    $objLabelSpeicherort.Text = 'Speicherort:'
    $objLabelSpeicherort.Name = 'Speicherort'
    $objForm.Controls.Add($objLabelSpeicherort)
    
    
    #OKbutton
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,150)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = 'OK'
    $OKButton.Name = 'OK'
    $OKButton.Add_Click({
    $Gruppe = $objTextBoxGruppe.Text
    #script
    $pfadkomplett = $pfad + $Gruppe
    
    Get-ADGroupMember -identity $Gruppe | Select-Object distinguishedName | Export-csv -encoding utf8 -path "$pfadkomplett.csv"
    
    })
    $objForm.Controls.Add($OKButton)
    
    function Read-FolderBrowserDialog()
    {
        Add-Type -AssemblyName System.Windows.Forms
        $openFolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
        $openFolderDialog.ShowNewFolderButton = $true
        $openFolderDialog.ShowDialog()
        return $openFolderDialog.SelectedPath
    }
    
    [void] $objForm.ShowDialog()


    • Bearbeitet psott Freitag, 21. August 2015 12:20
    • Als Antwort markiert Wirzu Freitag, 21. August 2015 12:27
    Freitag, 21. August 2015 12:20
  • Vielen Dank! Es funktioniert, nur der Pfad ist noch komisch. Er nimmt mir den Pfad vom Powershell und nicht den angegebenen. Hast du da auch noch eine Idee?

    Lg Wirzu

    Freitag, 21. August 2015 12:33
  • Vielleicht beißen sich da Systemvariablen, ich würde erstmal die Variable $pfad an allen Stellen umbenennen.

    Es hilft auch an einer Stelle, an der du einer variable einen Wert zuweist, oder sie verwendest mit einem kurzen 

    Write-host $VariablenName

    den Wert zu überprüfen.

    Freitag, 21. August 2015 12:43
  • Danke!
    Freitag, 21. August 2015 13:02