以作为admin运行的进程以用户身份启动进程

时间:2015-07-27 07:01:04

标签: c# windows process admin uac

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

问题是第二个程序需要使用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" + "\"");

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

我遇到了同样的问题,无法获得当前登录的用户。注意:查询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);
}