C# - 从 IP 地址/DNS 名称获取操作系统
C# - Get Operating System from IP address / DNS Name
我们正在编写一个管理服务器的应用程序,我需要能够查看网络中任何远程计算机上的操作系统 运行。
我们不会总是有凭据来查看此信息,因此 WMI 不是解决方案。
我只需要知道,是 运行 Windows、Linux 还是其他。 OS.
是什么版本
目前我们正在从这些服务器上的数据库中获取此信息。但我想在不询问数据库的情况下执行此操作。
如果我只有 IP 地址或 DNS 名称,是否可以获取此信息?没有凭据。 C#/.Net Core 解决方案将是理想的。或者任何可以实现此目的的协议也可以,我会将其转换为 C#。
结论
因此,根据可用的和不可用的,这里是提出的选项。
- 如果您在远程计算机上有管理员帐户,WMI 是最好的方法。 Example on docs.microsoft.com here
- 如果您可以访问像 SQL 这样的数据库,您可以查询 SQL 到 return 的 OS 信息。这将从数据库到数据库以及从版本到版本非常重要。所以研究是必不可少的。
- 使用 nmap 之类的东西会让你 OS 使用端口指纹识别。这并不总是准确的,并且取决于您的服务器安全性和设置。感谢@MindSwipe 和@BlackSpy
- 也可以使用代理来发送此信息,这将是一个很好的方法,但这需要一些开销,通过适当的设置可以避免这些开销。感谢@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"
或
Request.Headers["User-Agent"].ToString();
您所做的类似于 CMDB 清单扫描,windows 和 linux 有不同的策略。对于初学者,决定是使用代理还是无代理。
如果您走代理路线,则编写一个小型 .net 应用程序,公开一个端口进行查询,并为两者提供 OS 特定实现。然后让您的 IT 部门在所有设备上安装它。
无代理有点棘手。首先寻找应该为管理功能打开的端口(Windows 上的 WinRM - 虽然这里要小心 - 默认情况下它是关闭的,Linux 上的 SSH),或者你知道你的 IT 部门提供的任何服务默认情况下(希望在他们的基础 VM 映像上)。如果启用了 WinRM/SSH,并且您有可以编程方式查询的密码存储,那么您可以执行远程登录和 运行 提取任何进一步信息所需的任何代码。正如你所说你没有密码,你能做的最好的就是根据暴露的端口猜测。
我们正在编写一个管理服务器的应用程序,我需要能够查看网络中任何远程计算机上的操作系统 运行。
我们不会总是有凭据来查看此信息,因此 WMI 不是解决方案。
我只需要知道,是 运行 Windows、Linux 还是其他。 OS.
是什么版本目前我们正在从这些服务器上的数据库中获取此信息。但我想在不询问数据库的情况下执行此操作。
如果我只有 IP 地址或 DNS 名称,是否可以获取此信息?没有凭据。 C#/.Net Core 解决方案将是理想的。或者任何可以实现此目的的协议也可以,我会将其转换为 C#。
结论
因此,根据可用的和不可用的,这里是提出的选项。
- 如果您在远程计算机上有管理员帐户,WMI 是最好的方法。 Example on docs.microsoft.com here
- 如果您可以访问像 SQL 这样的数据库,您可以查询 SQL 到 return 的 OS 信息。这将从数据库到数据库以及从版本到版本非常重要。所以研究是必不可少的。
- 使用 nmap 之类的东西会让你 OS 使用端口指纹识别。这并不总是准确的,并且取决于您的服务器安全性和设置。感谢@MindSwipe 和@BlackSpy
- 也可以使用代理来发送此信息,这将是一个很好的方法,但这需要一些开销,通过适当的设置可以避免这些开销。感谢@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"
或
Request.Headers["User-Agent"].ToString();
您所做的类似于 CMDB 清单扫描,windows 和 linux 有不同的策略。对于初学者,决定是使用代理还是无代理。
如果您走代理路线,则编写一个小型 .net 应用程序,公开一个端口进行查询,并为两者提供 OS 特定实现。然后让您的 IT 部门在所有设备上安装它。
无代理有点棘手。首先寻找应该为管理功能打开的端口(Windows 上的 WinRM - 虽然这里要小心 - 默认情况下它是关闭的,Linux 上的 SSH),或者你知道你的 IT 部门提供的任何服务默认情况下(希望在他们的基础 VM 映像上)。如果启用了 WinRM/SSH,并且您有可以编程方式查询的密码存储,那么您可以执行远程登录和 运行 提取任何进一步信息所需的任何代码。正如你所说你没有密码,你能做的最好的就是根据暴露的端口猜测。