Inno Setup позволяет устанавливать разрешения только в разделах [Files] [Dirs] и [Registry], и вам придется как-то их использовать. Вот 2 решения этой проблемы. Оба хороши, но у каждого есть небольшой недостаток.
Решение № 1: Установить разрешение для всего каталога
[Dirs]
Name: {commonappdata}\MyCompany; Permissions:everyone-modify
[INI]
Filename: {commonappdata}\MyCompany\MyProg.ini; Section: "SomeSection"; Key: "SomeKey"; String: "SomeValue"
Это отличное решение, если вы не возражаете против изменения разрешений всего каталога. Я возражал и придумал второе решение.
Решение № 2: Создайте свой файл .ini в {tmp} и скопируйте его в раздел [Files]:
#define TargetIniDir "{commonappdata}\MyCompany"
#define TargetIniName "MyProg.ini"
....
[Files]
Source: {tmp}\{#TargetIniName}; DestDir: {#TargetIniDir}; Flags:external; Permissions: users-modify;
....
[Code]
procedure PrepareIniFileForCopy(section, key, value, iniFileTemp, iniFileTarget:String);
begin
if FileExists(iniFileTarget) then
FileCopy(iniFileTarget, iniFileTemp, False);
SetIniString(section, key, value, iniFileTemp);
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
iniFile, iniFileTemp:String;
begin
if CurStep=ssInstall then begin
PrepareIniFileForCopy('SomeSection', 'SomeKey', 'SomeValue', ExpandConstant('{tmp}\{#TargetIniName}'), ExpandConstant('{#TargetIniDir}\{#TargetIniName}'));
end;
end;
Это создаст ваш файл .ini в каталоге {tmp} (который будет удален после завершения установки), а затем скопирован в раздел [Files] в нужный каталог commondata с необходимыми разрешениями.
Обратите внимание на флаг external в разделе [Files], который означает, что файл не упакован в настройку во время компиляции, а динамически выполняется во время установки. Также обратите внимание, что создание временного файла должно быть сделано до установки (CurStep = ssInstall означает непосредственно перед установкой).
Я думаю, это решение хорошо, но не очень красиво. Вы разделяете свою операцию на два разных места, которые полагаются на то, что одно выполняется раньше другого.
Оба решения могут добавлять значения к существующим файлам .ini, а не просто создавать новые.