blackhawk17
Goto Top

Powershell Windows Uptime in einer Gui

Guten Morgen,

ich versuche für verschieden Server Remote die Windows Uptime auszulesen (ich möchte gerne wissen wann ein Server neu gestartet wurde).

Das ganze möchte ich gerne in einer Gui erfassen.

Hierzu habe ich mir folgendes Skript gebaut:

                      # Load ActiveDirectory module
            Import-Module ActiveDirectory

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

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")   


$objForm = New-Object System.Windows.Forms.Form

# Hintergrundfarbe für das Fenster festlegen
$objForm.Backcolor=“white“

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

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

# Titelleiste festlegen
$objForm.Text = "Windows uptime  



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



# Vorhandene Computer auslesen

$Computer = Get-ADComputer -Filter * -Properties * | select * -ExpandProperty cn




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


#Computer aus dem Ad anzeigen

        $objLabel = New-Object System.Windows.Forms.Label
        $objLabel.Location = New-Object System.Drawing.Size(300,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(300,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($computer) 
            $objCombobox.SelectedItem 
            
            $objCombobox.Add_SelectedIndexChanged({ })


    #OK Button anzeigen lassen
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(500,420)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"  
    $OKButton.Name = "OK"  
    $OKButton.DialogResult = "OK"  
    $OKButton.Add_Click({$wmi=Get-WmiObject -computername $objCombobox.SelectedItem -Class Win32_OperatingSystem 
    $wmi.converttodatetime($wmi.lastbootuptime)})
    $objForm.Controls.Add($OKButton) 


    #Abbrechen Button
    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(600,420)
    $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) 

    $objForm.Controls.Add($HelpButton) 


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

         

[void] $objForm.ShowDialog()


Das Skript funktioniert soweit auch ganz gut. Die Computernamen werden geladen und können im Dropdownfeld angezeigt und ausgewählt werden.

Was ich gerne als finish machen würde ist mir die Uptime die ich ja mit dem Klick auf den OK Button ausgeben lassen möchte, diese auch grafisch anzeigen zu lassen. Gerne auch über ein extra Fenster.

Ich dachte hier dies evtl. so zu machen:

[void] [Windows.Forms.MessageBox]::Show("........,
[Windows.Forms.MessageBoxButtons]::ok, [Windows.Forms.MessageBoxIcon]::Error)


Ich weiß nun nur nicht wie ich das beim auslösen des OK Buttons mit auslöse und wie ich den eigentlichen Wert der Uptime mitgeben kann.

Hat hierzu evtl. einer eine Idee oder einen Tipp für mich?

Vielen Dank

Content-ID: 339526

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

Ausgedruckt am: 17.11.2024 um 01:11 Uhr

H41mSh1C0R
H41mSh1C0R 01.06.2017 um 10:50:41 Uhr
Goto Top
Servus,

wenn ich das oben richtig sehe hast du doch schon dein Ergebnis im $wmi im Clickhandler, oder?

Packe in den Event Handler noch eine MessageBox rein und füge die Variable ein.

VG
blackhawk17
blackhawk17 01.06.2017 um 10:54:37 Uhr
Goto Top
Hi

danke für deinen Post,

das Versuche ich. Mein Versuch schaut so aus ist aber wenig Erfolgreich face-sad

    #OK Button anzeigen lassen
    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(500,420)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"  
    $OKButton.Name = "OK"  
    $OKButton.DialogResult = "OK"  
    $OKButton.Add_Click({$wmi=Get-WmiObject -computername $objCombobox.SelectedItem -Class Win32_OperatingSystem
    $wmi.converttodatetime($wmi.lastbootuptime)
    			
    [void] [Windows.Forms.MessageBox]::Show($wmi.converttodatetime($wmi.lastbootuptime)
, "Letzter Reboot",   
	 		   [Windows.Forms.MessageBoxButtons]::ok, [Windows.Forms.MessageBoxIcon]::Error)
    
    })
    $objForm.Controls.Add($OKButton) 

Ich bekomme den Wert einfach nicht grafisch angezeigt.
H41mSh1C0R
H41mSh1C0R 01.06.2017 um 11:03:31 Uhr
Goto Top
$test = "wert"  
[void] [Windows.Forms.MessageBox]::Show($test) 

Erstellt mir eine Messagebox mit "wert".

Was steht denn in deiner Variable $wmi?
blackhawk17
blackhawk17 01.06.2017 um 11:07:50 Uhr
Goto Top
Da steht

SystemDirectory : C:\Windows\system32
Organization :
BuildNumber : 9600
RegisteredUser : Windows-Benutzer
SerialNumber : 00252-10000-00000-AA228
Version : 6.3.9600

Nur wenn ich
$wmi.converttodatetime($wmi.lastbootuptime)

Zusammen ausführe komme ich auf das richtige Ergebnis, das mag aber die Massagebox nicht.
133417
133417 01.06.2017 aktualisiert um 11:16:47 Uhr
Goto Top
Achtung hier kommt ein vollidiot face-smile
function GenerateForm {

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$form1 = New-Object System.Windows.Forms.Form
$label1 = New-Object System.Windows.Forms.Label
$comboServer = New-Object System.Windows.Forms.ComboBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

$handler_form1_Load= 
{
    $comboServer.Items.AddRange((Get-AdComputer -Filter * | select -Expand Name))

}

$handler_comboServer_SelectedIndexChanged= 
{
    $wmi = gwmi win32_OperatingSystem -ComputerName $comboServer.SelectedItem
    $lastbootup = $wmi.ConvertToDateTime($wmi.lastBootUptime).toString('G')  
    [System.Windows.Forms.MessageBox]::Show($lastbootup)
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 59
$System_Drawing_Size.Width = 277
$form1.ClientSize = $System_Drawing_Size
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Name = "form1"  
$form1.Text = "Demo"  
$form1.add_Load($handler_form1_Load)

$label1.DataBindings.DefaultDataSourceUpdateMode = 0

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 15
$label1.Location = $System_Drawing_Point
$label1.Name = "label1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 23
$System_Drawing_Size.Width = 90
$label1.Size = $System_Drawing_Size
$label1.TabIndex = 1
$label1.Text = "Choose Server"  

$form1.Controls.Add($label1)

$comboServer.DataBindings.DefaultDataSourceUpdateMode = 0
$comboServer.FormattingEnabled = $True
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 108
$System_Drawing_Point.Y = 12
$comboServer.Location = $System_Drawing_Point
$comboServer.Name = "comboServer"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 21
$System_Drawing_Size.Width = 157
$comboServer.Size = $System_Drawing_Size
$comboServer.TabIndex = 0
$comboServer.add_SelectedIndexChanged($handler_comboServer_SelectedIndexChanged)

$form1.Controls.Add($comboServer)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function
GenerateForm
Gruß
blackhawk17
blackhawk17 01.06.2017 um 11:11:57 Uhr
Goto Top
Ich habe es jetzt so nach deinem Beispiel gemacht

#OK Button anzeigen lassen
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(500,420)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Name = "OK"
$OKButton.DialogResult = "OK"
$OKButton.Add_Click({$wmi=Get-WmiObject -computername $objCombobox.SelectedItem -Class Win32_OperatingSystem
$wmi.converttodatetime($wmi.lastbootuptime)

($wmi.converttodatetime($wmi.lastbootuptime)) = $wim2

[void] [Windows.Forms.MessageBox]::Show($wmi2)


})
$objForm.Controls.Add($OKButton)


Das Datum steht jetzt auch in der $wmi2 drin.

Allerdings bleibt das Show Fenster dann weiß.
H41mSh1C0R
Lösung H41mSh1C0R 01.06.2017 aktualisiert um 11:15:39 Uhr
Goto Top
$wmi=Get-WmiObject -computername *Rechnername* -Class Win32_OperatingSystem 
$test = $wmi.converttodatetime($wmi.lastbootuptime) 
[void] [Windows.Forms.MessageBox]::Show($test) 

timestamp

Schaut so aus wie es sein sollte oder?
blackhawk17
blackhawk17 01.06.2017 um 11:18:50 Uhr
Goto Top
ach ok Fehler gefunden.

$test = $wmi.converttodatetime($wmi.lastbootuptime)

Hatte davor keine Variable.

Jetzt geht es face-smile.

Vielen Dank und auch vielen Dank an "vollidiot" für das Skript.