Не работает Reset(F) без прав админа

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не работает Reset(F) без прав админа

Сообщение tria » 20.10.2018 00:02:14

При попытке чтения файла в директории ProgramFiles (где находится ехе) выдает ошибку File not open.
С правами Админа - все работает.
Виндоуз 10
Лазарь 1.6.4
В 1.4.4 этот код работал
Код: Выделить всё
 
  FileMode := fmOpenRead;
  AssignFile(F, _LangFile);
  try
    Reset(F);
  except
    on E: Exception do begin
      ShowMessage(E.Message);

      //ShowMessage('Can not open file '+_LangFile+' Error N '+IntToStr(IOResult));
      //Halt;
    end;
  end;
tria
постоялец
 
Сообщения: 365
Зарегистрирован: 03.04.2006 11:24:10

Re: Не работает Reset(F) без прав админа

Сообщение SSerge » 20.10.2018 04:43:50

Дык, 1.6.4 - релиз начала 2017-го года. На нынешний момент чертовски как актуален со своими багами, когда торжественно корячится релиз кандидат 2.0.

А вообще дело скорее всего не в релизе лазаруса, а в том что когда-то операционная система позволяла чтение файлов этого каталога непривелигированным программам, а сейчас политика доступа поменялась. Ибо святое правило разграничения доступа - не открывай файлов в Program Files и не делай их там - пресекут и выкинут - еще с Висты ненавязчиво демонстрировалось.

и да, ваш код в принципе не имеет отношения к лазарусу - у вас i/o старого интерфейса рунтайма fpc. Разве что имя где-то там от vcl получаете, о чем приведенный код вообще не говорит.
SSerge
энтузиаст
 
Сообщения: 842
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Не работает Reset(F) без прав админа

Сообщение Снег Север » 20.10.2018 14:29:31

Для вин 10 - норма, без прав админа в ProgramFiles делать нечего. Для хранения настроек есть другие места.
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 1221
Зарегистрирован: 27.11.2007 16:14:47

Re: Не работает Reset(F) без прав админа

Сообщение runewalsh » 20.10.2018 20:48:01

Сейчас подумал, а что если сделать fmOpenRead or fmShareDenyNone?
Право на чтение должно быть (если бы из собственного каталога нельзя было читать, программа не смогла бы прочитать сама себя), а вот как защиту от DoS-атаки вполне могли сделать запрет на эксклюзивное открытие.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 411
Зарегистрирован: 27.04.2010 00:15:25

Re: Не работает Reset(F) без прав админа

Сообщение tria » 21.10.2018 10:08:50

Снег Север писал(а):Для вин 10 - норма, без прав админа в ProgramFiles делать нечего. Для хранения настроек есть другие места.

Это не файл настроек, в него ничего не пишется. Это файл, содержащий необходимую для работы программы информацию.

runewalsh писал(а):Сейчас подумал, а что если сделать fmOpenRead or fmShareDenyNone?

Спасибо за идею. Попробовал. Результат тот же.

Да, согласен, что вопрос по фрипаскалю, просто по привычке пишу сюда :)

Добавлено спустя 12 минут 50 секунд:
SSerge писал(а):Дык, 1.6.4 - релиз начала 2017-го года. На нынешний момент чертовски как актуален со своими багами, когда торжественно корячится релиз кандидат 2.0.

А вообще дело скорее всего не в релизе лазаруса, а в том что когда-то операционная система позволяла чтение файлов этого каталога непривелигированным программам, а сейчас политика доступа поменялась. Ибо святое правило разграничения доступа - не открывай файлов в Program Files и не делай их там - пресекут и выкинут - еще с Висты ненавязчиво демонстрировалось


Если не Program files, то где держать доп. информацию?
Открыл директорию MSOffice. Куча разного рода файликов - звуков, каринок и т.п.
MS противоречит сама себе?
tria
постоялец
 
Сообщения: 365
Зарегистрирован: 03.04.2006 11:24:10

