Starten eines Windows-Dienstes mit net.exe, ohne das Konsolenfenster anzuzeigen

665
liamZ

Ich möchte einen Dienst im Hintergrund mit dem Befehl net.exe aus einer nicht erhöhten Bat-Datei starten. Ich möchte jedoch nur, dass die UAC-Eingabeaufforderung nach der net.exe gefragt wird. Danach möchte ich nicht, dass das Konsolenfenster angezeigt wird. Ich weiß, dass es eine Möglichkeit gibt, das Konsolenfenster mit vielen Programmen wie nircmd auszublenden:

nircmd elevatecmd execmd net start [service] 

Die UAC-Eingabeaufforderung wird jedoch nach dem Programm nircmd gefragt.

Ist es möglich?

0
Jedes Mal, wenn Sie einen Befehl erhöhen, wird die Benutzerkontensteuerung angezeigt. Die Benutzerkontensteuerung wird für "nircmd" angezeigt, sodass "net start" mit den entsprechenden erhöhten Berechtigungen ausgeführt werden kann (die von Windows erforderlich sind). Anaksunaman vor 5 Jahren 0
Wenn Sie meine Frage lesen, sehen Sie, dass die UAC nach dem Programm net.exe gefragt wird, nicht nach einem anderen Programm wie nircmd. Danach möchte ich, dass das Konsolenfenster ausgeblendet wird. liamZ vor 5 Jahren 0

2 Antworten auf die Frage

0
Anaksunaman

Ich möchte nur, dass die UAC-Eingabeaufforderung nach der net.exe [.] Gefragt wird. Ist dies möglich?

Nach meinem besten Wissen ist die Antwort wahrscheinlich "Nein".

Die Benutzerkontensteuerung wird angezeigt, nircmdsodass sie net startmit den entsprechenden erhöhten Berechtigungen ausgeführt werden kann (die von Windows benötigt werden). Diese Erhebung muss vor dem net startAusführen erfolgen. Nach meiner Erfahrung gilt dies im Allgemeinen für viele Programme oder Skripte von Drittanbietern, die eine ähnliche Funktion ausführen.

Elevate ist eine Ausnahme (dh es wird Net Commandin der Benutzerkontensteuerung angezeigt ), unterdrückt jedoch das Konsolenfenster nicht wie dies der nircmdFall ist.

Danach möchte ich nicht, dass das Konsolenfenster angezeigt wird.

Obwohl bei anderen Lösungen (z. B. elevate.exeeinem .vbsSkript) möglicherweise ein Konsolenfenster angezeigt wird, wird nach dem Ausführen kein neues Konsolenfenster angezeigt nircmd elevatecmd execmd net start example_service.

Das Konsolenfenster unterdrücken

Während es wahrscheinlich nicht möglich ist, net.exein der Benutzerkontensteuerung angezeigt zu werden, können Sie das Konsolenfenster für die Batchdatei unterdrücken (was sich ehrlich anhört, ist Ihr wahres Ziel, wenn ich die Dinge nicht zu sehr falsch interpretiere):

  1. Erstellen Sie eine .batDatei zB start_service.batmit dem Folgenden:

    C:\path\to\nircmd.exe elevatecmd execmd net start example_service 
  2. Erstellen Sie eine neue Verknüpfung, um diese .batDatei auszuführen . Machen Sie das Ziel ähnlich dem folgenden:

    C:\path\to\nircmd.exe execmd C:\path\to\start_service.bat 

Wenn in diesem Beispiel diese Verknüpfung verwendet wird (nicht .batdirekt die Datei), wird nur die Aufforderung zur Benutzerkontensteuerung angezeigt (es wird kein Konsolenfenster angezeigt).

Wenn Sie von einem "Net Start Service" einer nicht erhöhten Konsole aus starten, wird die Benutzerkontensteuerung für den Befehl net.exe angezeigt. Möglicherweise führt net.exe vom SYSTEM-Benutzer eine geplante Aufgabe aus. Was ich von nircmd nicht mag ist, dass es nicht signiert ist. liamZ vor 5 Jahren 0
Entschuldigung, ich habe versucht zu sagen, dass, wenn Sie net.exe von einer nicht erhöhten Konsole (mit nircmd.exe, elevate.exe, vbscript ...) anheben, die Benutzerkontensteuerung für die net.exe angezeigt wird. liamZ vor 5 Jahren 0
Wenn Sie den "net start" -Dienst von einer nicht erhöhten Konsole aus ausführen, wird überhaupt keine Benutzerkontensteuerung angezeigt. Es wird lediglich eine "Zugriff verweigert" -Meldung zurückgegeben. Wenn Sie "net.exe" von einer nicht erhöhten Konsole mit "nircmd.exe" anheben, wird die Eingabeaufforderung der Benutzerkontensteuerung für "nircmd" verwendet. In Bezug auf `.vbs` fordern die mir vertrauten Skripte auch keine` net.exe` auf. Wenn Sie `elevate.exe` verwenden, sind Sie richtig, dass` Net Command` (für `net.exe`) angezeigt wird, das Konsolenfenster wird jedoch leider nicht unterdrückt. Anaksunaman vor 5 Jahren 0
Ich konnte nicht viel zur Taskplaner-Lösung sagen. Natürlich könnte man es versuchen. Das heißt, obwohl ich das Zögern verstehe, weil "nircmd" unsigniert ist, ist es meiner Meinung nach eine absolut sichere Software. Anaksunaman vor 5 Jahren 0
Mit 'nircmd elevate net start service' wird die Benutzerkontensteuerung zur Eingabe des Befehls net.exe aufgefordert. Soweit ich weiß, ist nircmd sicher, aber nicht jeder weiß das, und es wäre besser, wenn 2018 ein signiertes Programm wäre. Trotzdem vielen Dank für Ihre Hilfe. liamZ vor 5 Jahren 0
Die Unterzeichnung ist definitiv eine gute Idee. Und du bist willkommen. =) Anaksunaman vor 5 Jahren 0
0
liamZ

Ich fand schließlich einen Weg, einen Dienst ohne Anzeige des Konsolenfensters zu starten und anzuhalten, und die Benutzerkontensteuerung wurde für ein von Microsoft signiertes Programm (wscript.exe) mit VBScript angezeigt, das WMI zum Starten und Beenden eines Dienstes verwendet.

Starten Sie einen Dienst: Erstellen Sie eine Datei StartService.vbs mit diesem Code und ändern Sie die erste Zeile mit dem Dienst, den Sie starten möchten.

strServiceName = "YourServiceName"  If Not WScript.Arguments.Named.Exists("elevate") Then CreateObject("Shell.Application").ShellExecute WScript.FullName _, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1 WScript.Quit End If  Set objWMIService = GetObject("winmgmts:!\\.\root\cimv2") Set colListOfServices = objWMIService.ExecQuery ("Select * from Win32_Service Where Name ='" & strServiceName & "'") For Each objService in colListOfServices objService.StartService() Next 

um den Dienst zu starten:

wscript pathto\StartService.vbs 

Beenden Sie einen Dienst: Erstellen Sie eine Datei StopService.vbs mit dem Code:

strServiceName = "YourServiceName"  If Not WScript.Arguments.Named.Exists("elevate") Then CreateObject("Shell.Application").ShellExecute WScript.FullName _, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1 WScript.Quit End If  Set objWMIService = GetObject("winmgmts:!\\.\root\cimv2") Set colListOfServices = objWMIService.ExecQuery ("Select * from Win32_Service Where Name ='" & strServiceName & "'") For Each objService in colListOfServices objService.StopService() Next 

um den Dienst zu beenden:

wscript pathto\StopService.vbs