【发布时间】:2026-01-23 15:25:02
【问题描述】:
我想从以管理员身份运行的程序启动另一个以用户身份运行的程序。
问题是第二个程序需要使用outlook,如果程序以管理员身份运行,这是不可能的。主程序需要以管理员身份运行。
我确实已经想出了这两个解决方案:
Process.Start("cmd.exe", @"/C runas.exe /savecred /user:" + Environment.UserDomainName + "\\" + Environment.UserName + " " + "\"SomeProgram.exe" + "\"");
或
Process.Start("explorer.exe", "SomeProgram.exe");
但我对这两种解决方案都有疑问。 第一个询问用户密码(仅在 Windows 重新启动后的第一次)。 第二个可能不会在未来工作,因为据我发现它被认为是一个错误,可能会在未来的更新中修复。
所以我想知道有没有其他解决方案,用户不需要输入密码?
这似乎对我有用:
Process.Start("cmd.exe", @"/C runas.exe /TrustLevel:0x20000 " + "\"SomeProgram.exe" + "\"");
【问题讨论】:
-
Raymond Chen 在How can I launch an unelevated process from my elevated process and vice versa? 中很好地描述了这一点(还涵盖了各种细节,例如当提升使用与会话其余部分不同的帐户凭据时)跨度>
-
但这不就是使用exploer.exe 完成工作的另一种方式吗?无论如何,我找到了另一个解决方案,我确实将它添加到原始帖子中。
-
您的解决方案是否正确处理从 Alice 的管理员帐户降级到 Bob 的用户帐户(使用 Raymonds 链接中的示例)?
-
runas /trustlevel使进程处于奇怪的状态,应该避免。见*.com/q/30970433/886887 -
一种解决方法是拥有一个以用户身份运行的父程序,它启动管理进程,然后启动用户进程。但雷蒙德的解决方案可能是合理的;是的,它使用资源管理器,但它合法地这样做。
标签: c# windows process admin uac