morpha
Goto Top

Powershell GUI - Label hilfe

Hallo zusammen,

Ich bin neu in dem Beruf und lerne auch gerade die Powershell kennen.

Ich möchte mir ein Skript bauen in der GUI mit dem ich die User aus meiner Firma auswählen kann und mir die Eigenschaften ansehen kann.

Das soll aus einer Textbox in der, der Name des Mitarbeiter ist mit einem Button die Eigenschaften (Name, Telefonnummer, Position, usw...) in Label wieder geben.

Die GUI konnte ich erstellen. Wenn ich das ausführe steht da immer nichts.

[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  


$form1 = New-Object System.Windows.Forms.Form
$button1 = New-Object System.Windows.Forms.Button


    $form1.Text = "Test"  
    $form1.Name = "form1"  
    $form1.DataBindings.DefaultDataSourceUpdateMode = 0
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 400
    $System_Drawing_Size.Height = 200
    $form1.ClientSize = $System_Drawing_Size


    $Test_Button = New-Object System.Windows.Forms.Button
	$Test_Button.Location = New-Object System.Drawing.Size(200,50)
    $Test_Button.Size = New-Object System.Drawing.Size(80,20)
	$Test_Button.Text = "Test"  
	$Test_Button.Add_Click({
$Test_Label.text =  Get-AdUser  -Filter "GivenName -like '$Input2TextBox.Text'" -Properties GivenName  | Select GivenName  
})
    $form1.Controls.Add($Test_Button)

    $TestTextBox = New-Object System.Windows.Forms.TextBox 
    $TestTextBox.Location = New-Object System.Drawing.Size(45,80) 
    $TestTextBox.Size = New-Object System.Drawing.Size(200,20)
    $TestTextBox.Text = ""  
    $form1.Controls.Add($TestTextBox)


    $Test_Label = New-Object System.Windows.Forms.Label
    $Test_Label.Location = New-Object System.Drawing.Size(5,25) 
    $Test_Label.Size = New-Object System.Drawing.Size(200,20) 
    $Test_Label.Text = "Test"  
    $form1.Controls.Add($Test_Label)


$form1.ShowDialog()| Out-Null

Kann sein dass der Fehler offensichtlich ist. Gegoogelt habe ich, hab nur nichts gefunden.

Ich bitte um Hilfe bei dem Problem

Liebe Grüß
Sarah

Content-ID: 7738593832

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

Ausgedruckt am: 08.11.2024 um 21:11 Uhr

sysadm33
sysadm33 04.07.2023 um 18:17:34 Uhr
Goto Top
Hallo Sarah,

von WO sollen welche Nutzer ausgelesen werden?

VG
Daniel
mayho33
mayho33 04.07.2023 aktualisiert um 23:46:02 Uhr
Goto Top
Hi Sarah,

Willkommen im Forum!

Da du PS-Neuling bist, eine grundlegende Eigenheit von Powershell:
Du bekommst alle Ergebnisse prinzipiell als "Object", bis auf wenige Ausnahmen. Das bedeutet jede Ausgabe hat Properties die in einer Table dargestellt werden:
aduser1

Das da gibt aus dem Grund null zurück, weil du so eine Ausgabe "mit" Header bekommst und diese in eine Text-Feld pressen willst. Das geht natürlich nicht.
$Test_Label.text = Get-AdUser -Filter "GivenName -like '$Input2TextBox.Text'" -Properties GivenName | Select GivenName  
aduser2

Besser wäre es, wenn du das gesamte object in einer Variable speicherst und erst dann die Properties ausgiebst. So must du das AD nämlich nur 1x abfragen und hast alle infos für den bestimmten User, in dieser Form:
$result = Get-AdUser -Filter "GivenName -like 'Dummy'" -Properties *  
$Test_Label.text = $result.GivenName
aduser3

Eine weitere Variante wäre z.B. diese. Beachte dabei die Klammern. Das verhindert die Ausgabe mit Header. Das Ergebnis aber direkt in einem Feld zu speichern, zwingt dich aber die Abfrage immer wieder zu machen für ein und das selbe Object:
$Test_Label.text = (Get-AdUser -Filter "GivenName -like 'Dummy'" -Properties *).GivenName  

Hoffe das hilft!

Grüße!
Mayho
Morpha
Morpha 05.07.2023 um 12:25:39 Uhr
Goto Top
Hallo sysadm33,
Die User sollen aus unsere AD ausgelesen werden.


Hallo mayho33,
vielen dank für deine Hilfe nur leider wird in der GUI immer noch nichts angezeigt. ich habe beide Varianten getestet und das Ergebnis ist immer dasselbe.

wenn ich

Get-AdUser -Filter "GivenName -like 'Giv*'" -Properties GivenName | Select GivenName

einfüge dann sehe ich: @{GivenName=GivenName_2_}

GivenName_2_ ist der name von meinem Test User.

gibt es eine Möglichkeit wie ich mir nur diesen angezeigt bekomme?

Lieben Gruß Sarah
7426148943
7426148943 05.07.2023 aktualisiert um 14:06:42 Uhr
Goto Top
Get-AdUser -Filter "GivenName -like 'Giv*'" -Properties GivenName | Select GivenName
Wie oben schon geschrieben wurde zurückgeliefert wird ein Object, das musst du erst expandieren damit es ein String wird
$Test_Label.Text = Get-AdUser -Filter "GivenName -like 'Giv*'" -Properties GivenName | Select -ExpandProperty GivenName  
oder
$Test_Label.Text = (Get-AdUser -Filter "GivenName -like 'Giv*'" -Properties GivenName).Givenname  
mayho33
mayho33 05.07.2023 aktualisiert um 18:11:34 Uhr
Goto Top
Zitat von @Morpha:
Hallo mayho33,
vielen dank für deine Hilfe nur leider wird in der GUI immer noch nichts angezeigt. ich habe beide Varianten getestet und das Ergebnis ist immer dasselbe.
Wie @7426148943 schon geschrieben hat, Das Object muss zu Text gecastet werden.

Der Einfachheit halber habe ich dir hier mal ein voillständiges Beispiel gescriptet:
Add-Type -AssemblyName PresentationFramework
[string]$DrawingLibrary = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"  
[System.Reflection.Assembly]::Load($DrawingLibrary) | Out-Null

[xml]$mainWindow = @"  
<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
        Title="MainWindow"   
        Width="300"  
        WindowStyle="None"  
        WindowStartupLocation="CenterScreen"  
        SizeToContent="Height"  
        Topmost="True"  
        DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">  

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>  
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="8"/>  
            <ColumnDefinition/>
            <ColumnDefinition Width="8"/>  
        </Grid.ColumnDefinitions>

        <StackPanel

           Orientation="Vertical"  
            Grid.Row="1"  
            Grid.Column="1" >  
            
            <DockPanel
                VerticalAlignment="Bottom"  
                HorizontalAlignment="Right"  
                Height="20">  

                <Button
                    x:Name="btn_END"  
                    Content="  X  " />  

            </DockPanel>

            <Separator Background="Transparent" Height="4" />  

            <TextBlock 
                    x:Name="lbl_GivenName"   
                    Text="search by GivenName:" />  

            <Separator Background="Transparent" Height="4" />  

            <TextBox 
                    x:Name ="txt_GivenName"   
                    TextWrapping="Wrap"  
                    Text="" />  

            <Separator Background="Transparent" Height="4" />  

            <TextBlock 
                    x:Name="lbl_SamAccountName"   
                    Text="search by SamAccountName:" />  

            <Separator Background="Transparent" Height="4" />  

            <TextBox 
                    x:Name="txt_SamAccountName"   
                    TextWrapping="Wrap"   
                    Text="" />  

            <Separator Background="Transparent" Height="4" />  
            
            <TextBlock
                x:Name="lbl_Result"  
                Text="no results"  
                Foreground="Green"  
                FontWeight="Bold">  
                
            </TextBlock>

            <Separator Background="Transparent" Height="8" />  

            <Button 
                x:Name="btn_GO"   
                Content="LOS"   
                Width="80" />  

            <Separator Background="Transparent" Height="10" />  

        </StackPanel>
    </Grid>
</Window>
"@  

Function Get-Data()
{
    if( ![string]::IsNullOrEmpty($txt_GivenName.Text))
    {
        $result = Get-AdUser -Filter "GivenName -like $([char]39)$($txt_GivenName.Text)$([char]39)" -Properties *    
    }
    elseif( ![string]::IsNullOrEmpty($txt_SamAccountName.Text))
    {
        $result = Get-AdUser -Filter "SamAccountName -like $([char]39)$($txt_SamAccountName.Text)$([char]39)" -Properties Name*    
    }
    
    $lbl_Result.text = [string]::Empty;

    $lbl_Result.text += 
        "Description: $($result.Description + [environment]::NewLine)" + `  
        "GivenName: $($result.GivenName + [environment]::NewLine)" + `  
        "DisplayName: $($result.DisplayName + [environment]::NewLine)" + `  
        "City: $($result.City + [environment]::NewLine)" + `  
        "co: $($result.co + [environment]::NewLine)" + `  
        "Name: $($result.Name + [environment]::NewLine)" + `  
        "wWWHomePage: $($result.wWWHomePage + [environment]::NewLine)"  


}


$Window = [Windows.Markup.XamlReader]::Load((new-object System.Xml.XmlNodeReader $mainWindow))

$txt_GivenName      = $Window.FindName("txt_GivenName")  
$txt_SamAccountName = $Window.FindName("txt_SamAccountName")  
$lbl_Result         = $Window.FindName("lbl_Result")  



$btn_END = $Window.FindName("btn_END")  
$btn_END.Add_Click({ $Window.Close() })

$btn_GO = $Window.FindName("btn_GO")  
$btn_GO.Add_Click( {Get-Data} )

$Window.Add_MouseLeftButtonDown( {$This.DragMove()})

$Window.ShowDialog() | Out-Null

Falls du dich fragst was das [xml]$mainWindow-Zeugs ist:
Den Code zwischen den @-Zeichen habe ich in einem WPF-Xaml-Project in Visual Studio Community erstellt.
Das ist wesentlich einfacher, weil man die GUI hier mit Drag'n'Drop "zeichnen" kann.

Das Visual-Studio Project habe ich via WTransfer bereitgestellt. Siehe PN. Du brauchst nur Visual-Studio-Community zu installiere. Das ist gratis zu haben.

Grüße!