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
说明该操作需要提升的说明.
问题似乎是设置UseShellExecute
为false
(因为这两种方法都不正常),但我必须将其设置为false才能在不同的用户帐户下启动该进程.
如何从非提升的流程启动提升的流程并手动提供用户名和密码?
BOUNTY EDIT:虽然不能要求用户输入管理员凭据,但完全可以接受UAC nag对话框.我不想在这里绕过UAC.
Ian*_*oyd 13
我很惊讶没有办法做到这一点,直到我在Chris Jackson的博客文章中找到了:
为什么我不能在使用CreateProcessWithLogonW时提升我的应用程序以管理员身份运行?
你需要一个引导程序.一些过程可以让您转换到备用用户,后者可以负责运行requireAdministrator应用程序.所以,你可以设计这样的东西:
为什么我们不创建
ShellExecuteWithLogonW
API呢?我永远不会说永远,我们可能会在某个时候.但是今天,这个API的用例一直是用例,其中有一个优越的替代设计.最常见的请求是人们编写自己开发的软件部署软件,他们希望将凭据编码到应用程序中并提升自己的流程.这里真正的问题不是缺少API,而是您在应用程序中编码的管理员凭据供全世界阅读.
所以解决方案需要 ShellExecute
,它是唯一知道如何触发Consent对话框的人.
它提出了一个很好的观点:你对一个人的密码做了什么?
服务器核心上没有UAC,因为没有窗口显示同意提示.