启动流程时不会提示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对你们两个都很重要!:)谢谢你们俩!:)