Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись файла "от обычного пользователя", даже если exe запущен "от админа" 
V
    Опции темы
kami
Дата 5.12.2013, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Доброго времени суток, уважаемые!

Возможно, я решил пойти не в том направлении для решения проблемы, посему - лучше опишу, что случилось:

Есть приложение, которое хранит... пусть будет "текущие настройки" в файле на C:\ProgramData\AppName\options.bin и по необходимости перезаписывает его.

Всё идет хорошо до тех пор, пока пользователь не запустит приложение (имеется ввиду первый запуск) "от администратора". При сохранении настроек "из-под админа" для обычных пользователей права на файл автоматом выставляются в ReadOnly, соответственно - все последующие запуски от обычных пользователей настройки не сохраняются и приложение вылетает.


Код простой (в этом примере поленился "правильно" получить путь CSIDL_COMMON_APPDATA):
Код

procedure TForm4.Form4OnCreate(Sender: TObject);
var
  FileName: string;
  FS: TFileStream;
begin
  FileName:='c:\ProgramData\SomeApp\options.bin';
  ForceDirectories(ExtractFileDir(FileName));
  FS:=TFileStream.Create(FileName, fmCreate);
  FS.Free;
end;

Порядок использования:
После компиляции первый запуск в обязательном порядке провести с повышением прав (т.е. не из-под IDE, если она не "от админа")
Все последующие запуски от обычного пользователя - сразу Access Denied.

Как быть?

P.S. Целевая ОС = Win7
PM MAIL WWW   Вверх
Alexeis
Дата 5.12.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(kami @  5.12.2013,  17:15 Найти цитируемый пост)
Есть приложение, которое хранит... пусть будет "текущие настройки" в файле на C:\ProgramData\AppName\options.bin и по необходимости перезаписывает его.

  Я думаю что проблема именно в этом, что настройки хранятся в папке с программой. Если их хранить в поддиректории APPDATA, они будут разные для всех пользователей. Насколько я помню есть еще директория C:\Users\All Users , в том случае если настройки должны быть одинаковыми для всех пользователей. Винда начиная с висты своеобразно работает с директорией C:\ProgramData\ ... Она считает что туда должен писать только инсталятор, который запущен с админскими правами, а программе туда соваться не к чему. Вероятно, как раз такая ситуация и воспроизвелась. Винда рассматривала запуск программы с админскими правами как инсталятор. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kami
Дата 5.12.2013, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Alexeis @  5.12.2013,  17:43 Найти цитируемый пост)
 Я думаю что проблема именно в этом, что настройки хранятся в папке с программой. 

Нет, это не папка с программой, т.е. не 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, то всё нормально. Иначе - атрибуты безопасности блокируют обычным пользователям запись в этот файл.
PM MAIL WWW   Вверх
Alexeis
Дата 5.12.2013, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Да, действительно, сейчас C:\Users\All Users является ярлыком на C:\ProgramData\ , значит по идее все верно делается. А если при установке программы добавить полные права группе "Пользователи"? Можно попробовать сначала сделать такое руками. После чего зайти с админскими правами, а затем с правами пользователя? 
  Ситуация очень похожа на то что винда реализует какую-то правильную логику с назначением прав, но непонятно какую.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 7.12.2013, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(kami @  5.12.2013,  16:15 Найти цитируемый пост)
 первый запуск) "от администратора". 


После записи настроек, посмотри какие Windows выставляет права на файл....

Добавлено через 2 минуты и 8 секунд
Я думаю, что в первую очередь нужно создавать папку  C:\ProgramData\AppName с правами обычного пользователя. Чтобы Windows правильно установила права на запись.
PM MAIL   Вверх
kami
Дата 7.12.2013, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Alexeis @  5.12.2013,  18:06 Найти цитируемый пост)
А если при установке программы добавить полные права группе "Пользователи"?

Да, если в явном виде выставить "полный доступ" к папке для простых смертных - то он наследуется и проблем в дальнейшем не наблюдается.

Цитата(Akella @  7.12.2013,  12:35 Найти цитируемый пост)
После записи настроек, посмотри какие Windows выставляет права на файл....

