如何判断文件共享服务器是不是在线? [复制]

Posted

技术标签:

【中文标题】如何判断文件共享服务器是不是在线? [复制]【英文标题】:How to determine whether file share server is online? [duplicate]如何判断文件共享服务器是否在线? [复制] 【发布时间】:2014-02-21 11:30:20 【问题描述】:

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

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

My.Computer.FileSystem.DirectoryExists(UNCPath)

但这仅适用于\\MY_SERVER\Users 等UNC 路径,不适用于\\MY_SERVER

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

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

【问题讨论】:

什么是My.Computer.FileSystem... 我认为问题在于"\\MY_SERVER" 不是目录,而是服务器名称。 "\\MY_SERVER\Users" 是一个目录,它是共享内容的根目录,因此没有父目录供您检查。 @musefan My.Computer.FileSystem 是VB-exclusive convenience for functionalities from System.IO.File 难道没有一个答案是我为您链接的重复问题吗? @musefan 建议的解决方案提示使用 WMI 检查远程服务的可用性,这有助于文件和共享服务。这应该显示服务器的可用性。我没有使用 WMI 的经验,所以我不确定是否可以在没有事先在远程计算机上进行身份验证的情况下完成。因此,我将这个问题悬而未决,也许有人仍然可以在这里添加一个好的答案。 【参考方案1】:

编辑: 我被告知这可能与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 的查询,但是如果没有在远程计算机上事先进行身份验证,它们就无法工作,这在我的场景中是非常无用的。

【讨论】:

以上是关于如何判断文件共享服务器是不是在线? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何禁止群成员在qq群共享上传文件?

如何确定将大量文件复制到外部共享文件夹的理想并行Java线程数?

菜鸟学习---NFS共享文件服器务搭建

DFS分布式独立共享和域共享如何设置访问权限

File.Copy() 从网络共享到同一台机器上的另一个共享是不是通过网络复制文件?

禁止删除修改共享文件,防止局域网用户私自复制共享文件到本地的方法