【问题标题】:Windows 7 UAC Auto Update applicationWindows 7 UAC 自动更新应用程序
【发布时间】:2011-05-02 14:34:57
【问题描述】:

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

我们遇到的问题是当打开 UAC 时,我们的应用程序无法运行。它也不会提示用户允许程序运行。我有哪些选项可以解决此问题或解决问题?

以下是选项:
1. 关闭 UAC - 公司政策
2. 使用 ClickOnce - 不支持我们的需求(这就是我们自产自销的原因)

非常感谢。

【问题讨论】:

    标签: .net windows-7 uac


    【解决方案1】:

    您可以在 application manifest 中请求 UAC 提升。如果您指定 requireAdministrator,它将调用 UAC,除非机器策略阻止 UAC 提示。

    【讨论】:

    • 那么这是否会有效地用“是/否”框提示我的用户以允许我的自动更新应用程序运行?
    • @Adam:是的,这就是我的理解。当然,这是 UAC“灰色桌面”类型的 Yes/No 框。
    【解决方案2】:

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

    没有这个,你的代码可以正常工作,但他们会吃惊。他们正在使用该应用程序,监控核反应堆或批准费用账户或其他任何事情,突然间 - 怪罪! - 屏幕变黑,他们得到一个提示 - 它上面有一个 exe 名称,但没有人阅读它,而且它可能无法解释太多。

    这个未经请求的 UAC 提示很有可能不会得到用户的同意。因此,更改您的 UI 以向他们解释是一种更好的方式。

    【讨论】:

      【解决方案3】:

      理想情况下,您会使用 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;
      

      【讨论】:

      • “理想情况下,您会使用 MSI 作为安装程序/更新程序”您是否有链接可以指导某人以基本方式完成此操作?
      • 如果您将程序作为 MSI 分发,MSI 已经知道如何请求提升。您需要做的是创建一个 MSI 安装程序,其中有专门用于执行的整个应用程序。最喜欢的是 WiX - Windows Installer XML Toolset (wix.sourceforge.net/manual-wix2/wix_index.htm)
      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多