【问题标题】:How can a C# program run another program with admin privileges?C# 程序如何以管理员权限运行另一个程序?
【发布时间】:2017-03-14 20:46:30
【问题描述】:

我对这种情况有疑问: 我做了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,这就是为什么我已经插入了用户名和密码。 提前致谢。

【问题讨论】:

  • 据我所知,您无法以这种方式规避 UAC。如果正在运行的程序没有管理员权限,则被调用程序需要请求管理员权限,这将触发 UAC。
  • 您是否尝试将密码SecureString设为只读?
  • @BenVoigt,“SecureString”工作正常,因为当我输入错误密码时,它会抛出异常。
  • 问题是Process.Start() 使用CreateProcessWithLogonW 哪个filters the user token。我不知道有什么好的解决方法,也许是使用计划任务?如果做不到这一点,您最好的选择可能是安装系统服务来代表您启动孩子。 (当然,要适当注意安全问题。)更好的是,重新架构,这样您就不再需要这样做了。无论如何,您不应该将管理员凭据放在可执行文件中。
  • @HarryJohnston:你链接到的那个答案似乎有一个解决方案(LOGON32_LOGON_BATCH 标志),不是吗?

标签: c# windows process privileges


【解决方案1】:

你有一半的答案。另一半是程序必须请求以提升的权限执行。默认情况下,Windows 程序以“基本”信任级别运行,而不管用户可能拥有的真实权限级别。为了获得管理权,该计划必须请求提升,根据定义,这将涉及 UAC。

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

避免这种情况的唯一方法是将原本需要提升权限的程序设置为 Windows 服务,并在 services.msc 中配置为以管理权限运行。在安装/注册服务以以这种方式运行时,您将收到一个 UAC 提示,从那时起,该服务无需任何进一步的 UAC 操作即可执行该任务。然后,您可以使用各种通信技术,从命名管道到真正的网络通信(如 TCP),向服务发出信号,告诉它它应该执行您想要的操作。

【讨论】:

  • 服务的一个更简单的替代方案是计划任务,其权限设置为允许非特权用户触发它。然后你可以运行任何命令,它不必在其主循环中包含所有服务管理的东西。
  • 有没有办法以某种方式对可执行文件进行签名以表明它是受信任的?
猜你喜欢
  • 2011-01-17
  • 2013-05-24
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2013-03-04
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多