.net Windows 7 UAC自动更新应用程序

.net Windows 7 UAC自动更新应用程序,.net,windows-7,uac,.net,Windows 7,Uac,我们有一个应用程序套件,我们通过一个自制的“自动更新”应用程序进行更新。此应用程序基本上连接到我们的“更新服务器”,并下载文件以覆盖、更新,甚至将新功能/应用程序添加到我们的应用程序套件中。但是,这在UAC中并不适用。我们的自动更新应用程序是通过HKLM\Software\Microsoft\Windows\CurrentVersion\Run注册表项启动的命令行.NET应用程序 我们遇到的问题是,当UAC打开时,我们的应用程序无法运行。它也不会提示用户允许程序运行。我有什么办法来解决这个问题

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

我们遇到的问题是,当UAC打开时,我们的应用程序无法运行。它也不会提示用户允许程序运行。我有什么办法来解决这个问题

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


非常感谢。

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

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

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

如果没有这个,您的代码将很好地工作,但他们会大吃一惊。他们正在使用该应用程序,监控核反应堆或批准费用账户或其他任何东西,突然之间——怪罪屏幕变黑,他们得到一个提示-上面有一个exe名称,但没有人读它,而且可能不会解释太多


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

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

如果没有这个,您的代码将很好地工作,但他们会大吃一惊。他们正在使用该应用程序,监控核反应堆或批准费用账户或其他任何东西,突然之间——怪罪屏幕变黑,他们得到一个提示-上面有一个exe名称,但没有人读它,而且可能不会解释太多


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

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

您的另一个解决方案是使用管理权限执行更新程序:

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;
函数RunAsAdmin(hWnd:hWnd;文件名:string;参数:string):布尔;
{
请参阅步骤3:重新设计UAC兼容性(UAC)
http://msdn.microsoft.com/en-us/library/bb756922.aspx
}
变量
sei:TShellExecuteInfo;
开始
零内存(@sei,SizeOf(sei));
sei.cbSize:=SizeOf(TShellExecuteInfo);
sei.Wnd:=hwnd;
sei.fMask:=查看屏蔽标志等待或查看屏蔽标志否UI;
sei.lpVerb:=PChar('runas');
sei.lpFile:=PChar(文件名);//潘斯卡尔;
如果参数为“”,则
sei.lpParameters:=PChar(参数);//潘斯卡尔;
sei.nShow:=SW_SHOWNORMAL//整数
结果:=ShellExecuteEx(@sei);
终止

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

您的另一个解决方案是使用管理权限执行更新程序:

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;
函数RunAsAdmin(hWnd:hWnd;文件名:string;参数:string):布尔;
{
请参阅步骤3:重新设计UAC兼容性(UAC)
http://msdn.microsoft.com/en-us/library/bb756922.aspx
}
变量
sei:TShellExecuteInfo;
开始
零内存(@sei,SizeOf(sei));
sei.cbSize:=SizeOf(TShellExecuteInfo);
sei.Wnd:=hwnd;
sei.fMask:=查看屏蔽标志等待或查看屏蔽标志否UI;
sei.lpVerb:=PChar('runas');
sei.lpFile:=PChar(文件名);//潘斯卡尔;
如果参数为“”,则
sei.lpParameters:=PChar(参数);//潘斯卡尔;
sei.nShow:=SW_SHOWNORMAL//整数
结果:=ShellExecuteEx(@sei);
终止

这会有效地提示我的用户一个“是/否”框,允许我的自动更新应用程序运行吗?@Adam:是的,这是我的理解。当然,这是UAC的“灰显桌面”是/否框。那么这会有效地提示我的用户“是/否”框以允许我的自动更新应用程序运行吗?@Adam:是的,这是我的理解。当然,这是UAC的“灰色桌面”是/否框。“理想情况下,你会使用MSI作为你的安装程序/更新程序”你有没有链接可以引导某人以基本方式完成此操作?如果你以MSI的形式分发你的程序,MSI已经知道如何请求提升。你需要做的是创建一个MSI安装程序,整个应用程序都致力于此。最受欢迎的是WiX-Windows Installer XML Toolset()“理想情况下,您会使用MSI作为安装程序/更新程序”您是否有链接可以指导他人以基本方式完成此操作?如果您将程序作为MSI分发,MSI已经知道如何请求提升。你要做的就是创造