问题描述
我有安装在 C:// ProgramFiles 中的应用程序。我需要对用户组具有完全访问权限的安装目录才能处理应用程序的更新过程(文件下载,移动,删除,写入)。所以我如下更新了inno-script。
[InstallDelete]
Type: filesandordirs; Name: "{app}\assets"; BeforeInstall: TaskKill()
[Dirs]
Name: "{app}\assets"; Permissions: users-full; Flags: uninsalwaysuninstall;
[Files]
; Change file path when necessary
; Service,Launcher,Killer,runtime Binaries
Source: "..\..\_Source\Bin\*"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion;
在 _Source \ Bin 文件夹(包含所有文件的Source文件夹)中,有一些文件和assert文件夹。
问题是,安装没有及时更改用户组的 assert 文件夹权限。 (大多数情况下工作正常)。这是两个有无问题的日志的比较。
请提出任何想法或任何可能的方法来克服此问题。
解决方法
查阅安装程序的日志后,我发现在文件复制时重新创建了授予权限的文件夹。
因此,我决定在安装程序完成后通过执行Windows icacls命令来设置用户权限。因此,我按如下所示更改了脚本,然后按预期工作了。
// Following method will execute to grant user permisions after installation //
procedure PermissionUpdate();
var
ResultCode: integer;
begin
Log(ExpandConstant('Giving user group permission :O - CODE: - ' + ExpandConstant('"{app}/assets" /grant *S-1-5-32-545:(OI)(CI)M /t /c /q')));
if Exec('icacls.exe',ExpandConstant('"{app}/assets" /grant *S-1-5-32-545:(OI)(CI)M /t /c /q'),'',SW_HIDE,ewWaitUntilTerminated,ResultCode) then
begin
Log('Successfully gave user group permission :)' + IntToStr(ResultCode));
end
else begin
Log('Giving user group permission unsuccessfull :(' + IntToStr(ResultCode));
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep=ssInstall) then
begin
if (IsUpgrade()) then
begin
UnInstallOldVersion();
end;
end
else if (CurStep=ssPostInstall) then
begin
PermissionUpdate();
end;
end;
因此,在此修复程序CurStepChanged
中,方法是安装程序的事件处理程序。我使用安装后步骤(CurStep=ssPostInstall
)运行权限更新方法。
在执行icacls
方法时,S-1-5-32-545
是用户组的security identifier。
这可能不是我发布的解决方案,但此修复程序对我有用。