2014-11-13 144 views
2

我遇到问题时,我有一个Windows服务尝试安装另一个Windows服务。Windows服务可以安装另一个Windows服务吗?

具体来说,我有一个TeamCity代理在Windows 2008 AWS实例上为我运行测试。这些测试是用Java编写的,它通过一个.bat脚本来安装服务(我们称之为服务A),每次都给它一个唯一的名称。

违规行在.bat脚本中:sc create "%serviceName%" binPath= %binPath% DisplayName= "%serviceDisplayName:"=%" start= %serviceStartType%。我相信只要服务名称是独一无二的,应该可以工作。

事实上,如果我使用管理员帐户在命令行上手动运行测试,它确实会起作用。服务A被安装,测试完成并且服务A在最后被卸载。

我尝试以管理员身份运行TeamCity代理作为LocalSystem,并且以管理员组的身份成为另一个用户。我也试过完全禁用UAC。

推测该问题是拒绝访问类型错误,尽管目前尚不清楚。还有几条途径可以探索,但这确实是一个简单的问题:进程是否作为禁止安装其他服务的服务运行?我有什么特别的事情来配置机器/帐户以允许它执行此操作吗?

安装和使用服务A的测试要点,所以解决方法是不相关的 - 服务A必须作为黑匣子运行。

谢谢!

+1

您可以请尝试做一个测试.bat文件,您可以使用您希望创建的服务名称的文字值,而不是使用%serviceName%等env变量。我怀疑您的Java过程可能没有与您的cmd shell相同的环境,所以实际执行的内容有所不同。否则,请在.bat脚本的末尾放一段暂停,以便您可以实际看到打印出的错误,以便我们可以评估真正的问题。 – Jon

+0

这是可能的,所以你需要更多的日志来找到罪魁祸首。 尝试使用echo,然后在之前使用该命令的副本。如果TC不捕获它,你可以重定向到一个文件。 –

+0

如果%binPath%中有空格,我相信你需要在它周围加双引号。 –

回答

2

对创建服务没有限制,只要进程具有适当的权限,创建进程可以执行。也就是说,一个进程可以作为服务运行并创建另一个服务 - 这里唯一的考虑是适当的权限级别。

从进程内运行批处理脚本(而不是直接通过命令行上的用户输入)经常发生的问题是预期的环境并不总是加载的环境。在这种情况下,看起来在批处理脚本中引用的env变量在作为服务运行时没有正确设置,这当然会导致服务安装失败。修正批处理脚本被加载时加载的环境是正确的解决方案。