2009-11-10 31 views
3

我試圖找到一個文件夾,默認情況下,Vista和Windows 7中的用戶組的成員有權寫入,無需提升。Vista/Windows 7下常見的全球可寫應用程序數據文件夾

這是用於通用數據存儲(數據庫,並定期更新的文件包),需要共享和可寫的所有用戶..

我想我已經用了CSIDL_COMMON_APPDATA某處,它在Vista上解析爲c:\ ProgramData,但是在測試中我們發現Users組中的成員只有在機器加入域時才具有讀/執行權限。這似乎與文檔相矛盾:

CSIDL _ COMMON _ AP​​PDATA (FOLDERID_ProgramData)Version 5.0。

包含所有 用戶的應用程序數據的文件系統目錄。典型的路徑是C:\ Documents 和Settings \ All Users \ Application Data。該文件夾用於 應用程序數據,該數據不是用戶 特定的。例如,應用程序 可以在CSIDL_COMMON_APPDATA文件夾中存儲拼寫檢查字典,剪貼畫數據庫或日誌文件 。此 信息不會漫遊,並且 可供任何人使用 計算機。

http://msdn.microsoft.com/en-us/library/bb762494(VS.85).aspx

我不想用一個文件夾(如CSIDL_COMMON_DOCUMENTS),因爲這些文件不應該是用戶特別明顯。

感興趣的是我用來解析CSIDL值到路徑的代碼。

public enum CSIDL : int 
{ 
    COMMON_APPDATA = 0x0023 
    // etc 
} 

public static class Folders 
{ 
    [DllImport("shell32.dll")] 
    static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out]StringBuilder lpszPath, int nFolder, bool fCreate); 

    public static string GetCsidlValue(CSIDL csidl) 
    { 
    StringBuilder path = new StringBuilder(260); 
    SHGetSpecialFolderPath(IntPtr.Zero, path, (int)csidl, false); 
    return path.ToString(); 
    } 

    public static string GetCommonAppDataFolder() 
    { 
    return GetCsidlValue(CSIDL.COMMON_APPDATA); 
    } 
} 

有什麼建議?

編輯:問爲什麼我們不使用System.Environment.SpecialFolder。我們用一個文件夾(COMMON_DOCUMENTS - 0x002e)未在枚舉中定義:

public enum SpecialFolder 
{ 
    ApplicationData = 0x1a, 
    CommonApplicationData = 0x23, 
    CommonProgramFiles = 0x2b, 
    Cookies = 0x21, 
    Desktop = 0, 
    DesktopDirectory = 0x10, 
    Favorites = 6, 
    History = 0x22, 
    InternetCache = 0x20, 
    LocalApplicationData = 0x1c, 
    MyComputer = 0x11, 
    MyDocuments = 5, 
    MyMusic = 13, 
    MyPictures = 0x27, 
    Personal = 5, 
    ProgramFiles = 0x26, 
    Programs = 2, 
    Recent = 8, 
    SendTo = 9, 
    StartMenu = 11, 
    Startup = 7, 
    System = 0x25, 
    Templates = 0x15 
} 

編輯:我想我已經問一個無法回答的問題。

http://blogs.msdn.com/oldnewthing/archive/2004/11/22/267890.aspx

這似乎在暗示這是故意製造是不可能的。然後,我重新使用提升的CLI應用程序更改文件夾上的ACL。髒,但需要我們的情況。

+0

只是爲了完整:爲什麼不使用Environment.GetFolderPath? – 2009-11-10 12:43:23

+0

因爲我們使用System.Environment.SpecialFolder中未定義的其他文件夾 - 具體是COMMON_DOCUMENTS(0x002e) - 並且已經寫入了此代碼,所以僅僅重用它就很容易了。 – tomfanning 2009-11-10 13:01:29

回答

相關問題