c# - 使用 IPv4 地址和非管理员用户时,ServiceController 无法在 Windows 10 1709+ 上启动服务
问题描述
我们有一个 Windows 服务,它位于并监控我们的主要 Windows 服务。可以查询服务状态,根据需要停止、启动、重启服务。它使用 .Net 中的ServiceController类来实现。
使用我们的安装程序安装时,可以将服务配置为使用现有的 Windows 用户帐户,或者可以为服务创建新帐户。此用户可以是管理员或非管理员用户。无论哪种方式,安装时,监控服务都配置为自动启动,主服务设置为手动,并且配置的用户帐户被明确授予控制主服务所需的所有权限。我已经仔细检查了 DACL 并确认用户确实有权限。
大多数情况下,这两个服务安装在同一台机器上,但它们也有可能安装在不同的机器上,所以在新建时ServiceController
我们传入服务名称和机器的 IP 地址。
问题是,在调用ServiceController.Start()
我们得到以下异常:
System.InvalidOperationException:无法在计算机“127.0.0.1”上打开 MyServiceName 服务。---> System.ComponentModel.Win32Exception:访问被拒绝
--- 内部异常堆栈跟踪结束 ---
在 System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
在 System.ServiceProcess.ServiceController.Start(字符串 [] 参数)
在 System.ServiceProcess.ServiceController.Start() )。
仅当配置的用户是非管理员、使用 IPv4 地址并且自 1709 更新以来仅在 Windows 10 上才会发生这种情况。此异常不会发生在任何先前版本的 Windows 上,包括所有先前版本的 Windows 10(是的,我已经测试了所有这些版本,呃)。似乎在使用机器的主机名或“localhost”时不会发生异常,只有在使用诸如“127.0.0.1”之类的 IPv4 地址或机器的实际 IP 时才会发生异常。
可以使用以下小控制台程序重现该问题:
using System;
using System.ServiceProcess;
namespace ServiceStartTest
{
class Program
{
static void Main(string[] args)
{
try
{
var serviceController = new ServiceController("MyServiceName", "127.0.0.1");
serviceController.Start();
}
catch (Exception ex)
{
Console.WriteLine($"Exception caught: {ex}");
}
Console.ReadLine();
}
}
}
以非管理员用户身份运行并替换"MyServiceName"
为您可以控制的服务的已安装名称。
我真的很想知道导致此问题的 1709 年发生了什么变化,以及除了使用主机名之外是否还有其他方法。
解决方案
推荐阅读
- java - 注册页面 else/if
- reactjs - Antd中使用数组对象分组复选框
- python - 当我从 Python 将数据导出到 csv 时,该文件是空白的。当我使用 Print 函数查看数据时,返回第一个字符串
- path - SwiftUI 中 Path.addArc 的顺时针方向错了吗?
- swift - 未知的 116 字节 ECDSA 私钥格式
- python - 我可以将循环的结果保存到列表中(Python)吗?
- ios - 如何正确格式化单元格?
- nix - 如何禁用解压阶段以防止出现“不知道如何解压源存档”错误?
- ios - GADBannerView removeFromSuperview 不起作用
- cloud-foundry - 带有 MITM 代理证书的 Bosh Lite cf-deployment VirtualBox