Общая доступная для записи папка данных приложений под Vista / Windows 7 - PullRequest
3 голосов
/ 10 ноября 2009

Я пытаюсь найти папку, в которую члены группы «Пользователи» в Vista и Windows 7 по умолчанию имеют разрешение на запись без повышения прав.

Используется для хранения общих данных (базы данных и регулярно обновляемого пакета документов), которые должны быть доступны всем пользователям для записи и записи.

Я думал, что у меня есть что-то с CSIDL_COMMON_APPDATA, который в Vista разрешается в c: \ ProgramData, однако при тестировании мы обнаружили, что члены группы «Пользователи» имеют права «Чтение / Выполнение» только при присоединении машины к домену. Это кажется противоречащим документации:

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

Кажется, это подразумевает, что это намеренно сделано невозможным. Я вернулся к изменению списков ACL для нашей папки с помощью приложения с повышенными правами CLI. Грязный, но требуется для нашего случая.

1 Ответ

3 голосов
/ 25 марта 2011

http://blogs.msdn.com/oldnewthing/archive/2004/11/22/267890.aspx

Кажется, это подразумевает, что это намеренно сделано невозможным. Я вернулся к изменению списков ACL для нашей папки с помощью приложения с повышенными правами CLI. Грязный, но обязательный для нашего случая.

...