разрешения на запись для "Пользователей" хранятся в "Особых разрешениях", выставлено: "создание файлов/запись данных", "создание папок/дозапись данных", "запись атрибутов", "запись дополнительных атрибутов". Кстати, вот тут тоже засада - при создании файла "от обычного пользователя" права на изменение выставляются только ему, а остальным - ReadOnly.
Цитата(Akella @  7.12.2013,  12:35 Найти цитируемый пост)
Я думаю, что в первую очередь нужно создавать папку  C:\ProgramData\AppName с правами обычного пользователя. Чтобы Windows правильно установила права на запись.

не помогает. Права на файл, создаваемый "от админа" не наследуют разрешения от папки.
PM MAIL WWW   Вверх
kami
Дата 7.12.2013, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



А есть ли возможность принудительно выставить доступ к создаваемому файлу "без ограничений"?

Пробовал так:
Код

var
  FileHandle: THandle;
  sa: TSecurityAttributes;
  sd: TSecurityDescriptor;
begin
  InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDACL(@sd, True, nil, True);

  sa.lpSecurityDescriptor := @sd;
  sa.nLength := SizeOf(TSecurityAttributes);
  sa.bInheritHandle := False;
  ...
  FileHandle:=CreateFile(@FileName[1], FILE_GENERIC_READ or FILE_GENERIC_WRITE, 0, @sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);


В описании SetSecurityDescriptorDACL написано:
Цитата

pDacl [in, optional]
...If this parameter is NULL, a NULL DACL is assigned to the security descriptor, which allows all access to the object. The DACL is referenced by, not copied into, the security descriptor.

Думал, поможет, ан нет - ничего не меняется...
PM MAIL WWW   Вверх
Akella
Дата 9.12.2013, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Тут дело не в Delphi, а в самой ОС.
Так что нужно в другую папку писать или задать вопрос в соответствующем разделе по ОС.
PM MAIL   Вверх
kami
Дата 9.12.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Akella @  9.12.2013,  12:33 Найти цитируемый пост)
Так что нужно в другую папку писать

В какую, если эта папка как раз предназначена для хранения опций/настроек, независимых от залогиненного пользователя?


Цитата(Akella @  9.12.2013,  12:33 Найти цитируемый пост)
или задать вопрос в соответствующем разделе по ОС.

Не вижу причины писать в раздел MS Windows. Никто ради установки приложения не будет лезть в скрытую ProgramData, искать там нужную подпапку и править вручную права доступа. Тем более - если клиентских машин не один десяток.
Нужен именно программный механизм полного доступа к файлу, вне зависимости от залогиненного пользователя.
PM MAIL WWW   Вверх
Frees
Дата 9.12.2013, 14:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(Akella @  9.12.2013,  15:33 Найти цитируемый пост)
Так что нужно в другую папку писать или задать вопрос в соответствующем разделе по ОС.

Дело не в папке, а в том что владелец файла администратор и пользователь не может править файл админа.

Была такая же проблема, только в InnoSetup, инсталятор запущен от админа и файл потом нельзя было исправить.

Решилось установкой прав для всех польлзователей на папку в ProgramData

Код в InnoSetup
Код

[Dirs]  
Name: "{commonappdata}\CompanyName\ProductName"; Permissions: everyone-modify;  


Можно попробовать сделать что-то подобное из Delphi

Это сообщение отредактировал(а) Frees - 9.12.2013, 14:48


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Alexeis
Дата 9.12.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kami
Дата 10.12.2013, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Господа, а если не затруднит - киньте в меня ссылкой, как убрать унаследованные разрешения и заменить их своими на папку/файл? А то мне чегой-то попадается только как это сделать мышкой...
PM MAIL WWW   Вверх
Alexeis
Дата 10.12.2013, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 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 вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
kami
Дата 10.12.2013, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(Alexeis @  10.12.2013,  09:56 Найти цитируемый пост)
это для С++

Да без разницы - главное, что не на .Net, а то там бывают такие конструкции, к которым сложновасто подобрать WinAPI функции.

Буду пробовать.
Всем спасибо, тему можно считать закрытой, ибо направление получено.
PM MAIL WWW   Вверх
Alexeis
Дата 10.12.2013, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Если получиться, запуль сюда примерчик на делфи. Будем ссылаться в следующий раз на эту тему. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.