Я пытаюсь найти папку, в которую члены группы «Пользователи» в 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. Грязный, но требуется для нашего случая.