Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#从UAC管理级流程以较低的权限启动流程_C#_Admin_Uac_Privileges - Fatal编程技术网

c#从UAC管理级流程以较低的权限启动流程

c#从UAC管理级流程以较低的权限启动流程,c#,admin,uac,privileges,C#,Admin,Uac,Privileges,我的应用程序有一个主要问题。我有一个应用程序和更新程序作为一个单独的exe文件。当更新可用时,更新程序进行更新,并在进程完成时启动我的应用程序。主要问题是-应用程序安装在program files文件夹中,所以更新程序需要UAC管理员权限,这没关系,但当我需要运行我的应用程序时,更新程序需要以普通用户的身份运行,因为如果它以管理员的身份运行,拖放操作不起作用(不是应用程序问题,UAC会阻止它)。我已经尝试了几种不同的解决方案,甚至还有这个: 这对我没有帮助-我的应用程序是以管理员身份运行的。你

我的应用程序有一个主要问题。我有一个应用程序和更新程序作为一个单独的exe文件。当更新可用时,更新程序进行更新,并在进程完成时启动我的应用程序。主要问题是-应用程序安装在program files文件夹中,所以更新程序需要UAC管理员权限,这没关系,但当我需要运行我的应用程序时,更新程序需要以普通用户的身份运行,因为如果它以管理员的身份运行,拖放操作不起作用(不是应用程序问题,UAC会阻止它)。我已经尝试了几种不同的解决方案,甚至还有这个:


这对我没有帮助-我的应用程序是以管理员身份运行的。

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

这种方法更好:

  • 更新程序最初作为非提升应用程序启动,其清单具有
    asInvoker
    级别
  • 当它启动时,它使用
    runas
    动词以提升的权限重新启动自己,并传递一个命令行参数来指示它。此实例执行更新并返回
  • 这里再次出现了非提升更新程序,并使用与在步骤1中启动第一个更新程序实例相同的非提升用户令牌启动应用程序

  • 非常简单和健壮。

    看看这篇关于如何为提升的流程启用拖放的文章。即使上面说的是MFC应用程序,我想你也可以在任何应用程序中使用这些Windows API


    +1;这个答案的第一行相当重要。我读过一些文章说,无论您尝试何种技术,尝试反提升(获取一个反提升的令牌来模拟)都是一个坏主意。我不知道在哪里可以找到这些文章,因为我在Vista刚推出时就读到了。另一个选择是在这个问题上给出的:这样做-就像一个魅力工程!非常感谢我的朋友@不客气。如果对你有帮助,请投票并接受答案。:)@阿列克谢伊万诺夫你能为你的方法提供一个简单的示例代码吗?@drizin是的,你理解正确。非提升更新程序可以在根本不创建窗口的情况下工作。例如,如果提升的更新程序更新成功并返回0退出代码,则非提升的更新程序知道该启动应用程序了。否则,它就会退出。