从UAC管理员级别进程启动具有降低权限的进程的C#代码

6
我有一个主要的问题,我的应用程序和更新程序是分开的exe文件。当有更新可用时,更新程序进行更新,并在进程完成后启动我的应用程序。主要问题是- 应用程序安装在program files文件夹中,因此更新程序需要UAC管理员权限,这是可以的,但当我需要运行我的应用程序时,更新程序需要以普通用户身份运行它,因为如果以管理员身份运行,拖放功能将无法工作(不是应用程序问题,UAC会阻止它)。我尝试了几种不同的解决方案,甚至包括这个:如何在Vista (.NET)中以非提升方式运行,但都没有帮助我-我的应用程序仍然以管理员身份运行。
2个回答

10

最好避免从已提升权限的进程启动非提升权限的进程。这是一个棘手的部分,容易出错。

以下方法更好:

  1. 您的更新程序最初作为非提升应用程序启动,并且其清单具有 asInvoker 级别。
  2. 当它启动时,使用 runas 动词以提升的特权重新启动自身,并传递命令行参数以指示它。此实例执行更新并返回。
  3. 然后再次启动非提升的更新程序,并使用与第一步中启动更新程序的相同的非提升用户令牌来启动您的应用程序。

非常简单和健壮。


1
+1;这个回答的第一行非常重要。我读过一些文章说,尝试取消提升(获取取消提升令牌进行模拟)是一个不好的想法,无论你尝试哪种技术。不确定在哪里可以找到那篇文章,因为我是在Vista首次推出时阅读的。另一种选项在这个问题中提供:https://dev59.com/tXM_5IYBdhLWcg3w6HvT - Merlyn Morgan-Graham
做成这样 - 工作很顺利!非常感谢我的朋友!;) - n1tr0
@AlexeyIvanov,您能否提供一个简单的示例代码来说明您的方法? - python_kaa
@python_kaa 我不会C#,但我可以用纯Windows API编写代码片段或给你伪代码。 - Alexey Ivanov
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - drizin
1
@drizin 是的,你理解得很正确。非提升更新程序可以在不创建窗口的情况下工作。例如,如果提升的更新程序成功更新并返回0退出代码,则非提升的更新程序知道是时候启动应用程序了。否则,它就会退出。 - Alexey Ivanov

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接