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.
Kann sein dass der Fehler offensichtlich ist. Gegoogelt habe ich, hab nur nichts gefunden.
Ich bitte um Hilfe bei dem Problem
Liebe Grüß
Sarah
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7738593832
Url: https://administrator.de/contentid/7738593832
Ausgedruckt am: 08.11.2024 um 21:11 Uhr
5 Kommentare
Neuester Kommentar
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:
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.
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:
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:
Hoffe das hilft!
Grüße!
Mayho
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:
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
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
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
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
$Test_Label.Text = (Get-AdUser -Filter "GivenName -like 'Giv*'" -Properties GivenName).Givenname
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.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.
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!