资产探测 主机扫描 如何获取到终端的型号和序列号等硬件相关信息 请举例说明
4条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在Java中,获取远程主机的硬件信息,特别是型号和序列号,通常需要借助于一些系统管理协议(如SNMP、WMI)或者通过操作系统的特定API。这里我们主要介绍如何通过SNMP(简单网络管理协议)来获取这些信息。
首先,你需要安装一个Java SNMP库,例如Jpype(用于调用Python的SNMP模块)或者SNMP4J(纯Java实现)。在这里,我们将使用SNMP4J作为示例。
- 添加SNMP4J依赖: 如果你使用Maven,将以下依赖添加到pom.xml文件中:
<dependencies> <dependency> <groupId>org.snmp4j</groupId> <artifactId>snmp4j</artifactId> <version>2.8.3</version> </dependency> </dependencies>
- 编写Java代码:
import org.snmp4j.smi.OID; import org.snmp4j.smi.VariableBinding; import org.snmp4j.Snmp; import org.snmp4j.mp.MPv2c; import org.snmp4j.security.USM; import org.snmp4j.security.UserTarget; import org.snmp4j.security.SecurityModels; import org.snmp4j.security.SecurityProtocols; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.TransportMapping; import org.snmp4j.MessageDispatcherImpl; import org.snmp4j.log.LogAdapter; import org.snmp4j.log.JavaLogFactory; import java.io.IOException; import java.util.List; public class SnmpScanner { private static final LogAdapter logger = JavaLogFactory.getLogger(SnmpScanner.class); public void scan(String host, String community) throws IOException { // 设置日志 LogAdapter.setLoggerFactory(new JavaLogFactory()); // 创建消息调度器 MessageDispatcherImpl dispatcher = new MessageDispatcherImpl(); // 初始化安全模型和协议 USM usm = new USM(SecurityProtocols.getInstance(), new OctetString("authKey"), new OctetString("privKey")); SecurityModels.getInstance().addSecurityModel(usm); SecurityProtocols.getInstance().addDefaultProtocols(); // 创建目标用户 UserTarget target = new UserTarget(); target.setCommunity(new OctetString(community)); target.setVersion(MPv2c.PROTOCOL_ID); target.setAddress(GenericAddress.parse(host)); // 创建传输映射 TransportMapping transport = new DefaultUdpTransportMapping(); transport.listen(); // 创建SNMP代理 Snmp snmp = new Snmp(dispatcher, transport); snmp.getUSM().addUser(target.getUser(), target); try { // 获取OID列表,包括主机名、系统描述、系统对象ID、硬件序列号等 OID[] oids = {new OID(".1.3.6.1.2.1.1.5.0"), // 主机名 new OID(".1.3.6.1.2.1.1.1.0"), // 系统描述 new OID(".1.3.6.1.2.1.1.2.0"), // 系统对象ID new OID(".1.3.6.1.2.1.25.3.2.1.3")}; // 硬件序列号 // 发送GET请求 List<VariableBinding> results = snmp.get(new VariableBinding[oids.length], target); // 输出结果 for (int i = 0; i < oids.length; i++) { System.out.println("OID: " + oids[i] + ", Value: " + results.get(i).getVariable()); } } finally { // 关闭SNMP代理 snmp.close(); } } public static void main(String[] args) throws IOException { if (args.length != 2) { System.err.println("Usage: SnmpScanner <host> <community>"); return; } SnmpScanner scanner = new SnmpScanner(); scanner.scan(args[0], args[1]); } }
- 运行程序:
在命令行中运行
java SnmpScanner <target_host> <community_string>
,其中<target_host>
是你要扫描的目标主机IP地址或域名,<community_string>
是SNMP的共享社区字符串。注意,目标设备必须配置了SNMP服务,并且允许从你的源IP地址进行访问。
注意:并非所有设备都支持获取硬件序列号等信息,这取决于设备制造商和SNMP实现。有些设备可能只提供基本的系统信息。此外,某些高级信息可能需要更高级别的SNMP权限。在尝试获取敏感信息时,请确保你有合法的理由并遵守相关法规。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 winform的chart曲线生成时有凸起
- ¥15 msix packaging tool打包问题
- ¥15 finalshell节点的搭建代码和那个端口代码教程
- ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
- ¥15 Centos / PETSc / PETGEM
- ¥15 centos7.9 IPv6端口telnet和端口监控问题
- ¥120 计算机网络的新校区组网设计
- ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
- ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
- ¥20 海浪数据 南海地区海况数据,波浪数据