1

Тема: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Зіткнувся з такою проблемою у Winows 7: не вдається створити каталог всередині системних папок Windows - відсутній доступ. Навіть якщо запускаю програму від імені адміністратора. Пробував різними способами: традиційною процедурою MkDir('папка'), спробував запуском Exec('mkdir','каталог') - але виявилося що внутрішні команди так виконати неможливо (до речі, а як запускати внутрішні команди операційної системи із своєї програми ?), потім Exec('createdir.bat',' '), де в зовнішньому файлі createdir.bat була прописана команда "mkdir папака".
В останній спробі все запустилося, але теж виникли проблеми з доступом.
І це все при тому, що виконання команди "mkdir папака" вручну з командного рядка або запуск createdir.bat створює потрібну папку без проблем.
Рішення якесь повинно бути, адже той самий Total Commander чи FAR якось виконує таку задачу.
А от під Windows XP все працює.

2

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

mkdir - це команда консольного інтерпретатора, а не ОС, тому запускати треба так:

cmd /c ^"mkdir ^"c:\my test\^"^"

Але це навряд вам допоможе, бо ви схоже якось не правильно запускаєте свою програму з правами адміністратора. Спробуйте додати в неї маніфест: https://uk.wikipedia.org/wiki/%D0%9C%D0 … %B9%D0%BB) Ось тут іще стара моя стаття, на жаль російською: https://habr.com/post/230505/

Подякували: leofun01, hadeix2

3

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Torbins написав:

mkdir - це команда консольного інтерпретатора, а не ОС, тому запускати треба так:

cmd /c ^"mkdir ^"c:\my test\^"^"

Дякую за підказку про запуск команд консольного інтерпретатора (в часи MSDOS такі команди називали "внутрішніми" командами ОС). Це питання закривається.
Запускав з "Провідника", вибравши у властивостях "Запуск від імені Адміністратора".
Код (умисно пробував створити теку в "забороненому" каталозі):

program tesdir;
uses dos,crt;
BEGIN
{$I-}
Exec('cmd','/c ^mkdir c:\Windows\System32\TEST_DIR^');
 Writeln(DOSError);
 Writeln(IOResult);
 ReadKey;
END.

В результаті отримую повідомлення що "підпапка або файл c:\Windows\System32\TEST_DIR вже існує", хоча вона відсутня. Цікаво що DOSError та IOResult нульові.
В "дозволених" місцях створюється без проблем.

4

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Спробував присобачити до програми маніфест, але компілятор лається ...
Створив за допомогою ResEdit файл TEST.res такого змісту:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Хотів включити його у тілі програми директивою {$R TEST.res}, але при компіляції отримую помилку:
"Error while compiling resources".
Як причепити маніфест у Free Pascal, і якого формату він повинен бути ?

5

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Якщо у вас Лазарус хоча б версії 1.6, то там просто в налаштуваннях проекту виберіть requireAdministrator. Потрібний маніфест він згенерує автоматично.

Подякували: hadeix1

6

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Я користуюся звичайнісіньким Free Pascal IDE, але завантажив і встановив свіжий Lazarus 1.8.4 (цікава штука).
Увімкнув в налаштуваннях проекту використання маніфесту, вказав рівень виконання requaireAdministrator, запускаю програму від імені адміністратора, але всеодно результат аналогічний попереднім :(

7

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Закиньте цю програму сюди на форум, я у себе у віртуалці спробую. Бо то може ваш антивірус їй заважає.

8 Востаннє редагувалося hadeix (16.12.2018 00:18:57)

Re: Free Pascal. Створення каталогів (папок) під Windows 7 і вище.

Torbins написав:

Закиньте цю програму сюди на форум, я у себе у віртуалці спробую. Бо то може ваш антивірус їй заважає.

На антивірус (Avast) я теж грішив і вимикав його ...
Вихідний текст наведено трішки вище, але для зручності проведення експериментів я його допрацював, програма пробує створити каталог TEST_DIR  по шляху C:\Windows\System32 двома способами -- штатною процедурою pascal MkDir, та шляхом виконання команди mkdir інтерпретатора cmd. І в обох випадках безрезультатно. Цікаво що з командного інтерпретатора, запущеного із правами звичайного юзера, каталог створюється без проблем. Вихідний код:

program tesdir;
uses dos,crt;
var
 curdir:string;
 iores,doserr:integer;

procedure WriteError;
Begin
 Writeln('DOSError:  ',doserr);
 Writeln('IOResult:  ',iores,#13,#10);
End;

{$R *.res}

BEGIN
{$I-}
 ClrScr;
 Writeln('Directory change ...');
 ChDir('C:\Windows\System32');
 iores:=IOResult; doserr:=DOSError; WriteError;
 GetDir(3,curdir); Writeln('Current dir: ',curdir);
 Writeln('Directory creation attempt one ...');
 MkDir('TEST_DIR');
 iores:=IOResult; doserr:=DOSError; WriteError;
 Writeln('Press any key to try two');
 ReadKey; 
 Writeln('Directory creation attempt two ...');
 Exec('cmd','/c ^mkdir c:\Windows\System32\TEST_DIR^');
 iores:=IOResult; doserr:=DOSError; WriteError;
 Writeln('Press any key for exit');
 ReadKey;
END.

Архів з готовим exe для аттачмента не можу закинути - виникає помилка: "Сервер не зміг зберегти завантажений на форум файл ..."