我想使用非提升权限的 bat 文件中的 net.exe 命令静默启动服务。但我只希望 net.exe 出现 UAC 提示,之后我不想出现控制台窗口。我知道有一种方法可以隐藏许多程序(如 nircmd)的控制台窗口:
nircmd elevatecmd execmd net start [service]
但是 nircmd 程序将会被要求输入 UAC 提示。
是否可以?
答案1
我只希望针对 net.exe[.] 询问 UAC 提示,可以吗?
据我所知,答案很可能是“否”。
显示 UAC 是为了nircmd
让它能够以适当的提升权限运行net start
(这是 Windows 所要求的)。此提升必须在net start
运行之前进行。根据我的经验,这通常适用于许多执行类似功能的第三方程序或脚本。
提升是一个例外(即它将显示Net Command
在 UAC 中),但再次,它不会像那样抑制控制台窗口nircmd
。
此后我不希望控制台窗口出现。
虽然控制台窗口可能会与其他解决方案(例如脚本)一起出现elevate.exe
,.vbs
但运行后不会出现新的控制台窗口nircmd elevatecmd execmd net start example_service
。
抑制控制台窗口
虽然可能无法net.exe
在 UAC 中显示,但您可以抑制批处理文件的控制台窗口(如果我没有误解的话,这听起来确实是您的真正目标):
创建一个
.bat
文件,start_service.bat
例如以下内容:C:\path\to\nircmd.exe elevatecmd execmd net start example_service
在某处创建一个新的快捷方式来运行此
.bat
文件。使目标类似于以下内容:C:\path\to\nircmd.exe execmd C:\path\to\start_service.bat
对于此示例,当使用此快捷方式(而不是.bat
直接使用文件)时,只会显示 UAC 提示(不会出现任何控制台窗口)。
答案2
我终于找到了一种无需显示控制台窗口即可静默启动和停止服务的方法,并且无需为 Microsoft 签名的程序 (wscript.exe) 显示 UAC,使用 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