Windows 7 Vista/Windows 7下的通用世界可写应用程序数据文件夹
我正在尝试查找一个文件夹,默认情况下,Vista和Windows 7中的用户组成员有权写入该文件夹,而无需升级 这将用于存储公共数据(数据库和定期更新的文档包),所有用户都需要共享和写入这些数据 我原以为我在CSIDL_COMMON_APPDATA方面有所进展,它在Vista上解析为c:\ProgramData,但是在测试中,我们发现用户组的成员只有在计算机加入域时才具有读取/执行权限。这似乎与文件内容相矛盾: CSIDL uu公共uuu应用数据 (FOLDERID_ProgramData)5.0版 文件系统目录 包含所有应用程序的应用程序数据 用户。典型的路径是C:\Documents 和设置\所有用户\应用程序 数据。此文件夹用于 不是用户的应用程序数据 具体的例如,一个应用程序 可以存储拼写检查词典、 剪贴画数据库,或中的日志文件 CSIDL_COMMON_APPDATA文件夹。这 信息不会漫游,也不会丢失 任何使用 电脑 我不想使用documents文件夹(比如CSIDL_COMMON_documents),因为这些文件不应该对用户特别可见 出于兴趣,这里是我用来将CSIDL值解析为路径的代码Windows 7 Vista/Windows 7下的通用世界可写应用程序数据文件夹,windows-7,windows-vista,ntfs,Windows 7,Windows Vista,Ntfs,我正在尝试查找一个文件夹,默认情况下,Vista和Windows 7中的用户组成员有权写入该文件夹,而无需升级 这将用于存储公共数据(数据库和定期更新的文档包),所有用户都需要共享和写入这些数据 我原以为我在CSIDL_COMMON_APPDATA方面有所进展,它在Vista上解析为c:\ProgramData,但是在测试中,我们发现用户组的成员只有在计算机加入域时才具有读取/执行权限。这似乎与文件内容相矛盾: CSIDL uu公共uuu应用数据 (FOLDERID_ProgramData)5.
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
}
编辑:我想我问了一个无法回答的问题
这似乎意味着这是故意不可能的。然后,我将使用提升的CLI应用程序更改文件夹上的ACL。脏,但我们的箱子需要。
这似乎意味着这是故意不可能的。然后,我将使用提升的CLI应用程序更改文件夹上的ACL。脏的,但对于我们的情况是必需的。只是为了完整性:为什么不使用Environment.GetFolderPath?因为我们使用System.Environment.SpecialFolder中未定义的其他文件夹-特别是COMMON_DOCUMENTS(0x002e)-并且鉴于此代码已经编写好,因此重用它非常容易。