如果我想检查服务器可用性但我不知道它的共享,我可以在Windows资源管理器窗口中键入其UNC名称(或IP地址),即使没有服务器共享目录:
我如何在.NET中以编程方式使用它来验证服务器是否在线?我正在尝试
My.Computer.FileSystem.DirectoryExists(UNCPath)
但这仅适用于\\MY_SERVER\Users
等UNC路径,但不打算与\\MY_SERVER
一起使用。
我想避免Ping并坚持使用在文件系统工作时有效的功能,因为某些服务器可能因安全原因而禁用ICMP_ECHO。
(如果您想发布一些代码,请随意选择VB或C#。)
答案 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的查询,但是如果没有事先在远程计算机上进行身份验证,它们就无法正常工作。在我的方案中,它们是无用的。