potshock
Goto Top

Aufgabenplanung: Powershell script interactive

Guten Morgen,

ich automatisiere gerade ein paar Aufgaben via Powershell Scripte und Aufgabenplanung auf einem Windows Server 2012 R2.
Dabei bin ich auf zwei Probleme gestossen:

1.) ich habe ein Script "SichernExtern.ps1" welches in der Powershell ISE funktioniert.
In dem Script wird per [System.Windows.Forms.MessageBox] dazu aufgefordert die externe USB-HDD anzuschliessen.
Per Aufgabenplanung wird das Script jedoch nicht ausgeführt, es poppt kurz das PS-Fenster auf und wird sofort geschlossen.
Ich habe die PS Option -nointeractive gefunden, dachte dem entsprechen ist -interactive die Lösung.
Ich habe in der Aufgabenplanung bei Aktionen -> Argumente hinzufügen u.a. folgendes versucht: -interactive -command"PfadZumScript"
Wer kann helfen?

Hier mal ein Auszug aus meinem Script:

$Medium = '\\Zocker\Z_CNMEMORY'  
#Aufforderung das externe Sicherungmedium anzuschließen
$Result = [System.Windows.Forms.MessageBox]::Show("Bitte externes Sicherungmedium anschließen!`r`n`r`nDie Sicherung dauert ...  ;_)!`r`n`r`nMuss sein!","Achtung: Aufforderung!",1,[System.Windows.Forms.MessageBoxIcon]::Exclamation)  
If ($Result -eq "OK") {  
    #Pfad zum externen Medium wird geprüft
    if (Test-Path $Medium) {
    #Hier wird die vorher weiter oben definierte function m. dem Namen Aktion ausgeführt!
    Aktion
    }
    else
    {
    $Fehler =  [System.Windows.Forms.MessageBox]::Show("Sicherungsmedium nicht gefunden... :-(!","ERROR",1,[System.Windows.Forms.MessageBoxIcon]::Error)  
    }
}
else {
$Result1 =  [System.Windows.Forms.MessageBox]::Show("Ist nicht dein Ernst ... ;-)!`r`n`r`nMuss sein!","ERROR",1,[System.Windows.Forms.MessageBoxIcon]::Error)  
   If ($Result1 -eq "OK") {  
    #Pfad zum externen Medium wird geprüft
    if (Test-Path $Medium) {
    #Hier wird die vorher weiter oben definierte function m. dem Namen Aktion ausgeführt!
    Aktion
    }
    else
    {
    $Fehler =  [System.Windows.Forms.MessageBox]::Show("Sicherungsmedium nicht gefunden... :-(!","ERROR",1,[System.Windows.Forms.MessageBoxIcon]::Error)  
    }
}
}


2.) Desweiteren habe ich noch ein anderes kleines, eher kosmetisches Problem:
Andere Scripte sollen Hidden laufen, dies habe ich bei Aktionen -> Argumente hinzufügen: -WindowsStyle Hidden -command"PfadZumScript" errreicht.
Allerdings poppt hier auch kurz jeweils ein PS-Fenster auf.
Meine Recherche hat ergeben, das ich dagegen nichts tun kann, könnt Ihr das bestätigen, oder gibt es dafür doch eine Lösung?

Wünsche Euch ein schönes Wochenende
Potshock

Content-ID: 415888

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

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

colinardo
Lösung colinardo 09.02.2019 aktualisiert um 12:10:19 Uhr
Goto Top
Servus Potshock .
Zitat von @potshock:
1.) ich habe ein Script "SichernExtern.ps1" welches in der Powershell ISE funktioniert.
In dem Script wird per [System.Windows.Forms.MessageBox] dazu aufgefordert die externe USB-HDD anzuschliessen.
Per Aufgabenplanung wird das Script jedoch nicht ausgeführt, es poppt kurz das PS-Fenster auf und wird sofort geschlossen.
Ich habe die PS Option -nointeractive gefunden, dachte dem entsprechen ist -interactive die Lösung.
Ich habe in der Aufgabenplanung bei Aktionen -> Argumente hinzufügen u.a. folgendes versucht: -interactive -command"PfadZumScript"
Wer kann helfen?
  1. Den Parameter -interactive gibt es nicht und deshalb ein Fehler!
  2. Muss damit Eingaben aus der Aufgabenplanung dem User auf in der Konsole-Session präsentiert werden können dieser im Kontext des Users laufen, im Task also die Option
    screenshot
    gesetzt sein.
  3. Damit du Messageboxes in deinem Skript nutzen kannst musst du den Namespace System.Windows.Forms auch erst importieren den du hier nutzt, damit du ihn verwenden kannst. In der ISE ist dieser per Default schon importiert deswegen geht es in der ISE, aber eben nicht wenn es nicht in der ISE läuft.
Hiermit importierst du das nötigen Assembly
Add-Type -A System.Windows.Forms


