none
Benutzerprofile in Dropdown füllen RRS feed

  • Frage

  • Hallo zusammen

    Ich würde gerne ein kleines Skript für USMT verwenden, bei dem man den zu migrierenden Benutzer auswählen kann.

    Dazu möchte ich die aktuellen Profile auslesen aus c:\users (ich nehme einfach die Ordnernamen) und diese nachher als Variable ans Scanstate weitergeben.

    Nun habe ich ein Skript, welches eine Auswahlbox erzeugt & die Verzeichnisnamen liest.

    Allerdings weiss ich nicht, wie ich die Verzeichnisnamen als Variablen in die Dropdown-Liste übertragen kann.

    Kann mir jemand helfen?

    Anbei der Code, inmitten der gestrichelten Linien ist der Verzeichnisordnerteil, bei dem ich mir nicht sicher bin...

    Vielen Dank.

    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    
    $form = New-Object System.Windows.Forms.Form
    $form.Text = 'Select a User'
    $form.Size = New-Object System.Drawing.Size(300,200)
    $form.StartPosition = 'CenterScreen'
    
    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Point(75,120)
    $okButton.Size = New-Object System.Drawing.Size(75,23)
    $okButton.Text = 'OK'
    $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $okButton
    $form.Controls.Add($okButton)
    
    $cancelButton = New-Object System.Windows.Forms.Button
    $cancelButton.Location = New-Object System.Drawing.Point(150,120)
    $cancelButton.Size = New-Object System.Drawing.Size(75,23)
    $cancelButton.Text = 'Cancel'
    $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $cancelButton
    $form.Controls.Add($cancelButton)
    
    $label = New-Object System.Windows.Forms.Label
    $label.Location = New-Object System.Drawing.Point(10,20)
    $label.Size = New-Object System.Drawing.Size(280,20)
    $label.Text = 'Benutzerauswahl Migration:'
    $form.Controls.Add($label)
    
    $listBox = New-Object System.Windows.Forms.ListBox
    $listBox.Location = New-Object System.Drawing.Point(10,40)
    $listBox.Size = New-Object System.Drawing.Size(260,20)
    $listBox.Height = 80
    
    #------------------------------------------------------
    ##C:\users auslesen
    #[String] $folder="C:\users";
    #Get-ChildItem -Path $folder | SELECT Name | Format-Table #-AutoSize;
    
    #foreach ($name in $folder) {
    #	Write-Host $user1+i
    #------------------------------------------------------
    
    [void] $listBox.Items.Add($user1)
    [void] $listBox.Items.Add($user2)
    [void] $listBox.Items.Add($user3)
    [void] $listBox.Items.Add($user4)
    [void] $listBox.Items.Add($user5)
    [void] $listBox.Items.Add($user6)
    [void] $listBox.Items.Add($user7)
    
    $form.Controls.Add($listBox)
    
    $form.Topmost = $true
    
    $result = $form.ShowDialog()
    
    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        $x = $listBox.SelectedItem
        $x
    }

    Donnerstag, 19. März 2020 08:16

Antworten

  • 1. du kannst es einfacher gestalten:

    $UserArray = Get-ChildItem -Path $folder
    $listbox.ValueMember = "Name"
    $listbox.items.addrange($UserArray)

    Dein nächstes Problem ist, dass du das Ereignis SelectedItemsChanged überwachen musst, da nach dem Drücken des OK-Buttons das Formular aus dem Speicher entfernt wird und alle Objekte im Formular zerstört werden.
    Somit ist deine Listbox leer.

    Beispiel siehe hier (MouseDown-Event):
    https://stackoverflow.com/questions/11888342/how-do-i-add-an-event-handler-to-a-net-object-in-powershell


    Donnerstag, 19. März 2020 09:24

