如何在启动程序时强制提示凭据并禁用UAC?

时间:2015-11-17 15:14:22

标签: c# windows uac

背景

我的应用程序(.NET,C#)执行应用内升级。根据安装配置,升级可能需要启动需要管理员权限的单独进程。已启动的程序清单指定它需要管理员权限。

这通常可以正常工作,但如果禁用UAC,并且用户不是管理员,那么它会失败。见下文。

方案

  • 启用了UAC,用户是管理员 - Windows提示提升,程序执行成功。
  • 启用了UAC,用户不是管理员 - Windows会提示输入凭据,程序也会成功执行。
  • UAC已禁用,用户为管理员 - 无提示,程序成功执行。
  • UAC已禁用,用户不是管理员 - 没有提示,程序启动但是失败了。

第四种情况是我想要解决的问题。我有一个相当大的客户公司,无论出于何种原因,都有在所有公司PC上关闭UAC的政策。

缓解

最简单的解决方案是检测第四种情况并向用户提供指导。检测第四个场景何时生效我没有问题,然后我可以打开一个资源管理器窗口到一个包含要执行的程序的目录,以及一个文本文件,引导用户完成Shift-Right-Click - &gt ; "以不同的用户身份运行"。

期望的解决方案

如果我发现自己处于第四种情况,那么我会执行一些编码魔术来自动启动我的应用程序 AS IF 用户手动选择"运行不同用户"

我不知道如何实施此解决方案。正如我所看到的那样,我试图设置ProcessStartInfo.Verb = "runas",但在没有UAC的情况下,似乎没有做任何有用的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这种情况的正确动词是

ProcessStartInfo.Verb = "runasuser"

它可以很好地触发"以不同的用户身份运行"另一个进程的验证对话框。 我发现一个可能的缺点是你不会得到一个正确的过程对象,所以你没有得到这个新过程的句柄。此外,使用此方法无法重新启动您自己的应用程序,因为身份验证对话框作为生成应用程序的线程运行,并且只有在身份验证是创建的新进程之后。所以如果你想"重启"您的应用程序可能需要启动器或其他技巧。

相关问题