哪个 Windows 服务可确保网络连接?

问题描述 投票:0回答:3

我正在做一个Windows服务,启动时必须有网络连接。代码是 c# 的,我将服务设置为依赖于其他人

serviceInstaller.ServicesDependedOn = new string[] { "Tcpip" };

我可以看到在 Windows 服务管理器上正确输入了依赖项,但重新启动后我的服务无法启动,因为它无法连接到网络,在主机获取 IP 后,服务正确启动。

我尝试使用“Tcpip”和“Dhcp”服务。应该依赖哪个服务?

服务需要网络连接,因为其目的是通过 ssh 安装单元

谢谢!

c# windows-services
3个回答
11
投票

我们一直在让我们的服务,依赖于网络开始启动,依赖于“Server”服务。它的实际名称是“LanmanServer”。这对我们来说一直运行良好。如果你看一下它的描述,它会说:

支持此计算机通过网络进行文件、打印和命名管道共享。如果该服务停止,这些功能将不可用。如果禁用此服务,任何明确依赖它的服务都将无法启动。

我们的想法是,如果计算机准备好执行这些功能,那么就必须启动网络。


3
投票

取决于@user957902在接受的答案中提到的

LanmanServer
在Windows Server 2019和2022上不起作用(好吧,至少对我和其他一些人来说)。

在 Windows Server 2019 和 2022 中,我认为不可能使用服务依赖项来解决此问题。

编辑:最好使用

NetworkListManager
而不是
WinInet
,因为根据 MS 文档 - 不建议使用
WinInet
(正如 @JanPaulmann 注意到的那样)。下面的代码使用WinInet,因此不建议使用。我不会在这里使用
NetworkListManager
发布另一个代码,因为这个问题专门询问了有关 Windows 服务依赖项的问题,所以请参阅 对另一个问题的回答 - 它包含使用
NetworkListManager

的漂亮代码

我在 Windows 服务中通过等待互联网连接建立来解决了这个问题,使用以下代码(只需调用

WaitUntilInternetConnectionAvailable
方法):

public static class WinINet
{
    [DllImport("wininet.dll")]
    public static extern bool InternetGetConnectedState(out int description, int reservedValue);
}

...

public static bool WaitUntilInternetConnectionAvailable(TimeSpan timeout, TimeSpan checkEvery)
{
    var sw = Stopwatch.StartNew();
    while (sw.Elapsed < timeout)
    {
        if (IsInternetConnectionAvailable())
        {
            return true;
        }

        Thread.Sleep(checkEvery);
    }

    return false;
}

public static bool IsInternetConnectionAvailable()
{
    return WinINet.InternetGetConnectedState(out _, 0);
}

1
投票

我使用“Tcpip”、“Dhcp”、“Dnscache”。对我来说工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.