Alle Antworten

  • Genauso wie deine User.
    Wobei du dies auch vereinfachen kannst, wenn die User in einem Array stehen.

     $listBox.Items.AddRange($userArray)

    Eine Listbox hat zusätzlich noch die Eigenschaft "ValueMember" und "DisplayMember".
    Somit kannst du diese Eigenschaften mit den Namen der Eigenschaften eines Objektes füllen und ein ObjektArray hinzufügen.
    Beim Event SelectedIndexChanged bekommst du dann den Index und kannst damit dann wieder auf das Objekt im Array direkt zugreifen.

    $userArray[$listbox.SelectedIndex]

    Donnerstag, 19. März 2020 08:28
  • Danke für deinen Tipp, aber ich übersehe etwas...

    Das Dialogfeld wird angezeigt, allerdings findet er keinen Wert.

    Was mache ich falsch?

    Schau mal:

    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    
    $form = New-Object System.Windows.Forms.Form
    $form.Text = 'Select a Computer'
    $form.Size = New-Object System.Drawing.Size(300,200)
    $form.StartPosition = 'CenterScreen'
    
    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Point(75,120)
    $okButton.Size = New-Object System.Drawing.Size(75,23)
    $okButton.Text = 'OK'
    $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.AcceptButton = $okButton
    $form.Controls.Add($okButton)
    
    $cancelButton = New-Object System.Windows.Forms.Button
    $cancelButton.Location = New-Object System.Drawing.Point(150,120)
    $cancelButton.Size = New-Object System.Drawing.Size(75,23)
    $cancelButton.Text = 'Cancel'
    $cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $cancelButton
    $form.Controls.Add($cancelButton)
    
    $label = New-Object System.Windows.Forms.Label
    $label.Location = New-Object System.Drawing.Point(10,20)
    $label.Size = New-Object System.Drawing.Size(280,20)
    $label.Text = 'Benutzerauswahl Migration:'
    $form.Controls.Add($label)
    
    $listBox = New-Object System.Windows.Forms.ListBox
    $listBox.Location = New-Object System.Drawing.Point(10,40)
    $listBox.Size = New-Object System.Drawing.Size(260,20)
    $listBox.Height = 80
    
    
    ##C:\users auslesen
    [String] $folder="C:\users";
    Get-ChildItem -Path $folder | SELECT Name | Format-Table -AutoSize;
    foreach ($name in $folder) {
        Write-Host $userArray
    }
    [void] $listBox.Items.AddRange($userArray)
    
    $form.Controls.Add($listBox)
    
    $form.Topmost = $true
    
    $result = $form.ShowDialog()
    
    if ($result -eq [System.Windows.Forms.DialogResult]::OK)
    {
        $x = $listBox.SelectedItem
        $x
    }
    
    Name             
    ----             
    .NET v4.5        
    .NET v4.5 Classic
    admin            
    Public           
    
    
    Ausnahme beim Aufrufen von "AddRange" mit 1 Argument(en):  "Der Wert darf nicht NULL sein.
    Parametername: items"
    In Zeile:43 Zeichen:1
    + [void] $listBox.Items.AddRange($userArray)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ArgumentNullException

    Donnerstag, 19. März 2020 08:43
  • 1. du kannst es einfacher gestalten:

    $UserArray = Get-ChildItem -Path $folder
    $listbox.ValueMember = "Name"
    $listbox.items.addrange($UserArray)

    Dein nächstes Problem ist, dass du das Ereignis SelectedItemsChanged überwachen musst, da nach dem Drücken des OK-Buttons das Formular aus dem Speicher entfernt wird und alle Objekte im Formular zerstört werden.
    Somit ist deine Listbox leer.

    Beispiel siehe hier (MouseDown-Event):
    https://stackoverflow.com/questions/11888342/how-do-i-add-an-event-handler-to-a-net-object-in-powershell


    Donnerstag, 19. März 2020 09:24
  • @blacksandbeach

    Ist dein Problem gelöst oder hast du noch Fragen?


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Samstag, 21. März 2020 12:02
    Moderator