2015-08-28 29 views
1

「每用戶」安裝模式似乎有一些神祕的內幕。「每個用戶」安裝如何以及爲什麼設法寫入HKLM?

我們的應用程序有autoupdater,不使用insaller,我想更新「添加/刪除程序」窗口中顯示的應用程序版本。我很驚訝的是,設置信息(和版本太)被actualy存儲在

HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{ProductId} 

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\{SId}\Products\{ProductId} 

所以我的問題是:安裝程序如何管理寫有沒有請求海拔?爲什麼每個用戶安裝都在HKLM中註冊,尤其是第一次入口,它根本不涉及任何特定用戶?

其他隨之而來的更實際的問題是如何從代碼更新它(當然沒有提升)?

+2

控制面板>管理工具>服務> Windows安裝程序。指向c:\ windows \ system32 \ msiexec.exe,它使用系統帳戶運行。您可以編寫自己的服務來在沒有提升的情況下戳HKLM。說到用戶進行安裝,需要提升高度,這是我們無法提供的幫助。只是不要隱藏這樣的代碼,不錯,請求提升。 –

+0

關於標題中的問題:從這裏看https://msdn.microsoft.com/en-us/library/windows/desktop/aa367559%28v=vs.85%29.aspx(Windows Vista部分)安裝程序可以如果用戶具有管理權限,則寫入HKLM。 – VMykyt

+0

@HansPassant,當然我可以要求提升。但是,應用程序不需要管理員權限來工作,也不需要更新,並且要求升級只是爲了更新註冊表中的行(不是很重要)似乎有點太過分了。 –

回答

1

Windows Installer在多個上下文中運行。存在調用它的上下文(通常是受限用戶,或者至少是管理員組中的用戶的非管理員變體)以及服務上下文。後者幾乎可以完全訪問機器,但是在扮演原始調用者的同時卻完成了大部分工作。自定義和內置操作可以訪問服務上下文(如果UAC或更早的廣告允許),並且服務可以始終使用它。

所以這就是它的訪問方式。但爲什麼它會使用這種訪​​問方式在HKLM中存儲有關該產品的信息?雖然您可能熟悉SharedDllRefCount,但它僅用於與其他解決方案的互操作性。 Windows Installer自己跟蹤類似或擴展的信息,並且需要訪問它管理的所有安裝的所有實例,即使它們是按用戶並且該用戶未登錄。當用戶未登錄時,他們的HKCU密鑰不能可靠地訪問,所以它不是一個可用的Windows安裝程序使用的位置。因此它使用HKLM。

您可能還想知道爲什麼它必須訪問每個用戶安裝的數據。總之,因爲它無法分辨安裝是否真的是每個用戶。特別是在Windows 7和MSIINSTALLPERUSER之前,但即使現在人們也不能輕易確定安裝是否可以寫入共享機器位置。所以我猜測他們甚至不試圖確定這一點。畢竟,當簡單的方法足夠時,爲什麼要實現一個困難或脆弱的特性?

那麼你如何更新它呢?通過安裝更新​​的.msi文件並讓Windows Installer服務爲您更新;這些註冊表項是Microsoft允許隨時更改的實施細節。您只能通過Msi * API調用(例如MsiEnumProductsExMsiConfigureProductEx)讀取或寫入它們。 (無可否認地稱後者是一個API來編寫這些值是有點延伸,但它是少數有效的方法之一。)即使數據存儲在HKCU中,答案的這部分也不會有任何不同。

1

Windows可以寫入該卸載位置,因爲它是Windows。安全限制適用於你所做的事情,而不是Windows所做的事情。畢竟這是操作系統,可以做它需要的東西。如果未升級的安裝程序無法在程序和功能中創建條目,那將會很奇怪。這些註冊表項實際上不在MSI文件中。

每個用戶都不是嚴格的問題。如果需要,可以提高每個用戶的安裝次數,但常見的慣例是每個用戶的安裝次數沒有增加。如果您的更新程序寫入卸載密鑰,則需要提升。

備註:如果您的autoupdater正在更新或替換由Windows Installer安裝的文件,那麼您違反了規則。只能使用基於MSI的解決方案進行更新。問題在於Windows知道(例如)您安裝的每個版本化文件的文件版本。如果用戶進行修復(或者出於某種原因剛剛發生),那麼您可能會發現Windows希望將文件恢復到最初安裝的版本。同樣,如果您進行修補程序或主要升級,則Windows將不知道文件是否需要更新,如果磁盤上的版本與註冊版本不匹配,則可能會要求原始MSI文件來恢復它們。

+0

好吧,Hans Passant在原始帖子的評論中解釋了部分「如何」。目前還不清楚「爲什麼(地獄)」。我想這是Windows安裝程序的設計問題:如果它是「每用戶」安裝,它應該限於HKCU和其他用戶特定區域。程序和功能記錄應該針對特定用戶從機器範圍的安裝和每個用戶的安裝中合併而來。 迄今爲止最好的選擇,除了忽略問題是創建自定義無頭微星,這將使msiexec做伎倆,並更新所有必要的東西。不確定抗病毒藥物如何容忍這種行爲。 –

+0

Windows是操作系統,它代表用戶執行安全限制,而不是它自身的功能,例如在C:\ windows \ installer和HKCR \ Installer中創建程序和功能條目和安裝程序信息。漢斯評論是正確的,但我想提出更大的觀點,而不是專注於系統帳戶。這是一種WiX設計功能,可使每個用戶的安裝不會升級,而不是Windows安裝程序。你在使用WiX嗎? Vs設置可能類似。 – PhilDW

+0

我在這裏看到架構問題,因爲「每用戶」安裝意味着其他用戶不應該受到任何影響(至少這是我的期望)。而將員工分享到像HKLM或C:\ Windows這樣的共享區域絕對不是這種行爲。是的,我使用的是WiX,但是WiX只是對MSI的封裝,在某些方面非常低級。所以我相信這是Windows Installer本身的功能,只是不被較高級別的安裝程序製造商使用。 –

相關問題