- 我们有两个环境,暂存和生产,都运行 Windows 服务。
- 我们使用构建服务器通过 MSDeploy 部署某个 Windows 服务
- 构建步骤的一部分是运行一个 CMD 脚本,该脚本检查服务是否正在运行,如果为真,则尝试通过“net stop xxx”停止它
- 构建代理在域帐户下运行
- MSDeploy 正在使用 NTLM 身份验证
对于生产环境和暂存环境,构建代理用户具有相同的权利,尽管“net stop xxx”仅在一个环境中有效。
在 onve 环境中,“net stop”命令失败,并出现“系统错误 5,拒绝访问”。
服务控制命令的用户权限通过 subinacl 实用程序设置。
我尝试了各种权限,但都无法完全发挥作用:
- TOP 权限导致用户无法读取服务状态
- F 或 TOPS 可以读取服务状态,但无法停止或启动服务 - 总是出现错误 5 访问被拒绝
- 对于 F,subinacl 显示以下输出:“/pace =foo\bar ACCESS_ALLOWED_ACE_TYPE-0x0 SERVICE_ALL_ACCESS”
- 停止和启动命令均被“拒绝访问”
用户是否需要其他权限或服务器角色才能启动/停止服务?我们不想授予构建代理用户管理权限。
更新:
我进一步深入研究。使用 procmon,命令 net 和 net1 均成功,但退出状态代码为 2。
此外,当通过 runas 使用同一用户帐户在本地运行脚本时,服务就会正常停止/启动,因此它似乎与 MSDeploy 模拟有某种关联。