2009-09-02 59 views
0

我有一個以vb6編寫的舊版更新程序,它以admin身份運行。但是,因爲它以管理員身份運行,所以它下載並保存的所有文件都是隻讀給其他用戶的。即使文件在公共場所,如共享應用程序數據文件夾(這是我保存有問題的文件)。如何在VB6中爲非管理員用戶設置文件權限?

我很幸運,我在'vista兼容'發佈之前發現了這個。 Vista通過將非管理員寫入和將來的讀取重定向到一個「虛擬」文件夾來隱藏問題。但是下一次更新可能會替換該文件,而非管理程序仍然會轉到該虛擬文件夾並使用舊文件。

作爲管理員用戶,我如何讓其他用戶完全控制我在vb6中編寫的文件?

回答

2

我這樣做的方式是讓它成爲安裝者的責任。

使用VSI 1.1爲您的應用程序創建一個安裝程序MSI。在CommonAppDataFolder下創建一個應用程序數據文件夾。

作爲生成後步驟運行一個腳本來執行以下操作:

  1. 設置MSI數據庫的每臺機器安裝:屬性表,設置爲1
  2. 在ALLUSERS行目錄表中,找到CommonAppDataFolder的條目並獲取其目錄索引。使用此索引查詢目錄表,查找CommonAppDataFolder爲父項並獲取其索引(這是您的應用程序數據子文件夾)的條目。
  3. 查看文件表以獲取程序的組件索引。
  4. 如果數據庫中不存在,則創建CreateFolder表。通過索引將所需的應用程序子目錄的行添加到CreateFolder,並將其綁定到程序的組件索引。
  5. 創建LockPermissions表,如果它不存在。爲您的應用程序數據子目錄插入一個新的LockPermissions行,併爲每個人提供FILE_ALL_ACCESS

就是這樣。

您可以這樣做,或使用VSI 1.1,然後使用Orca編輯MSI,或者可能使用第三方MSI編寫工具,這些條目可通過其GUI設置,並可保存在Installer項目中。我只是使用我在每個VSI 1.1版本之後運行的小型WSH腳本。

AFAIK這是根據Windows應用程序指南完成此類事情的推薦方法。如果您的需求更加奇妙,可以使用多個子目錄或子子目錄,其中一些允許完全訪問,一些只讀等。

您的程序可以使用Shell自動化對象或通過調用Shell32作爲標準DLL來定位文件夾聲明函數或TLB)。

+0

我看到了,所以如果我設置我的程序的數據文件夾以允許正常訪問,那麼問題應該解決? – 2009-09-02 22:37:27

+0

就是這樣,我會想。我不確定是否有任何漂亮的簡短代碼可以在你的VB6程序中實現。 – Bob77 2009-09-03 00:38:25

1

這不一定是誰寫的文件,但他們寫的地方。程序文件夾和它的子文件夾在默認情況下對所有標準用戶是隻讀的。嘗試使用「所有用戶應用程序數據」文件夾。

這對於VB6來說有點棘手,因爲它根本沒有考慮到Vista的設計。一些相關的文件夾被重新命名,並且我不知道如何讓vb6爲您提供您想使用「Declare Function」別名直接調用Windows API的確切文件夾。

因此,我知道找到合適位置的最簡單可靠的方法是使用%ALLUSERSPROFILE%環境變量。默認情況下,在XP上返回「C:\Documents and Settings\All Users」,在Vista上默認返回「C:\ProgramData」。從那裏你可以找到一個「應用程序數據」文件夾。它不會在那裏,你不需要它在Vista上,但創建一個,如果它不存在不會傷害任何東西。這爲您在這兩個系統上提供了一致的文件夾結構,您可以從中創建子文件夾供您的應用程序用作工作空間。

最後一點:這不是Vista的新變化。程序文件文件夾默認情況下一直只對標準用戶是隻讀的。 XP的工作方式相同。只有很多人在XP中以管理員身份運行,所以你可能會擺脫它。

+0

相關文件位於所有用戶的應用程序數據文件夾中(vista上的C:\ AppData)。更新程序還修改和註冊程序文件,它必須以管理員身份運行。 – 2009-09-02 21:10:21

+0

更新多個用戶共享的程序_應該要求管理員權限。從系統管理員的角度來看,這只是常識。非常奇怪的是,非程序文件不適用於App Data文件夾。您是否檢查過安全選項以查看誰有權限? – 2009-09-02 21:13:25

+0

對於標準用戶,任何由更新程序創建/替換的文件都是隻讀的。但我希望普通用戶對應用程序數據文件擁有完全權限,以便程序可以正常工作。 – 2009-09-02 21:17:56

相關問題