繁体   English   中英

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

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

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

我们不会始终拥有查看此信息的凭据,因此 WMI 不是解决方案。

我只需要知道它是运行 Windows、Linux 还是其他。 以及操作系统的版本是什么。

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

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

结论

因此,根据可用和不可用的内容,以下是提出的选项。

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

你做的类似于CMDB库存扫描,windows和linux有不同的策略。 首先,决定是使用代理还是无代理。

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

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

您可以利用 UserAgent 字符串

来自 MSDN 文档:

当您请求网页时,您的浏览器会向托管您正在访问的站点的服务器发送许多标头,如下所示。

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

平台令牌将描述您的操作系统(也在链接中)

你可以这样查询

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

链接: 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM