我試圖找到一個文件夾,默認情況下,Vista和Windows 7中的用戶組的成員有權寫入,無需提升。Vista/Windows 7下常見的全球可寫應用程序數據文件夾
這是用於通用數據存儲(數據庫,並定期更新的文件包),需要共享和可寫的所有用戶..
我想我已經用了CSIDL_COMMON_APPDATA某處,它在Vista上解析爲c:\ ProgramData,但是在測試中我們發現Users組中的成員只有在機器加入域時才具有讀/執行權限。這似乎與文檔相矛盾:
CSIDL _ COMMON _ APPDATA (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。髒,但需要我們的情況。
只是爲了完整:爲什麼不使用Environment.GetFolderPath? – 2009-11-10 12:43:23
因爲我們使用System.Environment.SpecialFolder中未定義的其他文件夾 - 具體是COMMON_DOCUMENTS(0x002e) - 並且已經寫入了此代碼,所以僅僅重用它就很容易了。 – tomfanning 2009-11-10 13:01:29