如何确定文件共享服务器是否在线?

时间:2014-02-21 11:30:21

标签: .net vb.net

如果我想检查服务器可用性但我不知道它的共享,我可以在Windows资源管理器窗口中键入其UNC名称(或IP地址),即使没有服务器共享目录

Explorer screenshot from Windows 8

我如何在.NET中以编程方式使用它来验证服务器是否在线?我正在尝试

My.Computer.FileSystem.DirectoryExists(UNCPath)

但这仅适用于\\MY_SERVER\Users等UNC路径,但不打算与\\MY_SERVER一起使用。

我想避免Ping并坚持使用在文件系统工作时有效的功能,因为某些服务器可能因安全原因而禁用ICMP_ECHO。

(如果您想发布一些代码,请随意选择VB或C#。)

1 个答案:

答案 0 :(得分:2)

修改 我收到通知,这可能是Q/A mentioned elsewhere的重复解决方案。区别在于另一个问题接受对我来说没有真正起作用的答案,我有理由认为在这种情况下使用WMI是限制方法(它需要凭据, 见下文)。在这个答案中,我给出了一个真正适合我的方法。 但是如果你真的认为它是重复的,继续标记为关闭,我将整个问题删除为不必要的。


我继续学习和尝试,最后我决定使用TCP port 139,同样是used by file sharing mechanism。考虑以下源代码作为草稿(并且不要忘记处理异常等),但最后我可以使用一些似乎对我有用的代码:

Public Shared Function IsFileShareServerOnline(PCName As String,
                                               Timeout as Integer) As Boolean

    Const Port As Integer = 139 'port for file sharing service

    Dim IsOnline As Boolean = False
    Dim IP As Net.IPAddress = Net.Dns.GetHostAddresses(PCName)(0)
    Dim Address As Net.IPAddress = Net.IPAddress.Parse(IP.ToString())
    Dim Socket As Net.Sockets.TcpClient = New Net.Sockets.TcpClient(Address.AddressFamily)
    Dim Connect = Socket.BeginConnect(Address, Port, Nothing, Nothing)
    Dim WaitingResult = Connect.AsyncWaitHandle.WaitOne(Timeout, False)

    If (Connect.IsCompleted) Then
        If WaitingResult Then
            Socket.EndConnect(Connect)
            IsOnline = True
        End If
    End If
    Socket.Close()
    Return IsOnline

End Function

代码存在一个问题,即在首次运行时即使可用,也无法检测到远程计算机。重试后它可以工作。只要在较长时间后尝试连接,问题就会更新(一次检测错误)。我不是TCP / IP专家了解原因,也许我使用太短暂的超时(1秒)。解决方法是至少提供2次连接尝试。

在尝试这种方法之前,我还实现并测试了基于WMI的查询,但是如果没有事先在远程计算机上进行身份验证,它们就无法正常工作。在我的方案中,它们是无用的。