C# - 从 IP 地址/DNS 名称获取操作系统

C# - Get Operating System from IP address / DNS Name

我们正在编写一个管理服务器的应用程序,我需要能够查看网络中任何远程计算机上的操作系统 运行。

我们不会总是有凭据来查看此信息,因此 WMI 不是解决方案。

我只需要知道,是 运行 Windows、Linux 还是其他。 OS.

是什么版本

目前我们正在从这些服务器上的数据库中获取此信息。但我想在不询问数据库的情况下执行此操作。

如果我只有 IP 地址或 DNS 名称,是否可以获取此信息?没有凭据。 C#/.Net Core 解决方案将是理想的。或者任何可以实现此目的的协议也可以,我会将其转换为 C#。

结论

因此,根据可用的和不可用的,这里是提出的选项。

  1. 如果您在远程计算机上有管理员帐户,WMI 是最好的方法。 Example on docs.microsoft.com here
  2. 如果您可以访问像 SQL 这样的数据库,您可以查询 SQL 到 return 的 OS 信息。这将从数据库到数据库以及从版本到版本非常重要。所以研究是必不可少的。
  3. 使用 nmap 之类的东西会让你 OS 使用端口指纹识别。这并不总是准确的,并且取决于您的服务器安全性和设置。感谢@MindSwipe 和@BlackSpy
  4. 也可以使用代理来发送此信息,这将是一个很好的方法,但这需要一些开销,通过适当的设置可以避免这些开销。感谢@BlackSpy 和@Clint

您可以利用 UserAgent 字符串

来自 MSDN 文档:

When you request a webpage, your browser sends a number of headers to the server hosting the site that you're visiting, as shown here.

GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Proxy-Connection: Keep-Alive
Host: microsoft.com

平台令牌将描述您的 OS(也在 link 中)

可以这样查询

 String ua = Request.UserAgent;  
 if (ua.Contains("Windows NT 10"))
     return "Windows 10";
 else if (ua.Contains("Linux"))
     return "Linux"

Link : https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/compatibility/ms537503(v=vs.85)?redirectedfrom=MSDN

Request.Headers["User-Agent"].ToString();

您所做的类似于 CMDB 清单扫描,windows 和 linux 有不同的策略。对于初学者,决定是使用代理还是无代理。

如果您走代理路线,则编写一个小型 .net 应用程序,公开一个端口进行查询,并为两者提供 OS 特定实现。然后让您的 IT 部门在所有设备上安装它。

无代理有点棘手。首先寻找应该为管理功能打开的端口(Windows 上的 WinRM - 虽然这里要小心 - 默认情况下它是关闭的,Linux 上的 SSH),或者你知道你的 IT 部门提供的任何服务默认情况下(希望在他们的基础 VM 映像上)。如果启用了 WinRM/SSH,并且您有可以编程方式查询的密码存储,那么您可以执行远程登录和 运行 提取任何进一步信息所需的任何代码。正如你所说你没有密码,你能做的最好的就是根据暴露的端口猜测。