windows平台通过csharp调用WMI操作远程电脑(一)

.NET
482
0
0
2022-05-07
标签   C#

在实施项目的过程中,特别是包含客户端较多的情况下, 我们经常需要重复的对几十上百台甚至更多电脑执行配置或者软件安装、重启等操作。

但是这样手动一台一台的远程,一来效率肯定很慢,而且操作人员也会很辛苦。

刚好最近在项目中也遇到了相同的问题,于是在网上搜索解决方案时,了解到WMI这个东西,研究一番后,顺利的解决了上面提到的问题。

先简单介绍下WMI,WMI(Windows Management Instrumentation,Windows管理规范)其实是一种对Windows进行管理的工具,它的管理范围不限于本机,只要知道Windows的用户名密码,并且开了WMI服务(一般PC都是默认开启了的)的机器都可以进行管理(包括但不限于查询机器的硬盘、注册表信息、控制机器执行一些程序、共享机器的某些文件或文件夹等等)

关键代码如下,都有注释,一看便知:

ConnectionOptions ops =new ConnectionOptions(); // 新建连接选项
ops.Username ="Administrator"; // 远程机器的用户名,假设为Administrator
ops.Password ="123456"; // 对应用户名的密码
ops.EnablePrivileges =true;
string address ="127.0.0.1"; // 远程机器IP地址
ManagementScope scope =new ManagementScope(@"\\"+ address +@"\root\cimv2", ops); // 新建一个到远程机器的连接,\root\cimv2表示命名空间,在连接时要指定连接到哪个命令空间,有很多命名空间,不同命名空间,能够执行的操作也不一样,可以百度搜索wmi命名空间
scope.Connect(); // 进行连接

上面代码是使用WMI登录到远程机器,下面是登录成功后,示例操作注册表,当然也可以做其他操作:

if(scope.IsConnected) { // 先判断连接是不是成功 
    ObjectGetOptions obj =new ObjectGetOptions(null, System.TimeSpan.MaxValue, true); // 对象接收选项 
    ManagementClass registry = 
    new ManagementClass(scope, new ManagementPath("StdRegProv"), obj);
    // 生成远程的StdRegProv对象 
    ManagementBaseObject inParams =
    registry.GetMethodParameters("GetStringValue");
    // 获得StdRegProv的GetStringValue()方法的输入参数
    inParams["hDefKey"] =0x80000002; // 代表HKEY_LOCAL_MACHINE
    inParams["sSubKeyName"] ="SOFTWARE\7-Zip"; // 注册表的键
    inParams["sValueName"] ="Path"; // 注册表值的名字 
    ManagementBaseObject outParams =
    registry.InvokeMethod("GetStringValue", inParams, null); // 根据inParams中的参数调用GetStringValue()方法 
    if((uint)outParams.Properties["ReturnValue"].Value ==0) {
        // 如果返回0表明方法执行成功
        Console.WriteLine((string)outParams.Properties["sValue"].Value);
    } else {
        Console.WriteLine("GetStringValue() failed.");
    }
}

关于GetStringValue()的声明:

uint32 GetStringValue(
[in] uint32 hDefKey =2147483650,
[in] string sSubKeyName,
[in] string sValueName,
[out] string sValue
);

关于hDefKey的定义:

HKEY_CLASSES_ROOT (2147483648 (0x80000000))

HKEY_CURRENT_USER (2147483649 (0x80000001))

HKEY_LOCAL_MACHINE (2147483650 (0x80000002))

HKEY_USERS (2147483651 (0x80000003))

HKEY_CURRENT_CONFIG (2147483653 (0x80000005))

HKEY_DYN_DATA (2147483654 (0x80000006))

当然,WMI是很强大的,你能通过远程桌面进行的操作,在这里都可以,至于使用方法,msdn有全面的文档

下一篇介绍wmi cim studio的使用,并将在系列最后附上完整demo