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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с правами доступа при пользователе-админе 
:(
    Опции темы
GrigoriyFomin
Дата 17.1.2012, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

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



Возникла роблема с приложением. Сохраняю глобальные параметры программы в папке следующим образом:

Код

function GetAllUsersDir: string;
var
  i: integer;
begin
  setlength(result, MAX_PATH);
  SHGetFolderPath(0, CSIDL_COMMON_APPDATA + CSIDL_FLAG_CREATE, 0, 0, pchar(result));
  i := Pos(#0, result);
  if i > 0 then setlength(result, pred(i));

  result := IncludeTrailingPathDelimiter(result);
end;

function getinifname: string;
begin
  ForceDirectories(GetAllUsersDir + 'Firma\Soft\');
  result := GetAllUsersDir + 'Firma\Soft\applic.ini';
end;


  ini := TIniFile.Create(getinifname);
  try
    ini.WriteBool('Updates', 'CheckUpdateEXE', True);
    begin
//////////////////////
    end;
  finally
    FreeAndNil(ini);
  end;




На некоторых машинах при запуске с правами админа выдает ошибку, что не могу писать в файл. Лечится ручной установкой прав полного доступа для всех на нужную папку с файлом настройки, но это имхо некошерно. Можно как-то автоматом задавать права для нужной папки или программно проверять, что в папку записать файл не удасться? 
PM MAIL   Вверх
CodeMonkey
Дата 18.1.2012, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Это - неправильное решение.

Правильное решение:
1. Хранить конфигурацию в %UserName%\AppData.
2. Если первый запуск и конфигурации ещё нет - то её можно взять с AllUsers (только чтение).
3. В AllUsers мастер-копию настроек пишет установщик программы.

Добавлено через 1 минуту и 46 секунд
Цитата
некоторых машинах при запуске с правами админа выдает ошибку, что не могу писать в файл


На Vista+ программа может быть запущена из-под ограниченного маркера административной учётной записи.

Цитата
Можно как-то автоматом задавать права для нужной папки


Можно, но не нужно.

Цитата
программно проверять, что в папку записать файл не удасться?


Можно, но не нужно.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
GrigoriyFomin
Дата 18.1.2012, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 16.11.2010

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



Фишка в том, что в файл настройки пишется информация (регистрационная) при первом запуске программы, инсталлятор на тот момент этого файла еще не имеет.
И какой тогда по мнению мйкрософта "правильный" путь сохранения глобальных настроек программы?
PM MAIL   Вверх
Keeper89
Дата 19.1.2012, 03:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 14
Всего: 58



До появления инсталлятора сделать это можно вручную.


--------------------
PM MAIL WWW   Вверх
CodeMonkey
Дата 19.1.2012, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



Цитата
инсталлятор на тот момент этого файла еще не имеет


А кто это делает? По идее, как я это вижу, должна быть программа-регистратор. Типа, Register.exe. При запуске она показывает формочку, туда вводишь свои данные, она их проверяет (при необходимости - через интернет), и сохраняет в файл в AllUsers.

Чтобы это работало программа должна запускаться равно как и установщик - под администратором. 

Это означает, что:
1. Она должна явно проверить, что её запустил администратор. Если нет - сказать пользователю "запусти под админом" (либо спросить логин/пароль и перезапустится сама, но это уже высший пилотаж).
2. У неё на борту должен быть манифест UAC с requireAdministrator.
3. Она должна распознавать ситуацию "нет прав доступа" к папке \файлу в AllUsers и показывать пользователю сообщение.

Тогда операция записи будет успешна для любых систем (от Windows 2000 до Winodws 7), а в случае неудачи (редкий случай) - пользователь сможет понять, что не так.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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