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;            }        }    }}

可用的查询类

分为以下四大类:

  1. 硬件相关
  2. 操作系统相关
  3. 性能相关
  4. WMI配置相关

如上述例子中的Win32_OperatingSystem就属于操作系统相关这一类。
各类具体包含哪些名称请查看MSDN: Win32 Provider

调试工具:

WMIC (Windows Management Instrumentation Command-line)

  1. 基本使用
  2. 命令参数详情

使用示例:

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.cpp

SUCCESS: CoSetProxyBlanket(-, RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_NONE,NULL, 6, 3, -, EOAC_NONE) Line: 2740 File:
admin\wmi\wbem\tools\wmic\execengine.cpp

SUCCESS: CoCreateInstanceEx(CLSID_WbemContext,
NULL,CLSCTX_INPROC_SERVER, 0, 1, -) Line: 2838 File:
admin\wmi\wbem\tools\wmic\execengine.cpp

SUCCESS: 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常见问题及解决方法

0 0