当我让一项 Windows 服务尝试安装另一项 Windows 服务时,我遇到了问题。
具体来说,我有一个 TeamCity 代理在 Windows 2008 AWS 实例上为我运行测试。这些测试是用 Java 编写的,它使用 .bat 脚本来安装服务(我们称之为服务 A),每次都给它一个唯一的名称。
有问题的行位于 .bat 脚本中:sc create "%serviceName%"binPath= %binPath% DisplayName= "%serviceDisplayName:"=%"start= %serviceStartType%
。我相信只要服务名称是唯一的就可以工作。
如果我使用管理员帐户在命令行上手动运行测试,它确实可以工作。服务A已安装,测试完成,最后卸载服务A。
我尝试以 LocalSystem、管理员以及属于管理员组成员的其他用户身份运行 TeamCity 代理。我也尝试过完全禁用 UAC。
问题可能是访问被拒绝类型错误,尽管目前还不清楚。仍有一些途径需要探索,但这确实是一个简单的问题:作为服务运行的进程是否禁止安装其他服务?我需要做一些特殊的事情来配置机器/帐户以允许它执行此操作吗?
测试的重点是安装和使用服务 A,因此解决方法并不相关 - 服务 A 必须作为黑匣子运行。
谢谢!
最佳答案
创建服务对于创建进程的执行方式没有任何限制,只要该进程具有适当的权限即可。也就是说,一个进程可以作为一个服务运行并创建另一个服务——这里唯一需要考虑的是适当的权限级别。
从进程内运行批处理脚本(而不是直接通过命令行上的用户输入)经常出现的问题是预期的环境并不总是加载的环境。在这种情况下,批处理脚本中引用的环境变量在作为服务运行时似乎未正确设置,这当然会导致服务安装失败。纠正批处理脚本脱壳时加载的环境是这里的正确解决方案。
关于windows - 一个 Windows 服务可以安装另一个 Windows 服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26913545/