| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Запись файла "от обычного пользователя" |
| Автор: kami 5.12.2013, 16:15 | ||
| Доброго времени суток, уважаемые! Возможно, я решил пойти не в том направлении для решения проблемы, посему - лучше опишу, что случилось: Есть приложение, которое хранит... пусть будет "текущие настройки" в файле на C:\ProgramData\AppName\options.bin и по необходимости перезаписывает его. Всё идет хорошо до тех пор, пока пользователь не запустит приложение (имеется ввиду первый запуск) "от администратора". При сохранении настроек "из-под админа" для обычных пользователей права на файл автоматом выставляются в ReadOnly, соответственно - все последующие запуски от обычных пользователей настройки не сохраняются и приложение вылетает. Код простой (в этом примере поленился "правильно" получить путь CSIDL_COMMON_APPDATA):
Порядок использования: После компиляции первый запуск в обязательном порядке провести с повышением прав (т.е. не из-под IDE, если она не "от админа") Все последующие запуски от обычного пользователя - сразу Access Denied. Как быть? P.S. Целевая ОС = Win7 |
| Автор: kami 5.12.2013, 17:47 | ||
Нет, это не папка с программой, т.е. не Program Files. http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494(v=vs.85).aspx: The file system directory that contains application data for all users. A typical path is C:\Documents and Settings\All Users\Application Data. This folder is used for application data that is not user specific. For example, an application can store a spell-check dictionary, a database of clip art, or a log file in the CSIDL_COMMON_APPDATA folder. This information will not roam and is available to anyone using the computer. Добавлено через 1 минуту и 41 секунду Проблема не в том, что я не могу вообще записать в файл. Если первый запуск приложения проходит без UAC, то всё нормально. Иначе - атрибуты безопасности блокируют обычным пользователям запись в этот файл. |
| Автор: Alexeis 5.12.2013, 18:06 |
| Да, действительно, сейчас C:\Users\All Users является ярлыком на C:\ProgramData\ , значит по идее все верно делается. А если при установке программы добавить полные права группе "Пользователи"? Можно попробовать сначала сделать такое руками. После чего зайти с админскими правами, а затем с правами пользователя? Ситуация очень похожа на то что винда реализует какую-то правильную логику с назначением прав, но непонятно какую. |
| Автор: Akella 7.12.2013, 12:35 |
После записи настроек, посмотри какие Windows выставляет права на файл.... Добавлено через 2 минуты и 8 секунд Я думаю, что в первую очередь нужно создавать папку C:\ProgramData\AppName с правами обычного пользователя. Чтобы Windows правильно установила права на запись. |
| Автор: kami 7.12.2013, 19:18 | ||||||
Да, если в явном виде выставить "полный доступ" к папке для простых смертных - то он наследуется и проблем в дальнейшем не наблюдается.
разрешения на запись для "Пользователей" хранятся в "Особых разрешениях", выставлено: "создание файлов/запись данных", "создание папок/дозапись данных", "запись атрибутов", "запись дополнительных атрибутов". Кстати, вот тут тоже засада - при создании файла "от обычного пользователя" права на изменение выставляются только ему, а остальным - ReadOnly.
не помогает. Права на файл, создаваемый "от админа" не наследуют разрешения от папки. |
| Автор: kami 7.12.2013, 19:48 | ||||
| А есть ли возможность принудительно выставить доступ к создаваемому файлу "без ограничений"? Пробовал так:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379583(v=vs.85).aspx написано:
Думал, поможет, ан нет - ничего не меняется... |
| Автор: Akella 9.12.2013, 12:33 |
| Тут дело не в Delphi, а в самой ОС. Так что нужно в другую папку писать или задать вопрос в соответствующем разделе по ОС. |
| Автор: kami 9.12.2013, 13:31 |
В какую, если эта папка как раз предназначена для хранения опций/настроек, независимых от залогиненного пользователя? Не вижу причины писать в раздел MS Windows. Никто ради установки приложения не будет лезть в скрытую ProgramData, искать там нужную подпапку и править вручную права доступа. Тем более - если клиентских машин не один десяток. Нужен именно программный механизм полного доступа к файлу, вне зависимости от залогиненного пользователя. |
| Автор: Frees 9.12.2013, 14:48 | ||||
Дело не в папке, а в том что владелец файла администратор и пользователь не может править файл админа. Была такая же проблема, только в InnoSetup, инсталятор запущен от админа и файл потом нельзя было исправить. Решилось установкой прав для всех польлзователей на папку в ProgramData Код в InnoSetup
Можно попробовать сделать что-то подобное из Delphi |
| Автор: Alexeis 9.12.2013, 15:03 |
| Вот вот, последнее решение мне кажется наиболее логичным. Только я бы все же давал разрешения не всем, а только группе пользователи. К примеру, сетевой доступ имеет права гостя, которые не выше чем у пользователя. Главное, раз директория предусматривает общий доступ всех пользователей, то значит выставление таких прав не нарушает идеологию. |
| Автор: kami 10.12.2013, 08:23 |
| Господа, а если не затруднит - киньте в меня ссылкой, как убрать унаследованные разрешения и заменить их своими на папку/файл? А то мне чегой-то попадается только как это сделать мышкой... |
| Автор: Alexeis 10.12.2013, 09:56 |
| Ну нагуглить несложно. Например http://www.itlisting.org/5-windows/f2a3a2907d6e33b8.aspx - это для С++ Или для папки но на бейсике http://www.powerbasic.com/support/pbforums/showthread.php?t=7871 На делфи нашел только код получения привелегий http://www.cyberforum.ru/cpp-builder/thread257643.html Но это просто портированный фрагемент кода из MSDN. Сам такую задачу ни разу не решал. |
| Автор: kami 10.12.2013, 10:12 |
Да без разницы - главное, что не на .Net, а то там бывают такие конструкции, к которым сложновасто подобрать WinAPI функции. Буду пробовать. Всем спасибо, тему можно считать закрытой, ибо направление получено. |
| Автор: Alexeis 10.12.2013, 10:17 |
| Если получиться, запуль сюда примерчик на делфи. Будем ссылаться в следующий раз на эту тему. |
| Автор: kami 18.12.2013, 03:49 | ||
Пожалуйста. Функция создает файл с правами: системе, админам, пользователям - полный доступ, "Всем" - только чтение.
|