我已经四处寻找答案,希望我的“google-fu”不是问题......无论如何。
我想枚举Windows(2003 R2,2008,2008 R2)计算机上的所有服务,然后确定他们的产品代码是什么来确定用于安装该Windows服务的MSI包(在我们维护的存储库中)
基本上,请使用来自此PS命令的列表:{Get-Service | Format-List *}或C#行:System.ServiceProcess.ServiceController [] services = ServiceController.GetServices();,然后迭代所有返回的服务名称,并确定每个MSI产品代码的内容。
我更喜欢C#路线,但会接受所有建议。
这可能吗?或者,在我的示例中是否有更好的方法不涉及ServiceController类?
提前感谢任何建议!
答案 0 :(得分:3)
WiX DTF的Microsoft.Deployment.WindowsInstaller有一个名为ComponentInstallation的类。它有一个名为AllComponents的静态属性,它返回一个IEInumerable的ComponentInstallation。
我想你可以查询HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services来获取imagepath,并尝试将它与由MSI管理的Component相关联。一旦建立了该连接,ComponentInstallation类就有一个名为ClientProducts的属性,它返回ProductInstallation的IEnumerable。请记住,组件可以在多个MSI之间共享。
获得ProductInstallation参考后,您可以获得它的ProductCode属性。
这将捕获MSI安装的服务,即使他们使用的是InstallUtil,因为您正在跟踪谁放下了文件。
答案 1 :(得分:2)
并非所有Windows服务都使用MSI安装。您可以使用installutil.exe安装.NET服务。 Windows服务已在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
中注册。由于注册表不包含MSI产品编号,我认为您需要获取ImagePath
属性并交叉引用MSI包安装的项目。 MSI数据存储在HKEY_CLASSES_ROOT\Installer
中。如何将这两者联系起来超出了我的范围。