Запуск службы Windows с помощью net.exe без отображения окна консоли

Я хочу запустить службу без вывода сообщений с помощью команды net.exe из файла с повышенными привилегиями. Но я только хочу, чтобы запрос UAC запрашивался для net.exe, и после этого я не хочу, чтобы появлялось окно консоли. Я знаю, что есть способ скрыть окно консоли с помощью множества программ, таких как nircmd:

nircmd elevatecmd execmd net start [service]

Но запрос UAC будет запрошен для программы nircmd.

Является ли это возможным?

2 ответа

Наконец-то я нашел способ запуска и остановки службы в режиме без вывода сообщений, не показывая окно консоли, и UAC отображается для программы, подписанной Microsoft (wscript.exe), с VBScript, который использует WMI для запуска и остановки службы.

Запустите сервис: создайте файл StartService.vbs с этим кодом и измените первую строку с сервисом, который вы хотите запустить.

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:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery ("Select * from Win32_Service Where Name ='" & strServiceName & "'")
For Each objService in colListOfServices
objService.StartService()
Next

чтобы запустить сервис:

wscript pathto\StartService.vbs

Остановка службы: создайте файл StopService.vbs с кодом:

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:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery ("Select * from Win32_Service Where Name ='" & strServiceName & "'")
For Each objService in colListOfServices
objService.StopService()
Next

чтобы остановить службу:

wscript pathto\StopService.vbs

Я только хочу, чтобы запрос UAC запрашивался для net.exe [.] Возможно ли это?

Насколько мне известно, ответ, скорее всего, "Нет".

UAC отображается для nircmd чтобы он мог бежать net startс соответствующими повышенными привилегиями (которые требуются Windows). Это повышение должно произойти доnet start это запустить. По моему опыту, это в целом верно для многих сторонних программ или скриптов, которые выполняют аналогичную функцию.

Elevate является исключением (то есть он будет отображатьNet Command в UAC), но опять же, он не подавляет окно консоли, как nircmd делает.

После этого я не хочу, чтобы появилось окно консоли.

Хотя окно консоли может появиться с другими решениями (например, elevate.exe , .vbs скрипт), новое окно консоли не появляется после запуска nircmd elevatecmd execmd net start example_service ,

Подавление Консольного Окна

Хотя это, вероятно, не возможно отобразить net.exe в UAC вы можете отключить окно консоли для командного файла (который, честно говоря, звучит как ваша истинная цель, если я не слишком плохо читаю вещи):

  1. Создать .bat например, файл start_service.bat с чем-то вроде следующего:

    C:\path\to\nircmd.exe elevatecmd execmd net start example_service
    
  2. Создайте новый ярлык где-нибудь для запуска этого .bat файл. Сделайте цель похожей на следующую:

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

Для этого примера, когда используется этот ярлык (не .bat файл), будет отображаться только приглашение UAC (окно консоли не будет отображаться).

Другие вопросы по тегам