代码之家  ›  专栏  ›  技术社区  ›  Adam

Windows 7 UAC自动更新应用程序

  •  1
  • Adam  · 技术社区  · 15 年前

    我们有一个应用程序套件,我们通过自制的“自动更新”应用程序进行更新。此应用程序基本上连接到我们的“更新服务器”,并下载文件以覆盖、更新,甚至将新功能/应用程序添加到我们的应用程序套件中。但是,这在UAC中并不适用。我们的自动更新应用程序是一个命令行.NET应用程序,它通过HKLM\Software\Microsoft\Windows\CurrentVersion\Run注册表项启动。

    以下是 不 选项:

    2。使用ClickOnce-不支持我们的需求(这就是为什么我们要国产)

    非常感谢。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Martin v. Löwis    15 年前

    您可以在 application manifest . 如果指定requireAdministrator,它将调用UAC,除非计算机策略阻止UAC提示。

        2
  •  3
  •   Kate Gregory    15 年前

    你领先于游戏,因为你的更新程序是一个单独的exe。除了按照@Martin的建议在上面放置清单之外,理想情况下,您还可以更改主应用程序的UI。要么启用一个按钮/菜单项,上面写着“应用更新”,要么弹出一个模式界面,上面写着“强制更新准备就绪,单击“确定”继续”。然后在按钮或菜单项或模式用户界面的“确定”上, decorate with a shield . 这提醒用户他们将得到一个UAC提示。

    UAC prompt

    很有可能这个未经请求的UAC提示不会得到用户的同意。所以改变你的用户界面向他们解释是一个更好的方法。

        3
  •  2
  •   Ian Boyd    15 年前

    理想情况下,您可以使用MSI作为安装程序/更新程序-它知道是否/如何提升。

    ShellExecute 具有管理权限的更新程序:

    RunAsAsAdmin("C:\Users\Adam\AppData\Temp\ISW-1864.exe");
    

    在哪里? RunAsAdmin

    function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean;
    {
        See Step 3: Redesign for UAC Compatibility (UAC)
        http://msdn.microsoft.com/en-us/library/bb756922.aspx
    }
    var
        sei: TShellExecuteInfo;
    begin
        ZeroMemory(@sei, SizeOf(sei));
        sei.cbSize := SizeOf(TShellExecuteInfo);
        sei.Wnd := hwnd;
        sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
        sei.lpVerb := PChar('runas');
        sei.lpFile := PChar(Filename); // PAnsiChar;
        if parameters <> '' then
            sei.lpParameters := PChar(parameters); // PAnsiChar;
        sei.nShow := SW_SHOWNORMAL; //Integer;
    
        Result := ShellExecuteEx(@sei);
    end;
    
    推荐文章