Re: Не работает Reset(F) без прав админа

Сообщение Alex2013 » 21.10.2018 12:07:12

SSerge писал(а):Дык, 1.6.4 - релиз начала 2017-го года.

Подтверждаю! Релиз 1.6.4 местами глючит совершенно не понятно .(например на прошлой неделе собирал свой проект именно на случайно застрявшем на планшете 1.6.4 - результат реакция на колесико мыши куда-то внезапно пропала! ... на старом транаковом 1.7 и нынешнем релизе 1.8.4 все ок )
Alex2013
энтузиаст
 
Сообщения: 1045
Зарегистрирован: 03.04.2013 11:59:44

Re: Не работает Reset(F) без прав админа

Сообщение tria » 30.10.2018 10:43:58

Скомпилил под 1.8.4 - ошибка осталась.
tria
постоялец
 
Сообщения: 365
Зарегистрирован: 03.04.2006 11:24:10

Re: Не работает Reset(F) без прав админа

Сообщение SSerge » 30.10.2018 11:54:37

А что у нас говорит FileExists(_LangFile);

...ибо повторюсь еще раз - лазарус как таковой не при чем.
Источник происхождения содержимого переменной _LangFile озвучьте пожалуйста. И содержимое этой переменной, выданное в вашем exception (строка, которую вы зачем-то закомментили). И, кстати, не мешает до кучи еще и код IOResult увидеть.
SSerge
энтузиаст
 
Сообщения: 842
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Не работает Reset(F) без прав админа

Сообщение tria » 30.10.2018 21:46:19

FilExists()=true
IOResult=0
Переменная _LangFile = переменная1+ строковая константа (поддиректория и имя файла) + переменная 2.
Переменная 1- extractFilePath(Application.ExeName)
Переменная 2 - из константы
tria
постоялец
 
Сообщения: 365
Зарегистрирован: 03.04.2006 11:24:10

Re: Не работает Reset(F) без прав админа

Сообщение SSerge » 31.10.2018 05:20:36

tria писал(а):(поддиректория и имя файла)


угу, значит все таки субфольдер...
Ну так права на его и его файлы смотрите, если уж совсем по-колхозному - зайти из под проблемного пользователя и проверить, открывается или нет на чтение каким-нибудь редактором типа WordPada. А вообще, если файл или поддиректория создавались в привилегированных папках каким-то пользователем, то им могут при этом процессе прилететь эксклюзивные права собственничества от этого пользователя - с запретам доступа всем иным, кроме админа и системы. Особенно в Program Files. Там емнип по политикам безопасности у вновь создаваемых объектов возможно атрибуты не наследуются из предыдущего контейнера.
SSerge
энтузиаст
 
Сообщения: 842
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Не работает Reset(F) без прав админа

Сообщение tria » 05.11.2018 22:53:47

Разобрался.
Ранее был код, определяющий, есть ли право на запись файла:
Код: Выделить всё
  {$I-}
  OldFileMode:=Filemode;
  Filemode:=fmOpenReadWrite;
  If FileExists(fName) Then begin
    NeedDel:=False;
    Reset(f);
  end
  else begin
    NeedDel:=True;
    Rewrite(f);
  end;

  //2:'файл не найден';     3:'Путь не найден';     5:'Доступ запрещен';
  //ShowMessage(IntToStr(IOResult));
  If IoResult=5 Then
              Result:=False;

  if IOResult=0 then begin
    Close(f);
    If NeedDel Then DeleteFile(fName);
  end;
  {$I+}
  FileMode:=OldFilemode;


в результате выполнялось Close(f), даже если файл небыл открыт. В последствии, выдавало ошибку в коде в верхнем посте.
В старых версиях Лазаруса это работало.
Это две разные процедуры и разные переменные f.
tria
постоялец
 
Сообщения: 365
Зарегистрирован: 03.04.2006 11:24:10


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 7

Рейтинг@Mail.ru