2.) Desweiteren habe ich noch ein anderes kleines, eher kosmetisches Problem:
Andere Scripte sollen Hidden laufen, dies habe ich bei Aktionen -> Argumente hinzufügen: -WindowsStyle Hidden -command"PfadZumScript" errreicht.
Allerdings poppt hier auch kurz jeweils ein PS-Fenster auf.
Meine Recherche hat ergeben, das ich dagegen nichts tun kann, könnt Ihr das bestätigen, oder gibt es dafür doch eine Lösung?
Ja, starte dein Skript mit einem kleinen VBS-Skript aus der Aufgabenplanung
CreateObject("Wscript.Shell").Run "powershell -Executionpolicy ByPass -File ""PfadzumScript.ps1""",0,False  
Wünsche Euch ein schönes Wochenende
Gleichfalls.

Grüße Uwe
potshock
potshock 09.02.2019 um 14:51:21 Uhr
Goto Top
Hallo Uwe,

sorry, aber ich bin wohl zu dumm ;-(!
Vieleicht kannst Du mir noch einmal Hilfestellung geben.

1.) Ich habe "Add-Type -AssemblyName System.Windows.Forms" und auch mal
"Add-Type -AssemblyName -System.Windows.Forms.MessageBox" jeweils oben in mein Script eingefügt.

Beim Ausführen der Aufgabe folgendes Benutzerkto.verwenden:
ONE\Administrator
"[.] Nur ausführen, wenn der Benutzer angemeldet ist" ist angeklickt.
Unter Bedingungen und Einstellungen habe ich die Default Einstellungen übernommen.

Leider klappt es immer noch nicht.

2.) CreateObject("Wscript.Shell").Run "powershell -Executionpolicy ByPass -File ""PfadzumScript.ps1""",0,False
"VbsSicher.vbs" tut das was es soll, wenn ich es direkt aufrufe, aber in der Aufgabenplanung wieder nicht face-sad.
Meine Einstellungen dort sind:
Programm/Script:
C:\Windows\System32\cscript.exe
Argumente: -Command "C:\Scripts\VbsSicher.vbs

Danke

Potshock
colinardo
colinardo 09.02.2019 aktualisiert um 17:21:04 Uhr
Goto Top
Zitat von @potshock:

1.) Ich habe "Add-Type -AssemblyName System.Windows.Forms" und auch mal
"Add-Type -AssemblyName -System.Windows.Forms.MessageBox" jeweils oben in mein Script eingefügt.
ist ja auch falsch geschrieben.Beachte das Add-Type erst ab PS 3.0 verfügbar ist, wenn das nicht der Fall ist musst du die alte Variante zum Laden verwenden.
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  
Leider klappt es immer noch nicht.

2.) CreateObject("Wscript.Shell").Run "powershell -Executionpolicy ByPass -File ""PfadzumScript.ps1""",0,False
"VbsSicher.vbs" tut das was es soll, wenn ich es direkt aufrufe, aber in der Aufgabenplanung wieder nicht face-sad.
Meine Einstellungen dort sind:
Programm/Script:
C:\Windows\System32\cscript.exe
Argumente: -Command "C:\Scripts\VbsSicher.vbs
Wieso gehst du automatisch davon aus das cscript.exe den Parameter -Command hat??? Den gibt es nicht! Geb mal Cscript /? In die Konsole ein dann erübrigt sich die Frage! Außerdem auf Tippfehler und Leerzeichen im Pfad achten!

Wie man Powershell-Skripte über die Aufgabenplanung ausführt habe ich hier schon x mal gespostet. Findest du in meinen Beiträgen, also einfach mal die Suche anwerfen. Das wiederhole ich jetzt nicht nochmal.

Und was in deinem Skript, falsch läuft kannst du effektiv mit dem CMDLet Start-Transcript erörtern falls im Skript selbst Fehler liegen , z.B Berechtigungsprobleme auf Ressourcen oder nicht vorhandene Laufwerke durch andere Credentials etc. pp.

Falls du trotz allem nicht in der Lage bist es zu beheben, => PN dann schauen wir nach Absprache per Teamviewer drauf.

Und falls du mir immer noch nicht glaubst (Über die Aufgabenplanung ausgeführt, Benutzer muss natürlich angemeldet sein sonst bringt das ja nichts):

a68a30f1d20bea2b03ae65ee132426fd

screenshot

Das &'C:\Pfad\Script.ps1' ist nur eine weitere Variante wie man Skripte über den Command-Parameter ausführen kann.


Zum Abschluss noch meine Grundlagen dazu die ich immer wieder dazu hier poste.

back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eineadministrative Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
  • Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy ByPass -File "C:\Pfad\Script.ps1"
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topStarten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"

Damit sollte kein Wunsch mehr offen sein.
potshock
potshock 09.02.2019 um 20:15:51 Uhr
Goto Top
Hi Uwe,

Danke läuft !

Frage lieber nicht woran es gelegen hat, es wird deine Motivation, deine Zeit und KnowHow in einem Forum einzubringen, nicht steigern.

Ich Vollpfosten habe die einmal erstellte Aufgabe heute morgen immer wieder bearbeitet.
Erst als ich heute Abend eine neue Aufgabe erstellt habe ist mir aufgefallen, dass heute Samstag und nicht Sonntag ist face-sad !

Zielführend war auf jeden Fall dein Tipp:
"Damit du Messageboxes in deinem Skript nutzen kannst musst du den Namespace System.Windows.Forms auch erst importieren den du hier nutzt, damit du ihn verwenden kannst. In der ISE ist dieser per Default schon importiert."
Add-Type -A System.Windows.Forms

Besten Dank und schönen Abend noch

Potshock