从以管理员身份运行的进程以用户身份启动进程

Posted

技术标签:

【中文标题】从以管理员身份运行的进程以用户身份启动进程【英文标题】:Start a process as user from an process running as admin 【发布时间】:2015-07-27 07:01:03 【问题描述】:

我想从以管理员身份运行的程序启动另一个以用户身份运行的程序。

问题是第二个程序需要使用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 一种解决方法是拥有一个以用户身份运行的父程序,它启动管理进程,然后启动用户进程。但雷蒙德的解决方案可能是合理的;是的,它使用资源管理器,但它合法地这样做 【参考方案1】:

Process 类具有StartInfo 属性,它是ProcessStartInfo 类的一个实例。此类公开UserNameDomainPassword 成员以指定您要运行该进程的用户。

Process myProcess = new Process();
myProcess.StartInfo.FileName = fileName;
myProcess.StartInfo.UserName = userName;
myProcess.StartInfo.Domain = domain;
myProcess.StartInfo.Password = password;
myProcess.Start();

【讨论】:

这意味着我需要知道用户密码,但事实并非如此。该程序被许多不同的用户使用,所以这不是我的选择。 @FKorni 我不认为您可以在不知道凭据的情况下冒充其他用户 好吧,主程序请求具有清单的管理员权限,但第二个程序应该只与当前会话的普通用户一起运行。 @FKorni 管理员没有上帝权限,您不能在没有正确凭据的情况下冒充其他用户 @FKorni 如果必须运行该进程的用户是已登录的用户,您可以点击 Damien_The_Unbeliever 提供的链接【参考方案2】:

我遇到了同样的问题,无法获取当前登录的用户。注意:查询 wmi 不是解决方案,因为当时可能有很多用户登录 所以我的解决方案是反过来。以当前用户身份启动我的应用,如果当前用户不是管理员,我请求以管理员身份运行。

if (IsAdministrator())

    // run whatever you want as elevated user

else

    //launch the same app as admin
    ExecuteAsAdmin(PATHH_TO_THE_SAME_APP.EXE);
    //execute whatever you want as current user.




public static void ExecuteAsAdmin(string fileName)

    Process proc = new Process();
    proc.StartInfo.FileName = fileName;
    proc.StartInfo.UseShellExecute = true;
    proc.StartInfo.Verb = "runas";

    proc.Start();
    proc.WaitForExit();


public static bool IsAdministrator()

    var identity = WindowsIdentity.GetCurrent();
    var principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);

【讨论】:

以上是关于从以管理员身份运行的进程以用户身份启动进程的主要内容,如果未能解决你的问题,请参考以下文章

从作为 LocalSystem 运行的 WCF 托管服务以特定用户身份启动进程

在 ASP.NET 中以不同用户身份启动进程

让 MVC 网站以管理员身份启动进程

Golang如何让子进程以另一个用户身份运行

无法以不同用户身份运行 C# 进程

如何以与 Windows 服务不同的用户身份运行进程