Be.*_*St. 5 service elevated-privileges
我有一个Windows服务"Service1"配置为登录为"本地服务".
我构建了一个控制台应用程序来以编程方式启动它
var service = new ServiceController("Service1");
service.Start();
Run Code Online (Sandbox Code Playgroud)
我知道如果我从管理员命令提示符运行ConsoleApplication1它会顺利启动.
如果我在没有抬高的情况下运行它,我得到一个:
发生了系统错误5.
访问被拒绝.
但是,我需要在没有提升的情况下启动它.
是否可能,或者我必须改变实现这一目标的方式?
Bil*_*art 10
您可以为服务本身设置ACL以允许此操作.所述SetACL.exe实用程序使得该(有点)简单; 例如:
SetACL.exe -on "MyService" -ot srv -actn ace -ace "n:S-1-5-32-545;p:start_stop"
Run Code Online (Sandbox Code Playgroud)
这允许Users组的成员(S-1-5-32-545)启动和停止MyService.
我关注了 torak链接,我了解了有关服务权利的关键区别:
因此,要启动服务,我需要修改服务控制权限。
好吧,我已经做了一个名为 Service1 的 Windows 服务,并使用 WIX 制作了一个安装程序。在设置过程中我调用ServiceInstall
<ServiceInstall Id="ServiceInstaller" Type="ownProcess" Vital="yes"
Name="Service1" DisplayName="Service1"
Description="Service1 description"Start="demand"
Account="NT AUTHORITY\LocalService"
ErrorControl="ignore" Interactive="no" >
</ServiceInstall>
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为 TestProgram 的客户端程序,我尝试在其中启动服务:
var service = new ServiceController("Service1");
service.Start();
Run Code Online (Sandbox Code Playgroud)
显然,如果没有提升 TestProgram(在普通用户帐户下运行),它就不会启动服务。
因此,解决方案是指示 WIX 允许用户组的成员(例如)使用PermissionEx标签启动/停止服务:
<util:PermissionEx User="Users" ServiceStart="yes" ServiceStop="yes">
</util:PermissionEx>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。谢谢你们。