Inno设置 - 需要特权的安装程序中访问无私人帐户文件夹



我正在使用Inno设置来安装文档/文件而不是应用程序,这主要用于Windows 7用户。因此,我的DestDir基于{userdocs},因此所有文件都将安装在该用户文档库下方的文件夹中。

当我使用同一安装程序安装TTF字体时,出现了问题。这需要提高特权(adminsuperuser)。我看到的问题是,如果非ADMIN用户运行安装,则通过UAC正确提示了Admin/Superuser密码...但是到那时,安装的DestDir更改了" Admin Document"文件夹,而不是用户的文档文件夹。有什么方法可以解决此问题或防止这种情况发生?

示例,非ADMIN帐户Fre有一个文档路径:

C:UsersFredMy Documents

,如果我不包含TTF字体作为安装的一部分,那么安装程序将用作安装{userdocs}的基本路径,并且可以很好地工作。

如果我确实将TTF字体作为安装的一部分,则使用相同的非Admin用户Fred,到达安装完成时,{userdocs}已成为

C:UsersAdminUserMy Documents 

...这不是预期的结果...只需要字体安装件的管理特权,需要安装在实际用户文档区域中的文件。

谢谢。

使用PrivilegesRequired=admin指令为字体创建子安装程序,您将在主非高级安装程序中运行。

主安装程序代码将如下:

[Setup]
PrivilegesRequired=lowest
[Files]
Source: "ttfsetup.exe"; DestDir: {tmp}; Flags: deleteafterinstall
[Run]
Filename: "{tmp}ttfsetup.exe"; Parameters: /silent; StatusMsg: "Installing TTF fonts..."

当然,您应该从主卸载器中卸载子安装程序。

您可能还需要确保,用户没有明确运行具有管理员特权的主安装程序。当用户使用"作为管理员运行"时,请参阅我的答案。

实现此目的的另一种方法是将ShellExec函数与runas动词一起执行高架外部复制实用程序(copyxcopyrobocopy)。请参阅Inno设置 - 注册组件作为管理员(它运行regsvr32,但概念是相同的)。


另一个选项是从高架安装程序中执行一个非高级过程,只是解决了原始用户文档文件夹的路径。

使用ExecAsOriginalUser函数。

您必须通过两个帐户都可以访问的某些临时文件之间的安装程序之间的路径。例如。{commondocs}中的文件,如Inno设置中可以看到的,始终安装到Admin的AppData目录中。

[Files]
Source: "*.txt"; DestDir: "{code:GetUserDocumentsFolder}"
[Code]
var
  UserDocumentsFolder: string;
function GetUserDocumentsFolder(Params: string): string;
begin
  Result := UserDocumentsFolder;
end;
function InitializeSetup(): Boolean;
var
  TempFile: string;
  Code: string;
  Buf: TArrayOfString;
  ResultCode: Integer;
begin
  Result := True;
  TempFile := { some path accessible by both users };
  Code :=
    '[Environment]::GetFolderPath(''MyDocuments'') | ' +
    'Out-File "' + TempFile + '" -Encoding UTF8';
  Log(Format('Executing: %s', [Code]));
  if (not ExecAsOriginalUser('powershell.exe', Code, '', SW_HIDE,
                             ewWaitUntilTerminated, ResultCode)) or
     (ResultCode <> 0) or
     (not LoadStringsFromFile(TempFile, Buf)) then
  begin
    MsgBox('Failed to resolve user MyDocuments path', mbError, MB_OK);
    Result := False;
  end
    else
  begin
    UserDocumentsFolder := Buf[0];
    Log(Format('User Documents path resolved to "%s"', [UserDocumentsFolder]));
  end;
end;

相关讨论:

  • 使用{localappData}登录用户
  • 的Inno设置
  • 当用户使用"运行为管理员"
  • 时,如何用安装程序写入用户的文档目录
  • 只有在需要时才能使Inno设置安装程序请求特权高程
  • Inno设置总是安装到Admin的AppData目录

最新更新