如何在启动程序和禁用 UAC 时强制提示输入凭据?
How to force a prompt for credentials when launching a program and UAC is disabled?
背景
我的应用程序(.NET、C#)执行应用程序内升级。根据安装配置,升级可能需要启动需要管理员权限的单独进程。已启动程序的清单指定它需要管理员权限。
这通常工作正常,但如果 UAC 被禁用,并且用户不是管理员,那么它就会失败。见下文。
场景
- UAC 已启用,用户是管理员 - Windows 提示提升权限,程序成功执行。
- UAC 已启用,用户不是管理员 - Windows 提示输入凭据,程序成功执行。
- UAC 已禁用,用户为管理员 - 无提示,程序执行成功。
- UAC 被禁用,用户不是管理员 - 没有提示,程序启动但失败得很惨。
第四种情况是我要解决的情况。我有一个相当大的客户公司,无论出于何种原因,它都有关闭所有公司 PC 上的 UAC 的政策。
缓解
最简单的解决方案是检测这第四种情况并为用户提供指导。我可以毫无问题地检测到第四种情况何时生效,然后我可以打开一个资源管理器 window 到一个包含要执行的程序的目录,以及一个引导用户完成 Shift-Right 过程的文本文件- 点击 -> "Run as different user".
所需的解决方案
如果我检测到我处于第四种情况,那么我会执行一些编码魔术以从我的应用程序自动启动该过程如果用户手动选择"Run as different user".
我不知道如何实施这个解决方案。我尝试设置 ProcessStartInfo.Verb = "runas"
,正如我看到的那样,但在没有 UAC 的情况下这似乎没有任何用处。有什么想法吗?
这种情况的正确动词是
ProcessStartInfo.Verb = "runasuser"
它可以很好地触发另一个进程的 "run as different user" 身份验证对话框。
我发现的一个可能的缺点是您不会返回正确的进程对象,因此您无法处理该新进程。此外,实际上不可能使用此方法重新启动您自己的应用程序,因为身份验证对话框是 运行 作为生成应用程序的线程,并且只有在身份验证之后才会创建新进程。因此,如果您想 "restart" 您的应用程序,可能需要一个启动器或其他一些技巧。
背景
我的应用程序(.NET、C#)执行应用程序内升级。根据安装配置,升级可能需要启动需要管理员权限的单独进程。已启动程序的清单指定它需要管理员权限。
这通常工作正常,但如果 UAC 被禁用,并且用户不是管理员,那么它就会失败。见下文。
场景
- UAC 已启用,用户是管理员 - Windows 提示提升权限,程序成功执行。
- UAC 已启用,用户不是管理员 - Windows 提示输入凭据,程序成功执行。
- UAC 已禁用,用户为管理员 - 无提示,程序执行成功。
- UAC 被禁用,用户不是管理员 - 没有提示,程序启动但失败得很惨。
第四种情况是我要解决的情况。我有一个相当大的客户公司,无论出于何种原因,它都有关闭所有公司 PC 上的 UAC 的政策。
缓解
最简单的解决方案是检测这第四种情况并为用户提供指导。我可以毫无问题地检测到第四种情况何时生效,然后我可以打开一个资源管理器 window 到一个包含要执行的程序的目录,以及一个引导用户完成 Shift-Right 过程的文本文件- 点击 -> "Run as different user".
所需的解决方案
如果我检测到我处于第四种情况,那么我会执行一些编码魔术以从我的应用程序自动启动该过程如果用户手动选择"Run as different user".
我不知道如何实施这个解决方案。我尝试设置 ProcessStartInfo.Verb = "runas"
,正如我看到的那样,但在没有 UAC 的情况下这似乎没有任何用处。有什么想法吗?
这种情况的正确动词是
ProcessStartInfo.Verb = "runasuser"
它可以很好地触发另一个进程的 "run as different user" 身份验证对话框。 我发现的一个可能的缺点是您不会返回正确的进程对象,因此您无法处理该新进程。此外,实际上不可能使用此方法重新启动您自己的应用程序,因为身份验证对话框是 运行 作为生成应用程序的线程,并且只有在身份验证之后才会创建新进程。因此,如果您想 "restart" 您的应用程序,可能需要一个启动器或其他一些技巧。