Windows Service (LocalSystem) --> Aufruf eines PowerShell-Skriptes

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von eckberth.

    Windows Service (LocalSystem) --> Aufruf eines PowerShell-Skriptes

    Hallo zusammen,

    ich habe einen Windows Dienst mit Visual Basic (.NET 4.5) programmiert, der zeitgesteuert ein bestimmtes PowerShell-Skript starten soll. Der Dienst wird als LocalSystem registriert funktioniert auch ohne Probleme.
    Nur der Start des Powershell-Skriptes will er nicht machen. Ich dachte bislang, dass ich ein Problem mit der Session 0 und Powershell habe, kann das aber auch nicht so recht verifizieren.
    Der Aufruf als "Ausführen" unter Windows funktioniert jedenfalls (angemeldet als Administrator).

    Der ReturnCode wird auch ins Log geschrieben und lautet "1". Irgendwie sehe ich den Wald vor lauter Bäumen nicht ...

    Im Moment arbeite ich wie folgt:

    VB.NET-Quellcode

    1. Dim processStartInfo As ProcessStartInfo = New System.Diagnostics.ProcessStartInfo
    2. Dim myProcess As Process = New Process()
    3. processStartInfo.FileName = "cmd"
    4. processStartInfo.Arguments = "powershell -file C:\PowerShell\MeinSkriptMitAPCNamen.ps1 -CN APCName"
    5. processStartInfo.WindowStyle = ProcessWindowStyle.Normal
    6. processStartInfo.UseShellExecute = False
    7. myProcess.StartInfo = processStartInfo
    8. myProcess.Start()
    9. myProcess.WaitForExit(10000)
    10. Me.WriteToLogInClass("taskWorkerCallBack --> " & "ExitCode: " & myProcess.ExitCode & " " & "ExitTime: " & myProcess.ExitTime)
    11. If Not myProcess.HasExited Then
    12. myProcess.Kill()
    13. Me.WriteToLogInClass("taskWorkerCallBack --> " & "myProcess.Kill")
    14. End If


    Vielleicht kann mir ja einer auf die Sprünge helfen. Tante G. konnte es bisher nicht ...
    Entweder

    VB.NET-Quellcode

    1. processStartInfo.FileName = "cmd"
    2. processStartInfo.Arguments = "/c powershell -file C:\PowerShell\MeinSkriptMitAPCNamen.ps1 -CN APCName"
    oder

    VB.NET-Quellcode

    1. processStartInfo.FileName = "powershell"
    2. processStartInfo.Arguments = "-file C:\PowerShell\MeinSkriptMitAPCNamen.ps1 -CN APCName"

    Vielleicht musst du (abhängig von der Umgebung) beim FileName auch den kompletten Pfad angeben.

    Wenn du den Aufruf erst mal mit einem Konsolprogramm testest, fällt die die Fehlersuche evtl. leichter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Versuch mal das...

    C#-Quellcode

    1. processStartInfo.FileName = "powershell.exe";
    2. processStartInfo.Arguments = "& C:\PowerShell\MeinSkriptMitAPCNamen.ps1 -CN APCName";


    Den Aufruf mot & benutz ich auch immer um Verknüpfungen auf die PowerShell mit Skript oder Tasks in der Aufgabenplanung anzulegen.


    EDIT:
    Unter jedem Benutzer muss die Ausführung von Skripts erlaubt werden. Sowohl für die x64 als auch die x86 Konsole...

    Dazu muss die ExecutionPolicy auf RemoteSigned oder Unrestricted gestellt werden.

    Alternativ kannst du einen Parameter beim Aufruf der PowerShell.exe mitgeben, um die ExecutionPolicy für diese ausführung zu umgehen. (-ExecutionPolicy ByPass)

    Siehe Technet:

    technet.microsoft.com/de-de/library/hh847748.aspx

    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    Hallo zusammen,

    Danke für eure Hinweise.

    @petaod: Ich meine, dass ich beides schon mal ausprobiert hatte, aber es beides nicht erfolgreich war. Ich versuche es aber morgen auf jeden Fall nochmal und schreibe Dir eine Antwort.

    @BornToBeRoot: Die PS-ExecutionsPolicy habe ich gänzlich auf Unrestricted, um das als Fehlerquelle zunächst auszuschließen.

    Dein Vorschlag ist auf jeden Fall sehr heiß! Mir fällt nämlich gerade ein Artikel ein, wo auch einer in seinem persönlichem Blog schrieb, dass PS-Befehle mit & zu verletzen sind, wenn Argumente übergeben werden. Das schaue ich mir auf jeden Fall gleich morgen früh mal an.

    Danke euch schon mal.


    Dass man aus einem Windows Dienst die Powershell nicht bedienen kann, hat aber noch keiner gelesen oder irgendwie / irgendwo mitbekommen, oder?!
    Hallo zusammen,

    ich habe das Problem jetzt weitestgehend gelöst. @BornToBeRoot hatte insoweit Recht, dass die ExecutionPolicy eine Rolle spielt. Ich gebe jetzt jedem Aufruf die -ExecutionPolicy ByPass mit - obwohl der PC grundsätzlich auf Unrestricted steht.
    Mit Hinzufügen der ExecutionPolicy funktioniert der Aufruf aus der Session 0 heraus.

    Jetzt stellt sich das Problem, dass die Powershell wohl immer nur 1x zeitgleich aufgerufen werden darf, da es sonst einen Fehler gibt.

    eckberth schrieb:

    Jetzt stellt sich das Problem, dass die Powershell wohl immer nur 1x zeitgleich aufgerufen werden darf, da es sonst einen Fehler gibt.

    Warum? Was macht denn dein Skript? Schreibst du in irgendeine Datei die blockiert ist, oder kannst du den Fehler genauer beschreiben?
    NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
    Hallo zusammen,

    ich habe das Problem jetzt weitesgehend gelöst: Man muss im Array natürlich auch den index immer ++, sonst schreibt man ja permanent in den Index "0" :D
    Der Fehler saß also diesbezüglich vor dem Gerät.

    Das zeitgleiche ausführen meines PowerShell-Skriptes hat nicht funktioniert. Ich hatte den Dienst angewiesen, dass Skript für 10-15 Geräte zeitgleich zu starten. Aber selbst die Windows-Aufgabensteuerung arbeitet nicht auf die Sekunde genau ... und daher habe ich jetzt die Sekunden des Tasks nach der Reihenfolge festgelegt. Das "limiert" mich zwar auf max. 59 minutengleiche Tasks, aber damit kann ich leben ;)

    Danke an alle.