![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Доброго времени суток, уважаемые!
Возможно, я решил пойти не в том направлении для решения проблемы, посему - лучше опишу, что случилось: Есть приложение, которое хранит... пусть будет "текущие настройки" в файле на C:\ProgramData\AppName\options.bin и по необходимости перезаписывает его. Всё идет хорошо до тех пор, пока пользователь не запустит приложение (имеется ввиду первый запуск) "от администратора". При сохранении настроек "из-под админа" для обычных пользователей права на файл автоматом выставляются в ReadOnly, соответственно - все последующие запуски от обычных пользователей настройки не сохраняются и приложение вылетает. Код простой (в этом примере поленился "правильно" получить путь CSIDL_COMMON_APPDATA):
Порядок использования: После компиляции первый запуск в обязательном порядке провести с повышением прав (т.е. не из-под IDE, если она не "от админа") Все последующие запуски от обычного пользователя - сразу Access Denied. Как быть? P.S. Целевая ОС = Win7 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Я думаю что проблема именно в этом, что настройки хранятся в папке с программой. Если их хранить в поддиректории APPDATA, они будут разные для всех пользователей. Насколько я помню есть еще директория C:\Users\All Users , в том случае если настройки должны быть одинаковыми для всех пользователей. Винда начиная с висты своеобразно работает с директорией C:\ProgramData\ ... Она считает что туда должен писать только инсталятор, который запущен с админскими правами, а программе туда соваться не к чему. Вероятно, как раз такая ситуация и воспроизвелась. Винда рассматривала запуск программы с админскими правами как инсталятор. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Нет, это не папка с программой, т.е. не Program Files. Майкрософт пишет про CSIDL_COMMON_APPDATA: 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 |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Да, действительно, сейчас C:\Users\All Users является ярлыком на C:\ProgramData\ , значит по идее все верно делается. А если при установке программы добавить полные права группе "Пользователи"? Можно попробовать сначала сделать такое руками. После чего зайти с админскими правами, а затем с правами пользователя?
Ситуация очень похожа на то что винда реализует какую-то правильную логику с назначением прав, но непонятно какую. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
После записи настроек, посмотри какие Windows выставляет права на файл.... Добавлено через 2 минуты и 8 секунд Я думаю, что в первую очередь нужно создавать папку C:\ProgramData\AppName с правами обычного пользователя. Чтобы Windows правильно установила права на запись. |
|||
|
||||
kami |
|
||||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Да, если в явном виде выставить "полный доступ" к папке для простых смертных - то он наследуется и проблем в дальнейшем не наблюдается.
разрешения на запись для "Пользователей" хранятся в "Особых разрешениях", выставлено: "создание файлов/запись данных", "создание папок/дозапись данных", "запись атрибутов", "запись дополнительных атрибутов". Кстати, вот тут тоже засада - при создании файла "от обычного пользователя" права на изменение выставляются только ему, а остальным - ReadOnly.
не помогает. Права на файл, создаваемый "от админа" не наследуют разрешения от папки. |
||||||
|
|||||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
А есть ли возможность принудительно выставить доступ к создаваемому файлу "без ограничений"?
Пробовал так:
В описании SetSecurityDescriptorDACL написано:
Думал, поможет, ан нет - ничего не меняется... |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Тут дело не в Delphi, а в самой ОС.
Так что нужно в другую папку писать или задать вопрос в соответствующем разделе по ОС. |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
В какую, если эта папка как раз предназначена для хранения опций/настроек, независимых от залогиненного пользователя? Не вижу причины писать в раздел MS Windows. Никто ради установки приложения не будет лезть в скрытую ProgramData, искать там нужную подпапку и править вручную права доступа. Тем более - если клиентских машин не один десяток. Нужен именно программный механизм полного доступа к файлу, вне зависимости от залогиненного пользователя. |
|||
|
||||
Frees |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 9 Всего: 54 |
Дело не в папке, а в том что владелец файла администратор и пользователь не может править файл админа. Была такая же проблема, только в InnoSetup, инсталятор запущен от админа и файл потом нельзя было исправить. Решилось установкой прав для всех польлзователей на папку в ProgramData Код в InnoSetup
Можно попробовать сделать что-то подобное из Delphi Это сообщение отредактировал(а) Frees - 9.12.2013, 14:48 -------------------- Кольцов Виктор Владимирович |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Вот вот, последнее решение мне кажется наиболее логичным. Только я бы все же давал разрешения не всем, а только группе пользователи. К примеру, сетевой доступ имеет права гостя, которые не выше чем у пользователя. Главное, раз директория предусматривает общий доступ всех пользователей, то значит выставление таких прав не нарушает идеологию.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
Господа, а если не затруднит - киньте в меня ссылкой, как убрать унаследованные разрешения и заменить их своими на папку/файл? А то мне чегой-то попадается только как это сделать мышкой...
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ну нагуглить несложно. Например
http://www.itlisting.org/5-windows/f2a3a2907d6e33b8.aspx - это для С++ Или для папки но на бейсике http://www.powerbasic.com/support/pbforums...read.php?t=7871 На делфи нашел только код получения привелегий http://www.cyberforum.ru/cpp-builder/thread257643.html Но это просто портированный фрагемент кода из MSDN. Сам такую задачу ни разу не решал. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
||||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Если получиться, запуль сюда примерчик на делфи. Будем ссылаться в следующий раз на эту тему.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |