繁体   English   中英

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

[英]Start a process as user from an process running as admin

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

问题是第二个程序需要使用Outlook,如果该程序以admin身份运行则不可能。 主程序需要以管理员身份运行。

我确实已经提出了这两种解决方案:

Process.Start("cmd.exe", @"/C runas.exe /savecred /user:" + Environment.UserDomainName + "\\" + Environment.UserName + " " + "\"SomeProgram.exe" + "\"");

要么

Process.Start("explorer.exe", "SomeProgram.exe");

但是我两种解决方案都有问题。 第一个询问用户密码(仅在Windows重新启动后的第一次)。 第二个probalby将来将无法使用,因为据我所知,它被认为是一个错误,并且可能会在以后的更新中修复。

所以我想知道还有没有其他解决方案,用户不需要输入密码?

这似乎为我工作:

Process.Start("cmd.exe", @"/C runas.exe /TrustLevel:0x20000  " + "\"SomeProgram.exe" + "\"");

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();

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

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM