[英]Retrieve MSI product code for an installed Service
我已經找到了相當數量的答案,希望我的“ google-fu”不是問題...無論如何。
我想枚舉Windows(2003 R2、2008、2008 R2)計算機上的所有服務,然后確定它們的產品代碼是什么,以確定用來安裝Windows Service的MSI軟件包(在我們維護的存儲庫中)。
基本上,請使用類似於以下PS命令的列表:{Get-Service | 格式列表*},或C#行:System.ServiceProcess.ServiceController [] services = ServiceController.GetServices();,然后遍歷所有返回的服務名稱並確定每個MSI產品代碼的含義。
我更喜歡C#路線,但會考慮所有建議。
這可能嗎? 還是有一個更好的方法在我的示例中不涉及ServiceController類?
在此先感謝您的任何建議!
WiX DTF的Microsoft.Deployment.WindowsInstaller具有一個名為ComponentInstallation的類。 它具有一個名為AllComponents的靜態屬性,該屬性返回ComponentInstallation的IEnumerable。
我想您可以查詢HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Services以獲取圖像路徑,並嘗試將其與由MSI管理的組件相關聯。 建立連接后,ComponentInstallation類將具有一個名為ClientProducts的屬性,該屬性將返回IEnumerable of ProductInstallation。 請記住,一個組件可以在多個MSI之間共享。
獲得ProductInstallation引用后,就可以獲取它的ProductCode屬性。
即使它們使用的是InstallUtil,這也會捕獲MSI安裝的服務,因為您正在跟蹤誰放下了文件。
並非所有Windows服務都是使用MSI安裝的。 您可以使用installutil.exe安裝.NET服務。 Windows服務已在HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services
。 由於注冊表不包含MSI產品編號,因此我認為您需要獲取ImagePath
屬性並交叉引用MSI軟件包安裝的項目。 MSI數據存儲在HKEY_CLASSES_ROOT\\Installer
。 如何將這兩者聯系起來超出了我的范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.