【发布时间】:2012-04-09 23:51:44
【问题描述】:
我正在尝试从非提升进程启动提升进程,但我还需要为具有管理凭据的用户提供用户名和密码。我已经尝试了 "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);
进程在不显示 UAC 确认对话框的情况下启动,并且在尝试执行需要管理员权限的命令时失败(我只是尝试将测试文件写入 Program Files 目录)。
如果我向目标应用程序添加一个表明它需要提升的清单,那么我会收到一个 Win32Exception 说明该操作需要提升。
问题似乎是将UseShellExecute 设置为false(因为这两种方法都可以正常工作,但情况并非如此),但我必须将其设置为 false 才能在不同的用户帐户下启动该进程。
如何从非提升的进程启动提升的进程并手动提供用户名和密码?
BOUNTY EDIT:虽然不能要求用户输入管理员凭据,但 UAC 唠叨对话框是完全可以接受的。我不想在这里绕过 UAC。
【问题讨论】:
-
对于那些可能好奇的人来说,这个应用程序是一个自动更新包的一部分,它将运行一个将为所有用户安装的 MSI。鉴于实际运行应用程序的用户很可能没有管理凭据(他们也不知道管理员的用户名和密码),我需要能够允许实际管理员提供这些凭据一次并在多个上运行此应用程序机器同时进行。
-
我还需要考虑关闭 UAC 的场景。
-
您的清单正在使用 requestedExecutionLevel,正如 here 所建议的那样,对吗?在我尝试诊断问题之前,我只是确保您为提示升级权限所做的一切都已解决。清单在 XP 中不起作用(请参阅链接文章),但在 Vista 中将起作用。
-
@MrGomez:是的,清单创建正确。如果我在没有指定用户的情况下启动它,它可以正常工作如果 UAC 处于打开状态(尽管我必须手动输入凭据,我必须避免),但如果我指定凭据,它将不允许提升过程。
-
感谢您的回复和编辑。我添加了一个我相信对你有用的答案。最坏的情况,需要检查!