如何将应用程序 运行 作为用户帐户的管理员?

How to make application run as admin on user accounts?

是否可以在没有 UAC 弹出窗口的情况下使 .NET 应用程序在用户帐户上 运行 时始终是管理员?我花了一些时间搜索此功能,但没有找到任何满意的答案。

对于一些背景信息,用户正在制造环境中 运行 测试应用程序,在该环境中加密狗插入 USB(转串行)端口。有时 windows 会弄乱 COM 端口,循环端口可以解决问题。我们发现我们可以使用管理员权限以编程方式执行此操作,但我们不希望用户成为管理员,我们也不希望用户处理 UAC 弹出窗口,或者,上帝保佑,点击 UAC 上的“否”弹出窗口禁用我们的功能并扰乱整个过程。

How do I force my .NET application to run as administrator? 我找到了这个旧线程,但他们的解决方案都要求用户是管理员或通常的 UAC 弹出窗口。

我们可以做些什么来启用此功能,还是我们永远被链接到 UAC 提示符?我们确实拥有这些机器并控制着这些机器上的应用程序和用户 运行。

编辑:我们正在使用此方法循环 COM 端口:

string ComPortName { get; set; } = "USB Serial Port (COM12)";
 

    private void button1_Click(object sender, EventArgs e)
    {
        SelectQuery query = new SelectQuery("Win32_PnPEntity", "Name=" + '"' + ComPortName + '"');
        ManagementObjectSearcher myDevices = new ManagementObjectSearcher(query);

        foreach (ManagementObject item in myDevices.Get())
        {
            textBox1.AppendText("Disabling port " + ComPortName + Environment.NewLine);
            ManagementBaseObject inParams = item.InvokeMethod("Disable", null, null);
            Thread.Sleep(3000);
            textBox1.AppendText("Enabling port " + ComPortName + Environment.NewLine);
            ManagementBaseObject UWFEnable = item.InvokeMethod("Enable", null, null);
            Thread.Sleep(3000);
            textBox1.AppendText("Finished cycling port " + ComPortName);
        }
    }

你不能,至少没有 UAC 提示。这是完全不可避免的,否则 Windows 如果可能的话将没有任何安全性 - 绕过 UAC 必须是完全 不可能 ,而不仅仅是“困难”。

一些解决问题的线索:

  • 您可以强制您的应用程序从第一步开始就始终请求提升(即使其需要 管理权限)。危险,但至少,您不会弄乱整个软件链:它会从一开始就被提升。
  • 您可以仅在真正需要时请求 UAC(例如,启动特定 sub-process 时,或在保持上下文的情况下以提升模式启动您自己的应用程序)。显然,您会一次又一次地询问,直到创建提升的子流程:如果用户单击“否”,那么您将再次尝试启动它。烦人,但同样,你不会把整个过程搞砸的。
  • 您可以编写一个 Windows 服务,该服务将 运行 在管理权限下执行您需要的 COM 循环任务。然后,您可以从 non-elevated 用户 space 调用此服务,而无需任何提升。我会推荐这个解决方案。

不,你不能。

假设用户是标准用户 - 例如一个 5 岁的女儿

她不能只是成为管理员。

如果任何人都可以成为管理员 - 那么拥有安全性就没有意义了。 Windows NT 是一个安全的操作系统。

解决您的问题

解决您的问题的最简单方法是授予所有人 执行此操作的权限。因为要做到这一点:需要有人许可。

We have discovered we can do this programmatically with admin privileges

你没有提到你正在以编程方式执行什么操作,或者你正在调用什么 Windows API。

  • 如果涉及注册表项、文件或服务
  • 授予修改权限
  • Users 组(或 Everyone 组,如果你愿意的话)

这样用户就有权执行这些操作。

授予您的用户执行此操作的权限并不丢人 - 这就是您希望他们执行的操作。他们应该有权这样做。

如果你关心defense-in-depth,你可以遵循最小权限的原则,而不是授予每个人做这件事的权限,你可以把它授予一个用户:

  • 服务运行的用户
  • 计划任务运行的用户

然后你只需要担心你的程序与服务通信(要求它做这件事),或者触发计划任务(这样它就可以做这件事)。

这样只有 service/task 有权限 - 你授予 service/task 对你的标准用户当前的东西的 修改 权限被拒绝。

想象一下 Windows XP

想象一下在 UAC 之前你会如何解决这个问题:

  • 该用户为标准用户
  • 并且没有 UAC 便利功能来帮助他们提升为管理员

在这种情况下,您必须执行上述操作之一:

  • 授予所有人对注册表项或文件夹的权限
  • 创建 具有权限的服务或计划任务:并让您的程序要求他们这样做