Windows 7 Vista/Windows 7下的通用世界可写应用程序数据文件夹

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.

我正在尝试查找一个文件夹,默认情况下,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值解析为路径的代码

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)-并且鉴于此代码已经编写好,因此重用它非常容易。