136430
Goto Top

Powershell Neustart GUI

Hallo

ich möchte in einer GUI einem User einen Neustart eines Remotecomputers zur Verfügung stellen, der user führt das Script aus, bekommt die Anzeige mit dem Restart button, klickt auf den Button und der Neustart des Remotepcs wird gestartet..... klappt nur leider nicht, die Funktion scheint tot zu sein, könnt ihr mir bitte helfen, wo mein Fehler & Denkfehler ist.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")   
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")    



$Form = New-Object System.Windows.Forms.Form 
$form.Text = 'Test'     
$Form.Size = New-Object System.Drawing.Size(460,420)  
$form.StartPosition = 'CenterScreen'  
$Form.ShowIcon = $False 
$Form.MaximizeBox = $False 
$Form.MinimizeBox = $False
#$Form.AutoScaleMode = 'Font'  
 

  $ButtonNeustart_Click={ 
        
        Restart-Computer -ComputerName Hostname -Credential Cred -Force
        
    } 


$Button1 = New-Object System.Windows.Forms.Button 
$Button1.Location = New-Object System.Drawing.Size(300,50) 
$Button1.Size = New-Object System.Drawing.Size(60,60) 
$Button1.Text = "restart"   
$Button1.Add_Click({$ButtonNeustart_Click}) 
$Form.Controls.Add($Button1) 

$Form.Add_Shown({$Form.Activate()})
return $Form.ShowDialog()
 
 

Content-Key: 377478

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

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: user217
user217 19.06.2018 um 16:36:33 Uhr
Goto Top
shutdown /? in eine Batch taugt nicht?
Mitglied: colinardo
colinardo 19.06.2018 aktualisiert um 18:02:19 Uhr
Goto Top
Servus.
klappt nur leider nicht
Für diese alleinstehende Aussage in einem Admin Forum bekommst du hier heiße Öhrchen! Mach es manuell in der Konsole und du bekommst auch die passenden Meldungen was schief läuft.

-Credential Cred
  • Da fehlt erstens das Dollarzeichen für die Variable und zweitens gibt es die Definition der Credentials in deinem Skript oben nicht. Bite beachte zusätzlich auch die Variable-Scopes gerade wenn du mit Win-Forms und Sub-Scriptblocks hantierst!
  • Passende Firewall-Richtlinien zur Remote-Verwaltung sollten natürlich am Remote-PC gegeben sein.
  • Der User dessen Credentials verwendet werden muss den PC neu starten dürfen
  • Zusätzlich wenn das keine Domäne ist muss wegen der UAC am Remote-System noch ein Registry Eintrag gesetzt werden, damit per Remote lokale Admin Credentials eingesetzt werden können, Stichwort LocalAccountTokenFilterPolicy.
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
Danach ist ein Neustart Pflicht!

Grüße Uwe
Mitglied: 136430
136430 20.06.2018 um 10:05:10 Uhr
Goto Top
Servus Uwe

Zitat von @colinardo:

Servus.
klappt nur leider nicht
Für diese alleinstehende Aussage in einem Admin Forum bekommst du hier heiße Öhrchen! Mach es manuell in der Konsole und du bekommst auch die passenden Meldungen was schief läuft.


Es gibt in der Konsole keine Fehlermeldung, sonst hätte ich diese längst hier niedergeschrieben

-Credential Cred
* Da fehlt erstens das Dollarzeichen für die Variable und zweitens gibt es die Definition der Credentials in deinem Skript oben nicht. Bite beachte zusätzlich auch die Variable-Scopes gerade wenn du mit Win-Forms und Sub-Scriptblocks hantierst!
  • Passende Firewall-Richtlinien zur Remote-Verwaltung sollten natürlich am Remote-PC gegeben sein.
  • Der User dessen Credentials verwendet werden muss den PC neu starten dürfen
  • Zusätzlich wenn das keine Domäne ist muss wegen der UAC am Remote-System noch ein Registry Eintrag gesetzt werden, damit per Remote lokale Admin Credentials eingesetzt werden können, Stichwort LocalAccountTokenFilterPolicy.
> reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
> 
Danach ist ein Neustart Pflicht!

Grüße Uwe

Das Dollarzeichen vor "Cred" habe ich wie beim Computername hier niedergeschrieben, in Wirklichkeit steht dort der direkte Hostname und die tatsächlichen Credentials, ich weiß auch, dass ich das mit einer Variable hätte schreiben können

Alles spielt sich innerhalb einer Domäne ab, mit dem normalen Restart-computer Befehl, kann ich jeden PC neustarten, nur nicht innerhalb des Programms mit der GUI.
Mitglied: colinardo
colinardo 20.06.2018 aktualisiert um 10:45:45 Uhr
Goto Top
Zitat von @136430:

