2009-01-05 70 views
1

我正在調用CreateFile()在Program Data目錄中創建一個文件。我正在使用SHGetSpecialFolderPath()來獲取目錄名稱。如何使用UAC在Vista中獲取文件的實際路徑?

我有一個Vista用戶,其CreateFile()返回錯誤5(拒絕訪問)。如果我知道CreateFile()實際上是在嘗試創建文件,那麼我們可以檢查他的文件夾權限。 Vista(UAC)的問題是,它不會嘗試在我傳入的目錄中創建該文件。它也可能位於VirtualStore目錄中。另外一個混淆的原因是這個用戶是德國人,雖然SHGetSpecialFolderPath()返回「C:\ Program Data \ blah blah」作爲路徑,但我不認爲這實際上是路徑所在。我認爲德語Vista使用德語單詞「程序數據」。我希望能夠告訴用戶「這是我們嘗試創建文件的確切路徑,請檢查您對此文件夾的權限。」

我知道你可以從打開的文件句柄中得到一個路徑,但在這種情況下,CreateFile()失敗了,所以我沒有打開的句柄。我如何讓Vista告訴我試圖創建文件的實際路徑?

+0

如果用戶是在Windows XP上,是一個標準的用戶,會發生什麼?當時`CSIDL_COMMON_APPDATA`指向`C:\ Documents&Settings \ All Users`,你的`CreateFile`也會失敗。 (換句話說,失敗並不是特定於Vista,而是針對你的應用程序,你不應該寫入你不應該寫的地方) – 2011-05-24 18:23:34

+0

fyi:自從Windows 2000以來,SHGetSpecialFolderPath已被棄用;改爲使用SHGetFolderPath。較新的應用程序可以使用`SHGetKnownFolderPath`。 – 2011-05-24 18:26:49

回答

1

如果在UAC中使用的路徑不是您想要的路徑,那麼重定向將生效。 爲確保不會發生重定向,請將manifest添加到您的應用程序,向Vista表明您的應用程序已正確編碼並且知道訪問限制(例如,如果您的應用程序未寫入例如HKLM或程序文件夾不需要管理員權限來運行)。

但是你的應用程序應該能夠寫入APPDATA文件夾(如果這是你真正使用的)。

請確保您使用的是CSIDL_APPDATA而不是CSIDL_COMMON_APPDATA(後者只能以管理員權限訪問)。

要找到真實路徑(您期望的路徑),請告訴用戶在瀏覽器欄中鍵入%APPDATA%(或者打開Windows + R,然後輸入%APPDATA%,輸入)。這將打開該文件夾上的資源管理器。

+0

我確實需要使用CSIDL_COMMON_APPDATA,因爲這個特定的文件需要被所有用戶訪問。但CSIDL_COMMON_APPDATA不需要管理員權限。任何用戶都可以寫信給它,儘管你創建的任何文件都不能被其他用戶讀取,除非它是通過「允許所有人」訪問創建的。 – mhenry1384 2009-01-05 18:26:52

+0

不,CSIDL_COMMON_APPDATA需要管理員權限。這個位置通常由安裝人員編寫,而不是由應用程序本身編寫。 如果一個用戶可以設置選項或更糟糕的話,這將是一個安全風險,替換另一個用戶將不得不使用的二進制文件。 – Stefan 2009-01-05 18:33:56

1

我的理解是,Vista使用ProgramData編寫試圖寫入C:\ Program Files文件但失敗的文件,因爲除非以Admin身份運行應用程序,否則無法在程序文件中寫入。也許你應該嘗試將你的文件保存到當前用戶下的AppData文件夾中。

相關問題