使用IPv4地址和非管理员用户时,ServiceController无法在Windows 10 1709+上启动服务

时间:2018-08-01 14:38:30

标签: c# windows-services windows-10 servicecontroller

我们有一个Windows服务,该服务位于并监视我们的主要Windows服务。它可以根据需要查询服务状态,停止,启动和重新启动服务。它是使用.Net中的ServiceController类来实现的。

使用我们的安装程序安装时,可以将服务配置为使用现有的Windows用户帐户,也可以为服务创建一个新帐户。该用户可以是管理员或非管理员用户。无论哪种方式,在安装后,都会将Monitor Service配置为自动启动,并且将Main Service设置为Manual,并为配置的用户帐户明确授予控制Main Service所需的所有权限。我已经仔细检查了DACL,并确认该用户确实具有权限。

在大多数情况下,这两个服务安装在同一台计算机上,但是它们有可能位于不同的计算机上,因此在对ServiceController进行新设置时,我们会传递服务名称和机器的IP地址。

问题是,在调用ServiceController.Start()时,我们收到以下异常:

  

System.InvalidOperationException:无法在计算机“ 127.0.0.1”上打开MyServiceName服务。 ---> System.ComponentModel.Win32Exception:访问被拒绝

     

---内部异常堆栈跟踪的结尾---

     

在System.ServiceProcess.ServiceController.GetServiceHandle(Int32 wantedAccess)

     

在System.ServiceProcess.ServiceController.Start(String [] args)

     

在System.ServiceProcess.ServiceController.Start()   )。

仅当自1709年更新以来,配置的用户是非管理员用户(使用IPv4地址)并且在Windows 10上仅 时,才会发生这种情况。在Windows的任何早期版本(包括Windows 10的所有 all 早期版本)中都不会发生此异常(是的,我已经测试了所有版本,urgh)。 似乎也只有在使用IPv4地址(例如“ 127.0.0.1”)或计算机的实际IP时,使用计算机的主机名或“ localhost”时才不会发生例外。

可以使用以下小型控制台程序重现该问题:

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年发生了什么变化,从而导致这种情况,以及除了使用主机名之外是否还有其他解决方法。

0 个答案:

没有答案