我试图找到一个文件夹,默认情况下,Vista 和 Windows 7 中的用户组成员有权写入,而无需提升。
这将用于存储公共数据(数据库和定期更新的文档包),需要所有用户共享和写入。
我以为我在某个地方找到了 CSIDL_COMMON_APPDATA,它在 Vista 上解析为 c:\ProgramData,但是在测试中我们发现用户组的成员只有在机器加入域时才具有读取/执行权限。这似乎与文档相矛盾:
CSIDL_COMMON_APPDATA (FOLDERID_ProgramData) 5.0 版。
包含所有用户的应用程序数据的文件系统目录。典型路径是 C:\Documents and 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。脏,但我们的情况需要。