启动流程时不会提示UAC-C#

启动流程时不会提示UAC-C#,c#,winapi,process,uac,C#,Winapi,Process,Uac,在我有一个应用程序,我想开始安装另一个程序,用户必须是管理员。为此,我执行以下操作: var info = new ProcessStartInfo(); info.FileName = fileName; info.Verb = "runas"; info.UseShellExecute = false; Process.Start(info); 除了用户必须是管理员且不显示UAC提示外,此操作正常。 我读过,动词应该是“runas”,UseShellExecute应该是false。但它

在我有一个应用程序,我想开始安装另一个程序,用户必须是管理员。为此,我执行以下操作:

var info = new ProcessStartInfo();

info.FileName = fileName;
info.Verb = "runas";
info.UseShellExecute = false;

Process.Start(info);
除了用户必须是管理员且不显示UAC提示外,此操作正常。
我读过,动词应该是“runas”,UseShellExecute应该是false。但它根本不起作用。你知道为什么吗?:)

只有当
UseShellExecute
true
时,才能使用
runas
动词。这是因为
动词
只有在调用
ShellExecuteEx
API时才有意义

在您的代码中,所使用的底层API是
CreateProcess
,它不接收动词,因此您的
runas
规范被忽略



这就是你所问问题的答案,但我怀疑你选择的解决方案不是最好的。如果安装程序始终需要运行提升版,则应将其标记为提升版。制作安装程序时,请使用清单文件中的
requireAdministrator
选项。这样,无论何时运行安装程序,都将调用UAC提升过程。这将提升需求的知识放在安装程序中,而不是调用程序中,因为调用程序才是提升的正确位置。

只有当
UseShellExecute
true
时,才使用
runas
动词。这是因为
动词
只有在调用
ShellExecuteEx
API时才有意义

在您的代码中,所使用的底层API是
CreateProcess
,它不接收动词,因此您的
runas
规范被忽略



这就是你所问问题的答案,但我怀疑你选择的解决方案不是最好的。如果安装程序始终需要运行提升版,则应将其标记为提升版。制作安装程序时,请使用清单文件中的
requireAdministrator
选项。这样,无论何时运行安装程序,都将调用UAC提升过程。这将需要提升的知识放在安装程序中,而不是调用程序中,因为调用程序才是真正适合提升的地方。

Thx对你们两个都很重要!:)谢谢你们俩!:)