我正在尝试查找一个文件夹,默认情况下,Vista和Windows 7中Users组的成员有权写入,而不提升。
这用于存储公共数据(数据库和定期更新的文档包),需要所有用户共享和写入。
我以为我有一个CSIDL_COMMON_APPDATA,它在Vista上解析为c:\ ProgramData,但是在测试中我们发现当组机器加入域时,Users组的成员只具有读/执行权限。这似乎与文档相矛盾:
CSIDL _ COMMON _ APPDATA (FOLDERID_ProgramData)版本5.0。
文件系统目录 包含所有的应用程序数据 用户。典型的路径是C:\ Documents 和设置\所有用户\应用程序 数据。此文件夹用于 非用户的应用程序数据 具体。例如,一个应用程序 可以存储拼写检查词典, 剪贴画数据库或其中的日志文件 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 :(得分:3)
http://blogs.msdn.com/oldnewthing/archive/2004/11/22/267890.aspx
这似乎暗示这是故意不可能的。我回来使用提升的CLI应用程序改变我们文件夹上的ACL。很脏,但我们的情况需要。