Windows 7 UAC自动更新应用程序

时间:2010-10-29 19:50:29

标签: .net windows-7 uac

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

我们遇到的问题是当UAC启用时我们的应用程序无法运行。它也不会提示用户允许程序运行。我有什么选择解决这个问题或解决问题?

以下是选项:
1.关闭UAC - 公司政策
2.使用ClickOnce - 不支持我们的需求(这就是为什么我们自己开发)

非常感谢。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

如果没有这个,您的代码将正常工作,但它们会被吓到。他们正在使用应用程序,监控核反应堆或批准费用账户或其他什么,突然 - 责备! - 屏幕变黑并且他们得到一个提示 - 它上面有一个exe名称,但没有人读它,反正可能无法解释。

UAC prompt

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

答案 2 :(得分:2)

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