我正在使用Inno设置来安装文档/文件而不是应用程序,这主要用于Windows 7用户。因此,我的DestDir
基于{userdocs}
,因此所有文件都将安装在该用户文档库下方的文件夹中。
当我使用同一安装程序安装TTF字体时,出现了问题。这需要提高特权(admin
或superuser
)。我看到的问题是,如果非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
动词一起执行高架外部复制实用程序(copy
,xcopy
,robocopy
)。请参阅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目录