我们有一个用 C++ 编写的自定义 Windows 服务。此 Windows 服务在特定域中的所有 VM 中运行。我需要将某些参数传递给该 Windows 服务,该服务应在启动期间读取这些参数。是否可以通过 GPO 做到这一点,或者应该使用其他技术?
答案1
这Windows 服务控制管理器(SCM) 是 Windows 的一个组件,您可以用它来管理 下的服务数据库HKLM\System\CurrentControlSet\Services
。典型的管理操作包括创建、删除、更改服务的配置等。
对于软件开发人员来说,有很多SCM API用于直接管理此数据库来执行上述类型的操作,或者您可以使用调用这些 API 的 Windows 内置命令行工具(如 sc.exe 或 net.exe)。
笔记:手动编辑注册表并不理想,因为 SCM 将配置保存在内存中,因此我始终建议尽可能与 SCM 交互,而不是直接修改数据库。
对于使用 更改现有服务的配置的情况sc.exe
,请参阅页面Sc 配置。对于您的情况,我假设您需要配置binpath
。例如:
服务名称:PSEXESVC
HKLM\SYSTEM\CurrentControlSet\Services\PSEXESVC
其中:ImagePath =%SystemRoot%\PSEXESVC.exe
要添加参数(例如),-arg1
命令ImagePath
为:
sc.exe config PSEXESVC binPath= "%SystemRoot%\PSEXESVC.exe -arg1"
重要的,这是不带引号的,如果二进制路径有空格则可能存在安全问题,因此最好使用以下命令:
sc.exe config PSEXESVC binPath= ""\"%SystemRoot%\PSEXESVC.exe"\" -arg1
答案2
一种可能的机制是通过文件传递参数。
如果您有一个可从所有虚拟机访问的网络共享,那么您可以在其中添加文件。
如果文件需要存储在每台虚拟机本地,则可以通过 GPO 将其从共享复制到本地文件夹。
有关通过 GPO 传输文件的信息,请参阅以下文章:
另一种解决方案是在注册表发生变化时推送参数。
该方法的随机参考是文章
如何通过 GPO 添加、编辑、部署和导入注册表项。