2016-04-28 214 views
0

我已經繼承了一個遺留應用程序,用於將其設置寫入C:\Program Files\<Company>\<ProgramName>下的文件。從虛擬化文件夾獲取配置文件UAC

此應用程序預先計劃Windows Vista,因此不包含清單。因此,當安裝在Windows Vista或更高版本上時,這些寫入實際上會被重定向(虛擬化),並且設置文件將最終到達其他地方 - 通常在C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86)\...(但是如果我正確的話,這取決於Windows版本)。

現在我需要更新這個遺留應用程序,並將包括一個清單。現在需要將設置文件存儲在其他地方,可能是%APPDATA%。問題是,當「更新」版本安裝在舊版本的頂部時,如果它能以某種方式找到以前的設置文件並將其複製到新位置,那將會很好。

因此,問題:有沒有什麼辦法可以編程地知道Windows將最終放置虛擬化文件的位置,從應用程序而不是虛擬化?

+0

Hi downvoter,這個問題出了什麼問題? – Grodriguez

回答

2

這取決於舊應用程序的安裝位置。用戶可能已安裝在"c:\program files\...""c:\program files (x86)\"或其他地方。

您必須找到舊的安裝路徑並刪除驅動器號。例如:"c:\Program Files\Company\Old App"變成"Program Files\Company\Old App"

接下來,追加到VirtualStore的路徑。

例如:

wchar_t *old_application_path = L"Program Files\\Company\\Old App Folder"; 
wchar_t path[300]; 

wchar_t *ptr; 
if (S_OK == SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ptr)) 
{ 
    wsprintf(path, L"%s\\VirtualStore\\%s", ptr, old_application_path); 
    CoTaskMemFree(ptr); 
} 

注意這個虛擬化只適用於保護的文件夾,例如"c:\Program Files"需要寫入數據的管理員權限。如果程序安裝到不受保護的文件夾,例如"c:\my programs\",則不存在虛擬化,程序可以直接寫入該文件夾。

+0

您的意思是說VirtualStore路徑始終是/VirtualStore?對於Windows Vista之後的所有Windows版本,這是否正確? (你有任何參考文檔?) – Grodriguez

+1

據我所知,該文件夾是在所有版本,包括Windows 7,8和10在同一個地方。我不知道在這方面的任何文件。這基本上是一個很老的程序的錯誤修復,可能沒有任何文檔。 –

+0

VirtualStore的路徑,至少在Vista和Windows 7中,記錄在[Windows Vista或Windows 7中的常見文件和註冊表虛擬化問題]中(https://support.microsoft.com/en-us/kb/ 927387)。要檢測應用程序是否將文件系統和註冊表訪問虛擬化,可以使用'GetTokenInformation(TokenVirtualizationEnabled)'。 –