Es gibt in der Konsole keine Fehlermeldung, sonst hätte ich diese längst hier niedergeschrieben
Dann schau ins Log des Remote Computers.
Und Fehlerausgaben die in einem Scriptblock einer GUI auflaufen werden nicht unbedingt angezeigt, du musst sie z.B. mit Try catch abfangen und dann mit write-host explizit ausgeben lassen.
Das Dollarzeichen vor "Cred" habe ich wie beim Computername hier niedergeschrieben, in Wirklichkeit steht dort der direkte Hostname und die tatsächlichen Credentials, ich weiß auch, dass ich das mit einer Variable hätte schreiben können
Wir sehen das hier aber dann nicht was du dort evt. falsch gemacht haben könntest.
Also besser immer den kompletten Code anonymisiert so wie er bei dir steht.
Alles spielt sich innerhalb einer Domäne ab, mit dem normalen Restart-computer Befehl, kann ich jeden PC neustarten, nur nicht innerhalb des Programms mit der GUI.
Tja ohne deinen tatsächlichen Code kann man dir hier nicht helfen, das funktioniert hier problemlos.

Ich vermute nach wie vor ein Variable Scope Problem auf deiner Seite! Daran scheitern die meisten Anfänger bei der GUI Entwicklung.
Da du hier das ganze vermutlich in Functions verpackt hast liegt meine Vermutung sehr nahe.
Mitglied: 136430
136430 20.06.2018 um 10:52:28 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @136430:

Es gibt in der Konsole keine Fehlermeldung, sonst hätte ich diese längst hier niedergeschrieben
Dann schau ins Log des Remote Computers.
Und Fehlerausgaben die in einem Scriptblock einer GUI auflaufen werden nicht unbedingt angezeigt, du musst sie z.B. mit Try catch abfangen und dann mit write-host explizit ausgeben lassen.

ok das probiere ich
Das Dollarzeichen vor "Cred" habe ich wie beim Computername hier niedergeschrieben, in Wirklichkeit steht dort der direkte Hostname und die tatsächlichen Credentials, ich weiß auch, dass ich das mit einer Variable hätte schreiben können
Wir sehen das hier aber dann nicht was du dort evt. falsch gemacht haben könntest.
Also besser immer den kompletten Code anonymisiert so wie er bei dir steht.
Alles spielt sich innerhalb einer Domäne ab, mit dem normalen Restart-computer Befehl, kann ich jeden PC neustarten, nur nicht innerhalb des Programms mit der GUI.
Tja ohne deinen tatsächlichen Code kann man dir hier nicht helfen, das funktioniert hier problemlos.

Ich vermute nach wie vor ein Variable Scope Problem auf deiner Seite! Daran scheitern die meisten Anfänger bei der GUI Entwicklung.
Da du hier das ganze vermutlich in Functions verpackt hast liegt meine Vermutung sehr nahe.

kannst du mir bezüglich des vermuteten Scope-Problems mitteilen, was ich genau noch in den Code hinzufügen muss?
Mitglied: colinardo
colinardo 20.06.2018 aktualisiert um 10:56:08 Uhr
Goto Top
kannst du mir bezüglich des vermuteten Scope-Problems mitteilen, was ich genau noch in den Code hinzufügen muss?
Ohne den kompletten Code ist es nich nichtt möglich dir zu helfen.
Les mal den Link zum Thema oben, dann verstehst du vielleicht was ich meine!
Mitglied: 136430
136430 20.06.2018 um 11:02:57 Uhr
Goto Top
Zitat von @colinardo:

kannst du mir bezüglich des vermuteten Scope-Problems mitteilen, was ich genau noch in den Code hinzufügen muss?
Ohne den kompletten Code ist es nich nichtt möglich dir zu helfen.
Les mal den Link zum Thema oben, dann verstehst du vielleicht was ich meine!

Ich bin etwas durcheinander, ich habe den kompletten Code gepostet bei -Computername Host bei -Credential Domäne/Domänenadmin, das ist der einzige Unterschied zum Original
Mitglied: colinardo
Lösung colinardo 20.06.2018 aktualisiert um 11:11:03 Uhr
Goto Top
Jetzt wo ichs gerade nochmal genau ansehe, dein Fehler liegt hier
$Button1.Add_Click({$ButtonNeustart_Click})
Die geschweiften Klammern sind zu viel, die hat schon die Variable als Scriptblock.
Das sollte hier also so aussehen
$Button1.add_Click($ButtonNeustart_Click)
Mitglied: 136430
136430 20.06.2018 um 11:12:28 Uhr
Goto Top
Das war die Lösung! vielen Dank!