精华内容
下载资源
问答
  • windows wmi

    2017-12-27 10:33:00
    官网:https://msdn.microsoft.com/en-us/library/aa394132(v...WMI使用的WIN32_类库名:http://blog.csdn.net/u011164819/article/details/51249870 https://www.cnblogs.com/chengulv/archive/2012/12/29/2839303....

    官网:https://msdn.microsoft.com/en-us/library/aa394132(v=vs.85).aspx

    WMI使用的WIN32_类库名:http://blog.csdn.net/u011164819/article/details/51249870

    https://www.cnblogs.com/chengulv/archive/2012/12/29/2839303.html

     

    Win32_DiskDrive 硬盘 参数说明

    Availability  --设备的状态。
    BytesPerSector  --在每个扇区的物理磁盘驱动器的字节数。
    Capabilities  --媒体访问设备的能力阵列。
    CapabilityDescriptions  --更详细的解释为任何在功能阵列表示的访问设备的功能的列表
    Caption  --对象的序列号
    CompressionMethod  --设备所使用的算法或工具,以支持压缩。
    ConfigManagerErrorCode  --Windows配置管理器错误代码。
    ConfigManagerUserConfig  --如果为True,该设备使用用户定义的配置。
    CreationClassName  --代表所在的类
    DefaultBlockSize  --此设备默认块大小,以字节为单位。
    Description  --描述
    DeviceID  --磁盘驱动器与系统中的其他设备的唯一标识符
    ErrorCleared  --如果为True,报告LastErrorCode错误现已清除。
    ErrorDescription  --关于可能采取的纠正措施记录在LastErrorCode错误,和信息的详细信息。
    ErrorMethodology  --误差检测和校正的类型被此设备支持。
    FirmwareRevision  --修订制造商分配的磁盘驱动器固件。
    Index  --给定的驱动器的物理驱动器号。此属性由GetDriveMapInfo方法填补。 0xFF的值表示给定的驱动器不映射到物理驱动器。
    InstallDate  --日期和时间对象安装。此属性不需要的值以表示已安装的对象。
    InterfaceType  --物理磁盘驱动器的类型 (IDE、sata)
    LastErrorCode  --报告的逻辑设备上一个错误代码。
    Manufacturer  --制造商名称
    MaxBlockSize  --最大块的大小,以字节为单位,通过该设备访问的媒体。
    MaxMediaSize  --最大介质尺寸的介质,以KB为单位,由该设备支持。
    MediaLoaded  --如果真,媒体为一磁盘驱动器加载,这意味着该设备具有一个可读的文件系统和可访问。对于固定磁盘驱动器,该属性将始终为TRUE。
    MediaType  --由该设备使用或访问的媒体类型。
    MinBlockSize  --最小的块大小,以字节为单位,通过该设备访问的媒体。
    Model  --磁盘驱动器的制造商的型号。
    Name  --名字
    NeedsCleaning  --如果真,媒体接入设备需要清洁。不论手动或自动清洗是可能显示在Capabilities属性。
    NumberOfMediaSupported  --可被支持的或插入的介质最大数量
    Partitions  --此物理磁盘驱动器上的分区是由操作系统识别的数目。
    PNPDeviceID  --即插即用逻辑设备的播放设备标识符。
    PowerManagementCapabilities  --逻辑设备的特定功率相关的能力阵列。
    PowerManagementSupported  --如果为True,该设备可以是电源管理
    SCSIBus  --盘驱动器的SCSI总线号。
    SCSILogicalUnit  --SCSI逻辑单元的磁盘驱动器的号码(LUN)。
    SCSIPort  --盘驱动器的SCSI端口号。
    SCSITargetId  --SCSI标识符号码的磁盘驱动器的。
    SectorsPerTrack  --在每个轨道此物理磁盘驱动器扇区数。
    SerialNumber  --由制造商分配的号来识别物理介质。
    Signature  --磁盘识别。该属性可以被用于识别一个共享资源。
    Size  --磁盘大小
    Status  --对象的当前状态。
    StatusInfo  --逻辑设备的状态
    SystemCreationClassName  --该作用域计算机的CreationClassName属性的值。
    SystemName  --系统名称
    TotalCylinders  --物理磁盘驱动器上柱面总数。该值可能不准确
    TotalHeads  --磁盘驱动器上磁头总数。该值可能不准确。
    TotalSectors  --物理磁盘驱动器上的扇区总数。该值可能不准确。
    TotalTracks  --物理磁盘驱动器上的曲目总数。该值可能不准确。
    TracksPerCylinder  --在物理磁盘驱动器上的每个柱面轨迹的数量。该值可能不准确。

     

    Win32_PhysicalMemory 内存条 参数说明

    uint64   Capacity  --获取内存容量(单位KB)
    string   Caption   --物理内存还虚拟内存
    uint32   ConfiguredClockSpeed  --配置时钟速度
    uint32   ConfiguredVoltage   --配置电压
    string   CreationClassName   --创建类名(就是更换这个类的名字)
    uint16   DataWidth   --获取内存带宽
    string   Description  --描述更Caption一样
    string   DeviceLocator  --获取设备定位器
    uint16   FormFactor    --构成因素
    boolean  HotSwappable  --是否支持热插拔
    datetime InstallDate  --安装日期(无值)
    uint16   InterleaveDataDepth  --数据交错深度
    uint32   InterleavePosition   --交错的位置
    string   Manufacturer    --生产商
    uint32   MaxVoltage  --最大电压
    uint16   MemoryType  --内存类型
    uint32   MinVoltage  --最小电压
    string   Model  --型号
    string   Name  --名字
    string   OtherIdentifyingInfo  --其他识别信息
    string   PartNumber  --零件编号
    uint32   PositionInRow  --行位置
    boolean  PoweredOn  --是否接通电源
    boolean  Removable  --是否可拆卸
    boolean  Replaceable  --是否可更换
    string   SerialNumber  --编号
    string   SKU  --SKU号
    uint32   SMBIOSMemoryType  --SMBIOS内存类型
    uint32   Speed  --速率
    string   Status  --状态
    string   Tag  --唯一标识符的物理存储器
    uint16   TotalWidth  --总宽
    uint16   TypeDetail  --类型详细信息
    string   Version  --版本信息

     

    Win32_Processor CPU 参数说明

    AddressWidth  --在32位操作系统,该值是32,在64位操作系统是64。
    Architecture  --所使用的平台的处理器架构。
    AssetTag  --代表该处理器的资产标签。
    Availability  --设备的状态。
    Caption  --设备的简短描述
    Characteristics  --处理器支持定义的功能
    ConfigManagerErrorCode  --Windows API的配置管理器错误代码
    ConfigManagerUserConfig  --如果为TRUE,该装置是使用用户定义的配置
    CpuStatus  --处理器的当前状态
    CreationClassName  --出现在用来创建一个实例继承链的第一个具体类的名称
    CurrentClockSpeed  --处理器的当前速度,以MHz为单位
    CurrentVoltage  --处理器的电压。如果第八位被设置,位0-6包含电压乘以10,如果第八位没有置位,则位在VoltageCaps设定表示的电压值。 CurrentVoltage时SMBIOS指定的电压值只设置
    DataWidth  --在32位处理器,该值是32,在64位处理器是64
    Description  --描述
    DeviceID  --在系统上的处理器的唯一标识符
    ErrorCleared  --如果为真,报上一个错误代码的被清除
    ErrorDescription  --错误的代码描述
    ExtClock  --外部时钟频率,以MHz为单位
    Family  --处理器系列类型
    InstallDate  --安装日期
    L2CacheSize  --二级缓存大小
    L2CacheSpeed  --二级缓存处理器的时钟速度
    L3CacheSize  --三级缓存的大小
    L3CacheSpeed  --三级缓存处理器的时钟速度
    LastErrorCode  --报告的逻辑设备上一个错误代码
    Level  --处理器类型的定义。该值取决于处理器的体系结构
    LoadPercentage  --每个处理器的负载能力,平均到最后一秒
    Manufacturer   --处理器的制造商
    MaxClockSpeed  --处理器的最大速度,以MHz为单位
    Name  --处理器的名称
    NumberOfCores  --芯为处理器的当前实例的数目。核心是在集成电路上的物理处理器
    NumberOfEnabledCore  --每个处理器插槽启用的内核数
    NumberOfLogicalProcessors  --用于处理器的当前实例逻辑处理器的数量
    OtherFamilyDescription  --处理器系列类型
    PartNumber  --这款处理器的产品编号制造商所设置
    PNPDeviceID  --即插即用逻辑设备的播放设备标识符
    PowerManagementCapabilities  --逻辑设备的特定功率相关的能力阵列
    PowerManagementSupported  --如果为TRUE,该装置的功率可以被管理,这意味着它可以被放入挂起模式
    ProcessorId  --描述处理器功能的处理器的信息
    ProcessorType  --处理器的主要功能
    Revision  --系统修订级别取决于体系结构
    Role  --所述处理器的作用
    SecondLevelAddressTranslationExtensions  --如果为True,该处理器支持用于虚拟地址转换扩展
    SerialNumber --处理器的序列号
    SocketDesignation  --芯片插座的线路上使用的类型
    Status  --对象的当前状态
    StatusInfo  --对象的当前状态信息
    Stepping  --在处理器家族处理器的版本
    SystemCreationClassName  --创建类名属性的作用域计算机的价值
    SystemName  --系统的名称
    ThreadCount  --每个处理器插槽的线程数
    UniqueId  --全局唯一标识符的处理器
    UpgradeMethod  --CPU插槽的信息
    Version  --依赖于架构处理器的版本号
    VirtualizationFirmwareEnabled  --如果真,固件可以虚拟化扩展
    VMMonitorModeExtensions  --如果为True,该处理器支持Intel或AMD虚拟机监控器扩展。
    VoltageCaps  --该处理器的电压的能力

     

    硬件风扇

    https://technet.microsoft.com/zh-cn/library/aa394146(v=vs.85).aspx

     

    温度传感

    https://msdn.microsoft.com/en-us/library/aa394493(v=vs.85).aspx

     

    电池

    https://msdn.microsoft.com/en-us/library/aa394074(v=vs.85).aspx

    EstimatedChargeRemaining属性返回剩余电量的百分比

    EstimatedRunTime属性返回剩余时间(分钟)

     

    展开全文
  • windows wmi 介绍 Windows Management Instrumentation(WMI)是Windows的一组扩展,可提供有关计算机系统的信息和通知。 WMI允许脚本语言(如VBScript或Windows PowerShell)在本地和远程管理Microsoft Windows...

    windows wmi

    介绍

    Windows Management Instrumentation(WMI)是Windows的一组扩展,可提供有关计算机系统的信息和通知。 WMI允许脚本语言(如VBScript或Windows PowerShell)在本地和远程管理Microsoft Windows计算机。 WMI已预安装在Windows 2000和更高版本的操作系统中。 可以从Windows NT,Windows 95和Windows 98下载该文件。

    WMI允许您执行各种操作,包括但不限于:

    • 获取正在运行的进程的列表
    • 获取已安装程序的列表
    • 缺少启动程序
    • 获取磁盘使用率
    • 获取计算机的品牌,型号和序列号
    • 获取当前的内存和CPU使用率
    • 创建新流程时获取通知
    • 在计算机进入或退出睡眠模式时获取通知
    • 创建并终止进程
    • 关闭电脑

    您可以从位于以下位置的Microsoft文档中找到有关WMI的更多信息:

    WMI参考(Windows) 感谢NeoPa提供的链接。 示例VBA实施

    以下是VBA中的示例实现,该实现监视何时要将计算机置于睡眠模式并在该事件发生时退出Access。

    您将需要添加对Microsoft WMI脚本V#。#库的引用。 第一个代码块在类模块中。 第二个代码块采用某种形式。

    类模块

    Option Explicit 
    'This is to allow the variable sink to raise events
    Dim WithEvents sink As SWbemSink 
    Private Sub sink_OnObjectReady(ByVal objWbemObject As SWbemObject, ByVal objWbemAsyncContext As SWbemNamedValueSet)
        'Event Type 4 is the code for entering sleep mode
        If objWbemObject.EventType = 4 Then
            Application.Quit
        End If
    End Sub 
    Private Sub Class_Initialize()
        'Creates a new WMI object
        Dim services As SWbemServices 
        'Creates the callback object
        Set sink = New SWbemSink 
        'Gets the WMI service. The period in the string is used to reference the local computer.
        'You may use an IP address if you wish to query a remote computer.
        Set services = GetObject("winmgmts:\\.\root\cimv2") 
        'Executes an asynchronous notification query
        services.ExecNotificationQueryAsync sink, "Select * from Win32_PowerManagementEvent"
    End Sub
    形成
    Option Compare Database
    Option Explicit
    Dim sinker As Class1 
    Private Sub Form_Load()
        Set sinker = New Class1
    End Sub
    样本查询

    查询以返回有关该设备是本地驱动器的存储设备的信息。

    SELECT * 
    FROM Win32_LogicalDisk 
    WHERE DriveType = 3
    查询以返回有关CPU的信息。
    SELECT * 
    FROM Win32_Processor
    在本地/远程计算机上创建进程的代码。
    Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!//./root/cimv2:Win32_Process")
    objWMI.Create "C:\Windows\system32\mstsc.exe", Null, Null, intProcID
    用于根据进程ID终止进程的代码。
    Set objAppList = objWMI.ExecQuery("Select * from Win32_Process where ProcessID = '"& strID &"'",,48)
    For Each objApp In objAppList
       objApp.Terminate
    Next
    查询以ping计算机。
    SELECT * 
    FROM Win32_PingStatus 
    WHERE Address = '" & sAddress & "'"
    创建进程时的通知查询。 WITHIN 1是一个轮询间隔。
    SELECT * 
    FROM __InstanceCreationEvent 
    WITHIN 1 
    WHERE TargetInstance ISA 'Win32_Process'
    通知查询,用于查询网络连接状态何时发生变化。 例如,当网络共享上升或下降时。
    SELECT * 
    FROM __InstanceModificationEvent 
    WITHIN 1 
    WHERE Targetinstance ISA 'Win32_NetworkConnection'

    翻译自: https://bytes.com/topic/access/insights/942725-windows-management-instrumentation-wmi-tutorial

    windows wmi

    展开全文
  • wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行脚本等等。wmi4j下载用Maven的朋友们可以直接引入,groupId=...

    wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行脚本等等。

    wmi4j下载

    用Maven的朋友们可以直接引入,groupId=cn.chenlichao, artifactId=wmi4j, version=0.9。 源码地址: Github: https://github.com/chenlichao-cn/wmi4j使用其他构件框架的朋友,可以去maven中央库或者http://maven.oschina.net查询wmi4j,当然要记得下载它的依赖包:org.glassfish.main.external:j-interop-repackaged:4.0

    org.slf4j:slf4j-api:1.7.7

    org.apache.commons:commons-lang3:3.1

    使用wmi4j管理Windows服务

    用wmi4j管理很方便,少量代码就可以完成功能,下面我们用一个实际的例子来演示如何获取服务列表,查询服务,获取指定服务状态,启动服务和停止服务几个最常用的功能。

    WMI相关的文档,请参考微软官方文档: WMI Referencepublic static void main(String[] args) {

    //设定连接参数

    String server = "192.168.1.201";

    String username = "administrator";

    String password = "password";

    String namespace = "root\\cimv2";

    //构建连接器

    SWbemLocator locator = new SWbemLocator(server,username,password,namespace);

    try {

    //连接远程服务器

    SWbemServices wbemServices = locator.connectServer();

    //遍历服务列表

    SWbemObjectSet services = wbemServices.instancesOf("Win32_Service");

    System.out.println("服务数量: " + services.getCount());

    Iterator iterator = services.iterator();

    while(iterator.hasNext()) {

    SWbemObject service = iterator.next();

    System.out.println(service.getObjectText());

    System.out.println("-----------------------------------------------");

    break; //服务很多,就只打一个吧

    }

    //查询Windows开头的服务

    SWbemObjectSet winServices = wbemServices.execQuery(

    "select * from Win32_Service where DisplayName like ‘Windows%‘");

    System.out.println("Windows开头的服务数: " + winServices.getCount());

    //通过服务名,直接获取服务。

    //注意: 服务名不是services.msc列表里显示的名称,显示的名称是DisplayName属性,

    //而get方法必须使用主键属性Name. 例如: Application Management服务,

    //在services.msc是这样显示的, 但它服务名是AppMgmt, 可以通过属性查看。

    SWbemObject dhcpClient = wbemServices.get("Win32_Service.Name=‘AppMgmt‘");

    System.out.println("服务名: " + dhcpClient.getPropertyByName("Name")

    .getStringValue());

    System.out.println("显示名: " + dhcpClient.getPropertyByName("DisplayName")

    .getStringValue());

    //获取服务状态

    System.out.println("状态: " + dhcpClient.getPropertyByName("State").getStringValue());

    //启动服务

    dhcpClient.execMethod("StartService");

    System.out.println("启动后的状态: " + wbemServices.get("Win32_Service.Name=‘AppMgmt‘")

    .getPropertyByName("State").getStringValue());

    //停止服务

    dhcpClient.execMethod("StopService");

    System.out.println("再次停止后的状态: "

    + wbemServices.get("Win32_Service.Name=‘AppMgmt‘")

    .getPropertyByName("State").getStringValue());

    } catch (WMIException e) {

    e.printStackTrace();

    } catch (UnknownHostException e) {

    e.printStackTrace();

    }

    }

    原文:http://leaze.blog.51cto.com/83088/1559263

    展开全文
  • c++ windows wmi修改网卡ip+dns 注意事项: 项目必须以管理员权限运行 参考main.cpp使用方法 网卡的key可以从注册表获取, 路径: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\...

    项目下载地址: https://github.com/w123l123h/netConfig

    在win7/win10上都测试通过

    注意事项:

    1. 项目必须以管理员权限运行
    2. 参考main.cpp使用方法
    3. 网卡的key可以从注册表获取, 路径: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
    4. 网卡key对应的中文名可以从注册表获取, 路径: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network{4D36E972-E325-11CE-BFC1-08002BE10318}\

    注册表查看

    网卡配置

    注册表地址: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
    in

    网卡中文名

    (和windows系统"控制面板\网络和 Internet\网络和共享中心"显示的名字一致)
    注册表地址: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network{4D36E972-E325-11CE-BFC1-08002BE10318}
    在这里插入图片描述

    代码:

    main.cpp

    //main.cpp:
    
    #include <iostream>
    #include <locale>
    #include <string>
    #include <codecvt>
    #include "net_config.h"
    
    #pragma execution_character_set("utf-8")
    
    using namespace std;
    
    int main()
    {
    	std::locale::global(std::locale(""));
    
    	NetConfig config;
    	//网卡的key可以从注册表获取, 路径: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
    	config.set_key("{cd574b17-73e1-42df-a50c-f95d7f15c1d0}");
    
    	//设置静态ip之前要调用下enable_dhcp, 可以把以前设置的ip和网关都清空, 否则注册表会有多个ip信息
    	if (config.enable_dhcp()) {
    		cout << "enable_dhcp success" << endl;
    	}
    	else {
    		cout << "error code: " << config.get_last_error_code() << endl;
    	}
    	
    	if (config.set_ip_config("192.168.1.100", "255.255.255.0", "192.168.1.1")) {
    		cout << "set_ip_config success" << endl;
    	}
    	else {
    		cout << "error code: " << config.get_last_error_code() << endl;
    	}
    
    	if (config.set_dns("255.255.255.0", "")) {
    		cout << "set_dns success" << endl;
    	}
    	else {
    		cout << "error code: " << config.get_last_error_code() << endl;
    	}				
    	
    	cin.get();
    	return 0;
    }
    

    net_config.h

    //net_config.h
    
    #pragma once
    
    #include <string>
    #include <memory>
    #include <vector>
    #include <Wbemidl.h>
    
    class NetConfig
    {
    public:
    	NetConfig() {}
    	NetConfig(const std::string &key) 
    		:key_(key){ }
    	~NetConfig();
    
    	//设置网络设备GUID
    	void set_key(const std::string &key) {
    		clear();
    		key_ = key;
    	}
    	//启用DHCP
    	bool enable_dhcp();
    	//启动静态IP,设置IP,掩码,网关
    	bool set_ip_config(const std::string &ip, const std::string &mask, const std::string &gateway);
    	bool set_ip_config(const std::string &ip, const std::string &mask);
    	//设置网关
    	bool set_gateway(const std::string &gateway);
    	//设置DNS地址
    	bool set_dns(const std::string &default_dns, const std::string &backup_dns);
    	//设置自动DNS
    	bool set_auto_dns();
    
    	int get_last_error_code()const {
    		return last_error_code_;
    	}
    
    	void clear();
    
    private:
    	NetConfig(const NetConfig &rhs) = delete;
    	NetConfig &operator = (const NetConfig &rhs) = delete;
    
    private:
    	//初始化
    	bool init();
    	//创建COM数组
    	std::shared_ptr<SAFEARRAY> create_SAFEARRAY(const std::vector<std::string> &args);
    	bool set_dns_base(bool is_auto, const std::string &default_dns, const std::string &backup_dns);
    	bool exec_method(const wchar_t *method, IWbemClassObject *params_instance);
    
    private:
    	std::string key_;
    	bool is_init_ = false;
    	IWbemLocator* p_instance_ = NULL;
    	IWbemServices* p_service_ = NULL;
    	IEnumWbemClassObject* p_enum_ = NULL;
    	IWbemClassObject *p_obj_ = NULL;
    	IWbemClassObject *p_config = NULL;
    	VARIANT path_;
    	int last_error_code_ = 0;
    };
    

    net_config.cpp

    //net_config.cpp
    
    #include "net_config.h"
    #include <codecvt>
    #include <atlbase.h>
    #include <comutil.h>
    #ifdef _DEBUG
    #include <iostream>
    #endif
    
    #pragma comment(lib, "wbemuuid.lib")
    #pragma comment(lib, "comsuppw.lib")
    
    #pragma execution_character_set("utf-8")
    
    using namespace std;
    
    NetConfig::~NetConfig()
    {
    	clear();
    }
    
    bool NetConfig::enable_dhcp()
    {
    	if (!init())
    		return false;
    	return exec_method(L"EnableDHCP", NULL);
    }
    
    bool NetConfig::set_ip_config(const std::string & ip, const std::string & mask, const std::string & gateway)
    {
    	if (set_ip_config(ip, mask)) {
    		return set_gateway(gateway);
    	}
    	return false;
    }
    
    bool NetConfig::set_ip_config(const std::string & ip, const std::string & mask)
    {
    	bool rt = false;
    	if (!init())
    		return rt;
    
    	IWbemClassObject *params = NULL;
    	IWbemClassObject *paramsInst = NULL;
    	p_config->GetMethod(_bstr_t("EnableStatic"), 0, &params, NULL);
    	params->SpawnInstance(0, &paramsInst);
    
    	auto p1 = create_SAFEARRAY({ ip });
    	VARIANT paramVt;
    	paramVt.vt = VT_ARRAY | VT_BSTR;
    	paramVt.parray = p1.get();
    	paramsInst->Put(L"IPAddress", 0, &paramVt, NULL);
    	p1 = create_SAFEARRAY({ mask });
    	paramVt.parray = p1.get();
    	paramsInst->Put(L"SubnetMask", 0, &paramVt, NULL);
    
    	rt = exec_method(L"EnableStatic", paramsInst);
    	if (params) {
    		params->Release();
    	}
    	return rt;
    }
    
    bool NetConfig::set_dns(const std::string & default_dns, const std::string & backup_dns)
    {
    	return set_dns_base(false, default_dns, backup_dns);
    }
    
    bool NetConfig::set_auto_dns()
    {
    	return set_dns_base(true, "", "");
    }
    
    bool NetConfig::set_gateway(const std::string & gateway)
    {
    	bool rt = false;
    	if (!init())
    		return rt;
    
    	IWbemClassObject *params = NULL;
    	IWbemClassObject *paramsInst = NULL;
    	p_config->GetMethod(_bstr_t("SetGateways"), 0, &params, NULL);
    	params->SpawnInstance(0, &paramsInst);
    
    	auto p1 = create_SAFEARRAY({ gateway });
    	VARIANT paramVt;
    	paramVt.vt = VT_ARRAY | VT_BSTR;
    	paramVt.parray = p1.get();
    	paramsInst->Put(L"DefaultIPGateway", 0, &paramVt, NULL);
    	paramVt.vt = VT_UINT;
    	paramVt.uintVal = 1;
    	paramsInst->Put(L"GatewayCostMetric", 0, &paramVt, NULL);
    
    	rt = exec_method(L"SetGateways", paramsInst);
    	if (params) {
    		params->Release();
    	}
    	return rt;
    }
    
    void NetConfig::clear()
    {
    	if (p_config) {
    		p_config->Release();
    		p_config = nullptr;
    	}
    	if (p_obj_) {
    		p_obj_->Release();
    		p_obj_ = nullptr;
    	}
    	if (p_enum_) {
    		p_enum_->Release();
    		p_enum_ = nullptr;
    	}
    	if (p_service_) {
    		p_service_->Release();
    		p_service_ = nullptr;
    	}
    	if (p_instance_) {
    		p_instance_->Release();
    		p_instance_ = nullptr;
    	}
    	if (is_init_) {
    		CoUninitialize();
    	}
    	is_init_ = false;
    }
    
    bool NetConfig::init()
    {
    	if (is_init_) {
    		return true;
    	}
    
    	// Step 1: Initialize COM.
    	HRESULT	hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "CoInitializeEx failed: " << hres << endl;
    #endif
    		return false;
    	}
    
    	/*
    	// Step 2: Set general COM security levels
    	hres = CoInitializeSecurity(
    		NULL,
    		-1,                          // COM negotiates service
    		NULL,                        // Authentication services
    		NULL,                        // Reserved
    		RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
    		RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
    		NULL,                        // Authentication info
    		EOAC_NONE,                   // Additional capabilities 
    		NULL                         // Reserved
    	);
    	//ASSERT_THROW(SUCCEEDED(hres), "CoInitializeSecurity failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "CoInitializeSecurity failed: " << hres << endl;
    #endif
    		return false;
    	}
    	*/
    
    	// Step 3:  Obtain the initial locator to WMI
    	hres = CoCreateInstance(
    		CLSID_WbemLocator,
    		0,
    		CLSCTX_INPROC_SERVER,
    		IID_IWbemLocator,
    		(LPVOID*)&p_instance_);
    	//ASSERT_THROW(SUCCEEDED(hres), "CoCreateInstance failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "CoCreateInstance failed: " << hres << endl;
    #endif
    		return false;
    	}
    
    	// Step 4: Connect to the local root\cimv2 namespace and obtain pointer pSvc to make IWbemServices calls.
    	hres = p_instance_->ConnectServer(
    		_bstr_t(L"ROOT\\CIMV2"),
    		NULL,
    		NULL,
    		0,
    		NULL,
    		0,
    		0,
    		&p_service_
    	);
    	//ASSERT_THROW(SUCCEEDED(hres), "ConnectServer failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "ConnectServer failed: " << hres << endl;
    #endif
    		return false;
    	}
    
    	// Step 5:  Set security levels for the proxy
    	hres = CoSetProxyBlanket(
    		p_service_,                        // Indicates the proxy to set
    		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
    		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
    		NULL,                        // Server principal name 
    		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
    		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
    		NULL,                        // client identity
    		EOAC_NONE                    // proxy capabilities 
    	);
    	//ASSERT_THROW(SUCCEEDED(hres), "CoSetProxyBlanket failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "CoSetProxyBlanket failed: " << hres << endl;
    #endif
    		return false;
    	}
    
    	// 通过适配器名称来找到指定的适配器对象.
    	CComBSTR TheQuery = L"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE SettingID = \"";
    	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conversion;
    	TheQuery += conversion.from_bytes(key_).c_str();
    	TheQuery += L"\"";
    	hres = p_service_->ExecQuery(
    		//SysAllocString(L"WQL"),
    		L"WQL",
    		TheQuery,
    		WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
    		NULL,
    		&p_enum_);
    	//ASSERT_THROW(SUCCEEDED(hres), "ExecQuery failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "ExecQuery failed: " << hres << endl;
    #endif
    		return false;
    	}
    	
    	// Get the adapter object.
    	ULONG num = 0;
    	hres = p_enum_->Next(WBEM_INFINITE, 1, &p_obj_, &num);
    	//ASSERT_THROW(SUCCEEDED(hres), "Next failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "Next failed: " << hres << endl;
    #endif
    		return false;
    	}
    
    	//ASSERT_THROW(0 < num, "Next failed");
    	if (num < 1) {
    #ifdef _DEBUG
    		cout << "Next failed num < 1" << endl;
    #endif
    		return false;
    	}
    
    	VariantInit(&path_);
    	hres = p_obj_->Get(L"__PATH", 0, &path_, NULL, NULL);
    	//ASSERT_THROW(SUCCEEDED(hres), "Get path failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "Get failed: " << hres << endl;
    #endif
    		return false;
    	}
    	hres = p_service_->GetObject(_bstr_t(L"Win32_NetworkAdapterConfiguration"), 0, NULL, &p_config, NULL);
    	//ASSERT_THROW(SUCCEEDED(hres), "GetObject Win32_NetworkAdapterConfiguration failed");
    	if (FAILED(hres)) {
    #ifdef _DEBUG
    		cout << "GetObject failed: " << hres << endl;
    #endif
    		return false;
    	}
    	is_init_ = true;
    	return true;
    }
    
    std::shared_ptr<SAFEARRAY> NetConfig::create_SAFEARRAY(const std::vector<std::string> &args)
    {
    	SAFEARRAY *psa = SafeArrayCreateVector(VT_BSTR, 0, args.size());
    	long idx[] = { 0 };
    	for (int i = 0; i < args.size(); i++) {
    		std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conversion;
    		BSTR ip = SysAllocString(conversion.from_bytes(args[i]).c_str());
    		idx[0] = i;
    		if (FAILED(SafeArrayPutElement(psa, idx, ip))) {
    			return (false);
    		}
    		SysFreeString(ip);
    	}
    	return shared_ptr<SAFEARRAY>(psa, [](SAFEARRAY *psa) {SafeArrayDestroy(psa); });
    }
    
    bool NetConfig::set_dns_base(bool is_auto, const std::string & default_dns, const std::string & backup_dns)
    {
    	bool rt = false;
    	if (!init())
    		return rt;
    
    	IWbemClassObject *params = NULL;
    	IWbemClassObject *paramsInst = NULL;
    	p_config->GetMethod(_bstr_t("SetDNSServerSearchOrder"), 0, &params, NULL);
    	params->SpawnInstance(0, &paramsInst);
    
    	shared_ptr<SAFEARRAY> p1;
    	if (is_auto) {
    		paramsInst->Put(L"DNSServerSearchOrder", 0, NULL, NULL);
    	}
    	else {
    		if (backup_dns.size()) {
    			p1 = create_SAFEARRAY({ default_dns, backup_dns });
    		}
    		else {
    			p1 = create_SAFEARRAY({ default_dns });
    		}
    		VARIANT paramVt;
    		paramVt.vt = VT_ARRAY | VT_BSTR;
    		paramVt.parray = p1.get();
    		paramsInst->Put(L"DNSServerSearchOrder", 0, &paramVt, NULL);
    	}
    
    	rt = exec_method(L"SetDNSServerSearchOrder", paramsInst);
    	if (params) {
    		params->Release();
    	}
    	return rt;
    }
    
    bool NetConfig::exec_method(const wchar_t * method, IWbemClassObject * params_instance)
    {
    	bool rt = false;
    	IWbemClassObject *results = NULL;
    	auto res = p_service_->ExecMethod(path_.bstrVal, _bstr_t(method), 0, NULL, params_instance, &results, NULL);
    	if (SUCCEEDED(res)) {
    		VARIANT vtRet;
    		VariantInit(&vtRet);
    		if (!FAILED(results->Get(L"ReturnValue", 0, &vtRet, NULL, 0))) {
    			if (vtRet.uintVal == 0 || vtRet.uintVal == 1) {
    				rt = true;
    			}
    			else {
    				last_error_code_ = vtRet.uintVal;
    #ifdef _DEBUG
    				wcout << method << " failed, result: " << last_error_code_ << endl;
    #endif
    			}
    		}
    #ifdef _DEBUG
    		else {
    			cout << "ExecMethod Get ReturnValue failed: " << res << endl;
    		}
    #endif
    		VariantClear(&vtRet);
    		results->Release();
    	}
    #ifdef _DEBUG
    	else {
    		cout << "ExecMethod failed: " << res << endl;
    	}
    #endif	
    	if (params_instance) {
    		params_instance->Release();
    	}
    	return rt;
    }
    
    
    展开全文
  • windows wmiThere are many devices (servers, desktops, laptops, tablets, phones, etc) running a Windows operating system. Many of us who live in the nix based world have to work in this OS, or if we do...
  • vbs 以及 windowsWMI 系统 https://msdn.microsoft.com/en-us/library/aa393259(v=vs.85).aspx [code="test.vbs" ] On Error Resume Next For Each Disk In GetObject( _ "winmgmts:&...
  • WINDOWS WMI技术指南

    2008-12-09 09:48:45
    文件格式:PDF 内容: 详细介绍了WINDOWS操作系统的WMI技术的应用.
  • windows WMI 脚本教程

    2009-02-24 16:46:53
    系统的wmi教程,帮助您轻松掌握wmi脚本的编写,使烦琐的系统维护和管理变得轻松、容易。
  • windows WMI 类库详解

    千次阅读 2012-12-24 20:24:25
    包括:硬件类、操作系统类、安装应用程序类、WMI服务管理类、性能计数器类 1、硬件类 冷却类别 Win32_Fan--风扇 Win32_HeatPipe--热管 Win32_Refrigeration--致冷 Win32_TemperatureProbe--温度传感 输入设备...
  • find / -name "*.cfg" 后渗透之WMIC 什么是WMIC WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批处理系统管理的支持。 WMIC的简单使用 在CMD装口输入WMIC即可进入WMIC的...
  • 免杀的pr,你懂的 使用方法: pr.exe “gets.exe $local” pr.exe “net user admin admin /add & net localgroup administrators admin /add”
  • 可以参考下列内容:msdn WMI SDK:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_start_page.aspWMI使用说明(csdn):http://www.csdn.net/develop/article/15/15346.shtmWMI...
  • 运行:wbemtest.exe
  • 然后选择适当的COM库,例如: COM API for WMI列出本地用户或任何其他Windows管理信息.Win32_SystemUsers关联WMI类涉及该系统上的计算机系统和用户帐户.Win32_Account抽象WMI类包含有关运行Windows的计算机系统已知的...
  • Windows Powershell WMI 集成

    千人学习 2017-02-27 15:55:29
    WMIWindows 平台之上统一配置信息的基本架构,是基于工业标准模型 CIM 来实现的,它允许管理员轻松的获取 Windows 系统的配置信息。 在这一个课程当中,我们将为大家介绍 Powershell ,这个 Windows 平台之上的...
  • windows开启wmi配置开启监控文档,亲测好用请大家给好评,谢谢拉啊windows开启 wmi监控文档
  • wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行脚本等等。wmi4j下载用Maven的朋友们可以直接引入,groupId=...
  • wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行脚本等等。wmi4j下载用Maven的朋友们可以直接引入,groupId=...
  • wmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI从新封装,提供了更便捷的方法,能知足基本的windows管理,包括服务管理,性能查询,执行脚本等等。javawmi4j下载用Maven的朋友们能够直接引入,...
  • Windows Powershell WMI 集成 Technet 讲师 ...
  • windowswmi&wql

    2015-05-31 14:55:16
    WMI:Windows Management Instrumentation, Windows 管理规范. CIM:Common Information Model, 通用信息模型. WQL:WMI Query Language,Windows管理规范查询语言,就是WMI中的查询语言. Windows自带的wql测试...
  • java调用windowswmi

    2013-05-20 14:32:31
    100%纯java调用windowswmi获取监控数据 转:http://my.oschina.net/noahxiao/blog/73163 纯java主要体现在可以跨平台调用com。所用的是j-Interop,它是100%纯java实现的com的调用   1、环境准备 a、...
  • 通过远程的方式连接WMI获取计算机信息时,可能会出现远程主机拒绝访问,这时就要通过下面的方式来开启... 1 按下Windows+R组合键,调用系统运行窗口。  2 输入wbemtest命令。 图1 调用WMI测试器  3 打开W...
  • Windows管理规范 WMI

    千次阅读 2012-08-10 13:36:19
    Wmi(Windows Management Instrumentations,即 Windows 管理规范 ) 作为组件集成于 Windows 操作系统,为多种信息的获取和管理提供了一系列标准。通常 WMI 可以实现几种功能,包括提供...
  • 原文请访问:http://www.chenlichao.cn/opensource/74.htmlwmi4j是纯Java实现的Windows WMI客户端,它基于j-interop针对WMI重新封装,提供了更便捷的方法,能满足基本的windows管理,包括服务管理,性能查询,执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,955
精华内容 1,582
关键字:

windowswmi