C#: WMI 获取远程 Windows 主机信息
来源:互联网 发布:农村淘宝app苹果版下载 编辑:程序博客网 时间:2024/04/28 07:30
起步文档:
WMI 基本介绍
WMI调用基本步骤
一个简单的远程访问例子:(参考自MSDN: How To: Connect to a Remote Computer)
using System;using System.Management;namespace TestCaseProj{ public class WMI_Validate { public static void start() { try { //// 获取本机信息,注意这里不带ConnectionOptions参数; //ManagementScope scope = new ManagementScope("\\\\127.0.0.1\\root\\CIMv2"); // 获取远端主机信息,注意这里需要使用ConnectionOptions参数控制连接; ConnectionOptions options = new ConnectionOptions(); options.Username = "Administrator"; options.Password = "xxxxxxxxx"; options.EnablePrivileges = true; //获取尽可能高的权限; options.Impersonation = ImpersonationLevel.Impersonate; options.Authentication = AuthenticationLevel.PacketPrivacy; //加密数据流; // options.Authority = "ntdlmdomain:DOMAIN"; // options.Authority = "kerberose:DOMAIN"; ManagementScope scope = new ManagementScope("\\\\PAD1\\root\\CIMv2", options); scope.Connect(); //Query system for Operating System information ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); ManagementObjectCollection queryCollection = searcher.Get(); foreach (ManagementObject m in queryCollection) { // Display the remote computer information Console.WriteLine("Computer Name : {0}", m["csname"]); Console.WriteLine("Windows Directory : {0}", m["WindowsDirectory"]); Console.WriteLine("Operating System: {0}", m["Caption"]); Console.WriteLine("Version: {0}", m["Version"]); Console.WriteLine("Manufacturer : {0}", m["Manufacturer"]); } } catch (UnauthorizedAccessException e) { throw e; } catch (Exception) { throw; } } }}
可用的查询类
分为以下四大类:
- 硬件相关
- 操作系统相关
- 性能相关
- WMI配置相关
如上述例子中的Win32_OperatingSystem
就属于操作系统相关这一类。
各类具体包含哪些名称请查看MSDN: Win32 Provider
调试工具:
WMIC (Windows Management Instrumentation Command-line)
- 基本使用
- 命令参数详情
使用示例:
wmic /Trace:on /NODE:PAD /user:Administrator /password:xxx cpu
调试输出:
SUCCESS: IWbemLocator::ConnectServer(L”\PAD\ROOT\CIMV2”,
L”Administrator”, *, L”ms_409”, 0L, L””, NULL, -) Line: 2697
File: admin\wmi\wbem\tools\wmic\execengine.cppSUCCESS: CoSetProxyBlanket(-, RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_NONE,NULL, 6, 3, -, EOAC_NONE) Line: 2740 File:
admin\wmi\wbem\tools\wmic\execengine.cppSUCCESS: CoCreateInstanceEx(CLSID_WbemContext,
NULL,CLSCTX_INPROC_SERVER, 0, 1, -) Line: 2838 File:
admin\wmi\wbem\tools\wmic\execengine.cppSUCCESS: IWbemServices::ExecQuery(L”WQL”, L”SELECT * FROM
WIN32_PROCESSOR”, 0, NULL, -) Line: 319 File:
admin\wmi\wbem\tools\wmic\execengine.cpp
观察其中的IWbemLocator::ConnectServer method
可确定正常(或错误)的连接参数。
SUCCESS: IWbemLocator::ConnectServer(L”\PAD\ROOT\CIMV2”,
L”Administrator”, *, L”ms_409”, 0L, L””, NULL, -) Line: 2697
File: admin\wmi\wbem\tools\wmic\execengine.cpp
wmimgmt.msc(Windows管理体系结构控制台)
控制WMI访问参数,如权限等。
NET(确定远程登录用户名密码是否正确)
net use \\<RemoteComputerName>\C$ /u:<DomainName\UserName> "<password>" net use \\<RemoteComputerName>\ADMIN$ /u:<DomainName\UserName> "<password>"
dcomcnfg(组件服务)
限制远程过程调用 (RPC) 的动态端口分配(MSDN: How To Restrict TCP/IP Ports on Windows 2000 and Windows XP)
Wireshark(网络数据包分析工具)
查看WMI网络数据包是否正常。如检查远程主机是否响应WMI连接请求、decrpc数据包中登录用户名是否正确等。
WMI可能遇到的问题及解决方案
问题1:0x800706BA - RPC Server Unavailable。防火墙屏蔽了WMI通信所用的端口
解决 : 开启WMI相关的规则,如下
netsh advfirewall firewall set rule group="windows management instrumentation (wmi)" new enable=yes
问题2 : 0x80070005 - 访问被拒绝。造成此问题的原因有很多,一般先使用net工具检查用户名密码是否正确。如果问题依旧存在再从用户名、主机名等依次排查。
解决 :
net use \\<RemoteComputerName>\C$ /u:<DomainName\UserName> "<password>" net use \\<RemoteComputerName>\ADMIN$ /u:<DomainName\UserName> "<password>" // 注意,对于不在域中的主机,DomainName应该填其主机名。
其他问题及解决请参看:
1. MSDN: WMI Troubleshooting
2. WMI常见问题及解决方法
- C#: WMI 获取远程 Windows 主机信息
- C#,WMI获取系统信息
- 【WMI】WMI For C#/dotNet 用WMI获取系统信息
- 【PERL】使用wmi获取windows硬件信息
- 【WMI】WMI For C++/COM 获取系统信息过程
- Python获取本地和远程主机信息
- 探测远程Windows主机的NetBIOS信息
- 【WMI-5】WMI For C#/dotNet 用WMI获取系统信息
- WMI获取磁盘信息
- WMI获取硬件信息
- WMI获取系统信息
- WMI获取硬件信息
- WMI获取硬件信息
- 主机性能监控之wmi 获取系统信息及内存性能信息
- Python用WMI模块获取Windows系统的硬件信息
- Python WMI获取Windows系统信息 监控系统
- debian 上用wmi获取远端windows server 2003(被管理者) 的wmi信息
- 【C++】WMI获取系统硬件信息(CPU/DISK/NetWork etc)
- 排序之冒泡排序法
- R批量修改文件名
- Android optionsMenu,菜单的使用
- NULL字符串和空字符串的区别
- 手势识别器(UIGestureRecognizer)- UISwipeGestureRecognizer(轻扫)
- C#: WMI 获取远程 Windows 主机信息
- 关于直接插入排序算法的Bug
- Git解决文件冲突、强制更新
- 关于Float.MIN_VALUE 和 Float.MAX_VALUE
- Android Studio第一次启动失败的解决办法
- 《背包九讲》
- leetcode:Jump Game 【Java】
- 算法导论之分治策略:最大子数组问题
- 蓝桥网 算法提高 铺地毯