给定机器的 IP 地址,我如何在 C# 中以编程方式获取其 NetBIOS 名称?我知道我可以通过“nbtstat -A”从命令行获取它,但我正在寻找更好的解决方案。
问问题
6924 次
3 回答
4
于 2010-02-01T06:30:40.807 回答
1
您可以将 winapi gethostbyaddr与 type 一起使用AF_NETBIOS
。
于 2010-02-01T06:07:36.260 回答
1
你使用这个代码,它基于我在微软找到的一个例子。当它在端口 137 获得 UDP 请求的结果时,它会从答案中删除名称。它不检查名称是否为有效的 NetBIOS 名称。可以添加它以使其更安全。
public class NetBIOSHelper
{
/// <summary>
/// Get the NetBIOS machine name and domain / workgroup name by ip address using UPD datagram at port 137. Based on code I found at microsoft
/// </summary>
/// <returns>True if getting an answer on port 137 with a result</returns>
public static bool GetRemoteNetBiosName(IPAddress targetAddress, out string nbName, out string nbDomainOrWorkgroupName, int receiveTimeOut = 5000, int retries = 1)
{
// The following byte stream contains the necessary message
// to request a NetBios name from a machine
byte[] nameRequest = new byte[]{
0x80, 0x94, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x20, 0x43, 0x4b, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x21,
0x00, 0x01 };
do
{
byte[] receiveBuffer = new byte[1024];
Socket requestSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
requestSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, receiveTimeOut);
nbName = null;
nbDomainOrWorkgroupName = null;
EndPoint remoteEndpoint = new IPEndPoint(targetAddress, 137);
IPEndPoint originEndpoint = new IPEndPoint(IPAddress.Any, 0);
requestSocket.Bind(originEndpoint);
requestSocket.SendTo(nameRequest, remoteEndpoint);
try
{
int receivedByteCount = requestSocket.ReceiveFrom(receiveBuffer, ref remoteEndpoint);
// Is the answer long enough?
if (receivedByteCount >= 90)
{
Encoding enc = new ASCIIEncoding();
nbName = enc.GetString(receiveBuffer, 57, 15).Trim();
nbDomainOrWorkgroupName = enc.GetString(receiveBuffer, 75, 15).Trim();
// the names may be checked if they are really valid NetBIOS names, but I don't care ....
return true;
//<----------
}
}
catch (SocketException)
{
// We get this Exception when the target is not reachable
}
retries--;
} while (retries >= 0);
return false;
//< ----------
}
}
于 2021-06-19T11:08:18.953 回答