gpt4 book ai didi

inno-setup - 仅在需要时使 Inno Setup 安装程序请求权限提升

转载 作者:行者123 更新时间:2023-12-03 11:01:10 25 4
gpt4 key购买 nike

Inno Setup安装程序有 PrivilegesRequired directive如果需要权限提升,可用于控制安装程序启动时的权限。我希望我的安装程序即使对于非管理员用户也能工作(将我的应用程序安装到用户文件夹没有问题,而不是 Program Files )。所以我设置了PrivilegesRequirednone (无证值(value))。这使得 UAC 提示仅针对管理员用户弹出,因此他们甚至可以安装到 Program Files .非管理员用户没有 UAC 提示,因此即使他们也可以安装应用程序(到用户文件夹)。

但这有一些缺点:

  • 有些人在他们的机器上使用不同的管理员和非管理员帐户,正常使用非管理员帐户。通常,当使用非管理员帐户启动安装时,当他们收到 UAC 提示时,他们会输入管理员帐户的凭据以继续。但这不适用于我的安装程序,因为没有 UAC 提示。
  • (过于可疑)想要安装到用户文件夹的具有管理员帐户的人无法在没有(不需要)管理员权限的情况下启动我的安装程序。

  • 有什么方法可以让 Inno Setup 仅在需要时才请求权限提升(当用户选择只能由管理员帐户写入的安装文件夹时)?

    我认为 Inno Setup 中没有对此进行设置。但可能有一个编程解决方案(Inno Setup Pascal 脚本)或某种插件/DLL。

    请注意,Inno Setup 6 内置了对 non-administrative install mode 的支持。 .

    最佳答案

    Inno Setup 6 内置支持 non-administrative install mode .
    基本上,您可以简单地设置 PrivilegesRequiredOverridesAllowed :

    [Setup]
    PrivilegesRequiredOverridesAllowed=commandline dialog
    enter image description here

    以下是我针对 Inno Setup 5 的(现已过时)解决方案,基于 @TLama's answer .
    当设置以非提升方式启动时,它将请求提升,但有一些异常(exception):
  • 仅适用于 Windows Vista 和更新版本(尽管它也适用于 Windows XP)
  • 升级时,安装程​​序将检查当前用户是否对以前的安装位置具有写入权限。如果用户具有写入权限,则设置不会请求提升。因此,如果用户之前已将应用程序安装到用户文件夹,则升级时不会请求提升。

  • 如果用户拒绝新安装的提升,安装程序将自动回退到“本地应用程序数据”文件夹。 IE。 C:\Users\standard\AppData\Local\AppName .
    其他改进:
  • 提升的实例不会再次要求语言
  • 通过使用 PrivilegesRequired=none ,安装程序会将卸载信息写入 HKLM ,当升高时,不至 HKCU .

  • #define AppId "myapp"
    #define AppName "MyApp"

    #define InnoSetupReg \
    "Software\Microsoft\Windows\CurrentVersion\Uninstall\" + AppId + "_is1"
    #define InnoSetupAppPathReg "Inno Setup: App Path"

    [Setup]
    AppId={#AppId}
    PrivilegesRequired=none
    ...

    [Code]

    function IsWinVista: Boolean;
    begin
    Result := (GetWindowsVersion >= $06000000);
    end;

    function HaveWriteAccessToApp: Boolean;
    var
    FileName: string;
    begin
    FileName := AddBackslash(WizardDirValue) + 'writetest.tmp';
    Result := SaveStringToFile(FileName, 'test', False);
    if Result then
    begin
    Log(Format(
    'Have write access to the last installation path [%s]', [WizardDirValue]));
    DeleteFile(FileName);
    end
    else
    begin
    Log(Format('Does not have write access to the last installation path [%s]', [
    WizardDirValue]));
    end;
    end;

    procedure ExitProcess(uExitCode: UINT);
    external 'ExitProcess@kernel32.dll stdcall';
    function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
    lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
    external 'ShellExecuteW@shell32.dll stdcall';

    function Elevate: Boolean;
    var
    I: Integer;
    RetVal: Integer;
    Params: string;
    S: string;
    begin
    { Collect current instance parameters }
    for I := 1 to ParamCount do
    begin
    S := ParamStr(I);
    { Unique log file name for the elevated instance }
    if CompareText(Copy(S, 1, 5), '/LOG=') = 0 then
    begin
    S := S + '-elevated';
    end;
    { Do not pass our /SL5 switch }
    if CompareText(Copy(S, 1, 5), '/SL5=') <> 0 then
    begin
    Params := Params + AddQuotes(S) + ' ';
    end;
    end;

    { ... and add selected language }
    Params := Params + '/LANG=' + ActiveLanguage;

    Log(Format('Elevating setup with parameters [%s]', [Params]));
    RetVal :=
    ShellExecute(0, 'runas', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
    Log(Format('Running elevated setup returned [%d]', [RetVal]));
    Result := (RetVal > 32);
    { if elevated executing of this setup succeeded, then... }
    if Result then
    begin
    Log('Elevation succeeded');
    { exit this non-elevated setup instance }
    ExitProcess(0);
    end
    else
    begin
    Log(Format('Elevation failed [%s]', [SysErrorMessage(RetVal)]));
    end;
    end;

    procedure InitializeWizard;
    var
    S: string;
    Upgrade: Boolean;
    begin
    Upgrade :=
    RegQueryStringValue(HKLM, '{#InnoSetupReg}', '{#InnoSetupAppPathReg}', S) or
    RegQueryStringValue(HKCU, '{#InnoSetupReg}', '{#InnoSetupAppPathReg}', S);

    { elevate }

    if not IsWinVista then
    begin
    Log(Format('This version of Windows [%x] does not support elevation', [
    GetWindowsVersion]));
    end
    else
    if IsAdminLoggedOn then
    begin
    Log('Running elevated');
    end
    else
    begin
    Log('Running non-elevated');
    if Upgrade then
    begin
    if not HaveWriteAccessToApp then
    begin
    Elevate;
    end;
    end
    else
    begin
    if not Elevate then
    begin
    WizardForm.DirEdit.Text := ExpandConstant('{localappdata}\{#AppName}');
    Log(Format('Falling back to local application user folder [%s]', [
    WizardForm.DirEdit.Text]));
    end;
    end;
    end;
    end;

    关于inno-setup - 仅在需要时使 Inno Setup 安装程序请求权限提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21556853/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com