7

我有一个程序需要在安装时在我的文档目录中创建文件。这是一个严格的固定要求,没有改变这一点。问题是如果用户在安装文件上“以管理员身份运行”,innosetups 常量 {userdocs} 指向管理员的文档目录,而不是原始登录用户。

所以,谷歌搜索并发现了这个:

在 Windows Vista/7 上通过 Inno Setup 将文件安装到原始用户的 My Docs 文件夹

然而,答案是错误的,因为 innosetup 甚至指出

如果用户通过右键单击其 EXE 文件并选择“以管理员身份运行”来启动安装程序,那么不幸的是,此标志将不起作用,因为安装程序没有机会使用原始用户凭据运行任何代码。如果安装程序是从已经提升的进程启动的,情况也是如此。但是请注意,这不是 Inno Setup 特定的限制;在这种情况下,基于 Windows Installer 的安装程序也无法返回原始用户凭据。

我想我可以鼓励用户不要使用以管理员身份运行,但我不知道如何防止他不升职。

我正在考虑让程序本身在第一次运行时(安装后)设置 My Documents\Program 名称目录。这种解决方法会奏效吗?它必须以潜在受限用户的身份从其程序文件目录中复制文件。有可能还是我会遇到特权问题?

4

3 回答 3

6

原始答案是有效的,但不推荐。运行安装程序时,RunAsOriginalUser将以当前登录 Windows 的用户身份运行。这是通过让安装程序的一部分不提升运行,然后运行另一个提升的副本来执行实际安装来完成的。

当用户明确执行“以管理员身份运行”时,“未提升的存根”也会运行提升,在这种情况下,安装程序无法访问原始用户,因为该信息已被替换。

公认的做法是按照您的建议在应用程序本身中执行任何配置文件特定工作,这也意味着它将适用于其他用户和 pre Vista 中的 LUA 环境(您将遇到与您看到的完全相同的情况现在)。

于 2012-05-10T10:38:46.140 回答
1

首先,通过设置确保安装程序不需要自行提升权限PrivilegesRequired=lowest

[Setup]
PrivilegesRequired=lowest

要中止安装程序,当安装程序由用户明确运行“以管理员身份”运行时,在 Windows Vista 和更早版本上,使用以下IsAdmin功能(或IsAdminInstallModeIsAdminLoggedOn[在旧版本中])InitializeSetup

[Code]

function InitializeSetup(): Boolean;
begin
  Result := True;

  if (GetWindowsVersion >= $05010000) and
     IsAdmin then
  begin
    MsgBox('Do not run this installer "As Administrator".', mbError, MB_OK);
    Result := False;
  end;
end;

有关该主题的更多讨论,请参阅通过 Windows Vista/7 上的 Inno Setup 将文件安装到原始用户的 My Docs 文件夹

于 2017-04-20T07:06:17.280 回答
0

本文可能会为您提供有关如何解决海拔高度的一些指导,

http://www.codeproject.com/Articles/18946/High-elevation-can-be-bad-for-your-application-How

一般来说,它使您有机会在安装结束时执行可执行文件(在“我的文档”下创建文件)而无需提升。

于 2012-05-10T05:32:44.227 回答