C# 程序如何 运行 另一个具有管理员权限的程序?

How can a C# program run another program with admin privileges?

我对这种情况有疑问: 我制作了 2 个程序:

第一个只是打印一个输出,说明是否以管理员权限启动,第二个,执行第一个具有管理员权限 且不使用 UAC 的程序。问题是第二个程序无法以管理员权限启动第一个程序,我不知道为什么。 这是我的代码:

第一个程序代码:

// This only prints if you start as administrator or not.
bool isElevated;
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator);
Console.WriteLine("I got admin privileges?: "+isElevated);

第二个程序代码:

// This execute the first program with admin privileges without UAC
string username = "myuser";
SecureString userpass = new SecureString();
userpass.AppendChar('m');
userpass.AppendChar('y');
userpass.AppendChar('p');
userpass.AppendChar('a');
userpass.AppendChar('s');
userpass.AppendChar('s');

Process program = new Process();
program.StartInfo.UserName = username;
program.StartInfo.Password = userpass;
program.StartInfo.FileName = "Path/First_program.exe";
program.StartInfo.UseShellExecute = false;
program.Start();

PD:我不想让用户打开 UAC,所以我已经输入了用户名和密码。 提前致谢。

你答对了一半。另一半是程序必须请求以提升的权限执行。默认情况下,Windows 程序 运行 处于 "Basic" 信任级别,无论用户可能拥有的真实权限级别如何。要获得管理权限,程序必须请求提升,根据定义,这将涉及 UAC。

像您这样的程序可以使用 ProcessStartInfo 中的 runas 动词请求提升,或者通过在任一应用程序的清单中指定 requireAdministrator 提升的权限(假设您控制它们)。无论哪种方式,如果启用了 UAC,用户都会收到提示。

避免这种情况的唯一方法是将需要提升权限的程序设置为 Windows 服务,在 services.msc 到 运行 中配置为具有管理权限。当 installing/registering 服务以这种方式 运行 时,您将收到一个 UAC 提示,从那时起,服务可以执行该任务而无需任何进一步的 UAC 操作。然后,您可以使用各种通信技术,从命名管道到真正的网络通信(如 TCP),向服务发出信号,表明它应该按照您的意愿行事。