So erstellen und führen Sie den Windows-Dienst mit einem Powershell-Skript aus

So erstellen und führen Sie den Windows-Dienst mit einem Powershell-Skript aus

Ich versuche, einen neuen Dienst (AppOneTest) unter Windows 2016 zu erstellen, der in services.msc verfügbar sein sollte, und jedes Mal, wenn der Dienst (AppOneTest) gestartet wird, sollte er den Prozess-Explorer starten

$ServiceName = "ApplicationOneTest"
$ServiceDisplayName = "AppOneTest"
$ServiceDescription = "This launches process explorer"
$ExecutablePath = "C:\processexp\procexp64.exe"

$ScriptPath = "C:\Backup\LaunchScript.ps1"
$LaunchScript = @"
    # Script to launch processexp
    & '$ExecutablePath'
"@
$LaunchScript | Out-File -FilePath $ScriptPath -Encoding utf8

New-Service -Name $ServiceName -DisplayName $ServiceDisplayName -Description $ServiceDescription -BinaryPathName "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File $ScriptPath" -StartupType Automatic

sc.exe config $ServiceName obj= "domain\username" password= "******" type= interact

Start-Service -Name $ServiceName

Dieses Skript versucht, einen Dienst zu erstellen und diesen Dienst zu starten. Wenn ich jedoch versuche, den erstellten Dienst zu starten, bleibt er hängen und startet nie.

Wir sind für jede Hilfe sehr dankbar.

Antwort1

Interaktive Dienste sind ab Windows Vista überwiegend wirkungslos und sollten nicht mehr genutzt werden.

Serviceprogramme müssen einer bestimmten Schnittstelle entsprechen, sie müssen mit dem Service Control Manager interagieren, ihren Status signalisieren und dergleichen. Process Explorer oder jede andere durchschnittliche Anwendung würde dies nicht tun.

Sie können einen Service-Wrapper verwenden wieNSSMum beliebige Programme als Dienste auszuführen. Dies ist eine beliebte Lösung für Java-Serveranwendungen.


Um Ihre UI-Tests auszuführen, sollten Sie stattdessen eine VM mit konfigurierter automatischer Anmeldung und deaktiviertem Ruhezustand/Sperre des Displays verwenden und Ihre Tests dann in der regulären Sitzung ausführen, die immer geöffnet ist.

Antwort2

Sie versuchen, einen interaktiven Systemdienst auszuführen. Dies wird nicht empfohlen und es kann einige Komplexitäten geben, die zusätzlich zu meiner Antwort gelöst werden müssen. Beachten Sie, dass nicht jedes Programm für die Ausführung mit dem Systemdienstprotokoll ausgelegt ist und ich bezweifle wirklich, dass Explorer dafür geeignet ist. Die von mir aufgelisteten Dienstprogramme finden Sie möglicherweise in diese Antwort um bei der Erstellung von Ad-hoc-Diensten aus solchen ungeeigneten Programmen nützlich zu sein: srvany-ngUnd NSSM.

Sie müssen den Dienst mindestens unter demselben Benutzerkonto ausführen wie der angemeldete Benutzer. In PowerShell bedeutet dies die Verwendung einesPSCredential Objekt, das die Benutzeranmeldeinformationen enthält.

Beispielcode:

$username = "username"
$password = "password"
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($username, $securepassword)

New-Service [...] -Credential $cred

Verweise:

verwandte Informationen