使用不同的用户凭据通过提升启动另一个进程

Ada*_*son 20 .net security uac

我正在尝试使用非提升的进程启动提升的进程,但我还需要为具有管理凭据的用户提供用户名和密码.我已尝试过"runas"提升方法以及使用清单,但两者都会产生不同的错误.

例如,如果我这样做(不使用需要提升的清单):

ProcessStartInfo info = new ProcessStartInfo(path);

info.UseShellExecute = false;
info.UserName = username;
info.Password = securePwd;
info.Domain = "MyDomain";
info.Verb = "runas";

var proc = Process.Start(info);
Run Code Online (Sandbox Code Playgroud)

该过程在不显示UAC确认对话框的情况下启动,并在尝试执行需要管理员权限的命令时失败(我只是尝试将测试文件写入Program Files目录).

如果我向目标应用程序添加一个表明它需要提升的清单,那么我得到一个Win32Exception说明该操作需要提升的说明.

问题似乎是设置UseShellExecutefalse(因为这两种方法都不正常),但我必须将其设置为false才能在不同的用户帐户下启动该进程.

如何从非提升的流程启动提升的流程并手动提供用户名和密码?

BOUNTY EDIT:虽然不能要求用户输入管理员凭据,但完全可以接受UAC nag对话框.我不想在这里绕过UAC.

Ian*_*oyd 13

我很惊讶没有办法做到这一点,直到我在Chris Jackson的博客文章中找到了:

为什么我不能在使用CreateProcessWithLogonW时提升我的应用程序以管理员身份运行?

你需要一个引导程序.一些过程可以让您转换到备用用户,后者可以负责运行requireAdministrator应用程序.所以,你可以设计这样的东西:

在此输入图像描述

为什么我们不创建ShellExecuteWithLogonWAPI呢?我永远不会说永远,我们可能会在某个时候.但是今天,这个API的用例一直是用例,其中有一个优越的替代设计.

最常见的请求是人们编写自己开发的软件部署软件,他们希望将凭据编码到应用程序中并提升自己的流程.这里真正的问题不是缺少API,而是您在应用程序中编码的管理员凭据供全世界阅读.

所以解决方案需要 ShellExecute,它是唯一知道如何触发Consent对话框的人.

它提出了一个很好的观点:你对一个人的密码做了什么?

奖金Chatter

服务器核心上没有UAC,因为没有窗口显示同意提示.

  • 这就是我正在做的事情.单个可执行文件启动了三次. (2认同)