如何从管理员运行非管理员进程c#应用程序
我有一个c#应用程序需要做一些管理员(一些安装的东西)的事情,然后它需要以非管理员身份运行另一个进程。我之前没有对UAC做过任何事情,但我认为必须有办法做到这一点,对吧?如何从管理员运行非管理员进程c#应用程序
这也需要自动化,所以假设c#应用程序是以管理员凭证启动的。
基本程序将需要做这样的事情:
// MUST run this process as admin
Process adminInstall = new Process();
adminInstall.StartInfo.FileName = "install.bat";
adminInstall.Start();
adminInstall.WaitForExit();
// CANNOT run this process as admin
Process nonAdminProcess = new Process();
nonAdminProcess.StartInfo.FileName = "runner.cmd";
nonAdminProcess.StartInfo.UseShellExecute = false;
nonAdminProcess.StartInfo.RedirectStandardOutput = true;
nonAdminProcess.OutputDataReceived += new DataReceivedEventHandler(myHandler);
nonAdminProcess.Start();
nonAdminProcess.BeginOutputReadLine();
nonAdminProcess.WaitForExit();
似乎没有被这样使用.NET类的一个很好的方式。但是,Process.Start with different credentials with UAC on解释了在从另一个进程中窃取句柄之后使用CreateProcessAsUserW执行此操作的一种方法。
如果上述方法不可行,那么你可以试试我的方法。但它的丑陋;您需要获取非管理员进程的句柄,然后使用DuplicateTokenEx
(p/invoke)复制其(非管理员)权限,然后将其传递到CreateProcessAsUser
。您首先需要确定一个非管理进程,但可能没有任何进程。新创建的进程将使用您复制的令牌的任何特权生成,而不是父进程的标记。
您不必获取非管理进程的句柄;您可以使用'SaferComputeTokenFromLevel'直接创建一个非管理员令牌。您还必须记住使用中等完整性级别。详细信息[这里](http://stackoverflow.com/a/40687129/33080)。 –
编译二进制文件之后,但在签名之前,可以在平台SDK中使用MT.exe(清单工具)在可执行文件中嵌入清单。您也可以选择在项目属性中使用自定义清单。打开项目属性,然后转到应用程序选项卡,然后将清单选项从默认清单更改为自定义清单。 Visual Studio将为您的项目添加一个清单,您可以在其中指定“requireAdministrator”专用权限。当您的应用程序运行时,它将提供UAC提示,或者以用户身份登录时要求提供凭据。子流程很可能以管理员身份启动。否则,你需要用没有记录的“runas”动词来启动它们。
更好的选项列在这个重复的问题[这里](http://stackoverflow.com/questions/1173630/how-do-you-de-elevate-privileges-for-a-child-process)。 –
可能的重复[如何删除子进程的权限](http://stackoverflow.com/questions/1173630/how-do-you-de-elevate-privileges-for-a-child-进程) –