1

我们有一个 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 年发生了什么变化,以及除了使用主机名之外是否还有其他方法。

4

0 回答 0