我想启动另一个以管理员身份运行的程序运行的程序。
问题是第二个程序需要使用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" + "\"");
答案 0 :(得分:1)
Process
类具有StartInfo
属性,该属性是ProcessStartInfo
类的实例。此类公开UserName
,Domain
和Password
成员以指定您要运行该过程的用户。
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);
}