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