现在的位置: 首页 > 综合 > 正文

WMI设备管理02

2018年02月07日 ⁄ 综合 ⁄ 共 5556字 ⁄ 字号 评论关闭

【文章标题】: 设备管理02
【文章作者】: 有酒醉
【作者邮箱】: wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】

  接下来我们使用本地代码完成这些程序所执行的操作
 
  示例 -- 启动Oralce Linstener服务

// OracleLinstenerStart.cpp
// Author by Yzl

#include 
< iostream>
#
using < mscorlib.dll >
#
using < System.dll>
#
using < System.Management.dll>
using namespace System;
using namespace System::Management;
using namespace std;

#pragma managed
int main()
{
    ManagementObject 
* OracleLinstenerObject = new ManagementObject(S"root/cimv2",
                S
"Win32_Service.Name='OracleOraHome92TNSListener'",0);
    ManagementBaseObject 
* outObject = OracleLinstenerObject->InvokeMethod(S"StartService",0,0);
    
    Object 
* o = outObject->get_Item(S"returnValue");
    
int iRet = Int32::Parse(o->ToString());
    
    
switch(iRet)
    
{
        
case 0: cout << "Oralce Linstener服务正常启动." << endl;break;
        
case 10: cout << "Oralce Linstener服务已经启动." << endl;break;
        
default:
            cout 
<< "其他原因,请参照MSDN" << endl; break;
    }

}

编译运行:
E:/>cl OracleLinstenerStart.cpp /clr /EHsc
Microsoft (R) C/C++ Optimizing Compiler Version 13.10.3077 for .NET Framework
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

OracleLinstenerStart.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:OracleLinstenerStart.exe
OracleLinstenerStart.obj

E:/>OracleLinstenerStart
Oralce Linstener服务正常启动.

E:/>

示例 -- 查找当前正在运行的进程

// ProcessLookup.cpp
// Author by Yzl

#include 
< iostream>
#
using < mscorlib.dll>
#
using < System.dll>
#
using < System.Management.dll>
using namespace System;
using namespace System::Management;
using namespace std;

#pragma managed
int main()
{
    ManagementObject 
*xdictObject = NULL;
        
    ManagementClass 
*processClass = new ManagementClass(S"Win32_Process");    
    
    ManagementObjectCollection
* processCollection = processClass->GetInstances();
    ManagementObjectCollection::ManagementObjectEnumerator
* processEnumerator 
                            
= processCollection->GetEnumerator();
    
    
    
while (processEnumerator->MoveNext())
    
{
        ManagementObject 
*mObject = dynamic_cast(processEnumerator->Current);
        
// 罗列当前进程信息
        Console::WriteLine("{0}/t{1}",mObject->get_Item(S"Name")->ToString(),
                     mObject
->get_Item(S"ProcessId")->ToString());
        
        
int iFound = String::Compare(mObject->get_Item(S"Name")->ToString(),S"xdict.exe");
        
if (!iFound)
            xdictObject 
= mObject;
    }

    
    
// 关闭金山词霸
    if (xdictObject == 0)
    
{
        cout 
<< "未找到该进程"    << endl;
        
return 0;
    }

    
    
//Object *args __gc[] = new Object *__gc[]{__box(0)};
    Object *= xdictObject->InvokeMethod("Terminate",0);
    
int iRet = Int32::Parse(o->ToString());
    
    
switch(iRet)
    
{
        
case 0: cout << "金山词霸正常关闭" << endl;break;
        
case 2: cout << "访问拒绝" << endl;break;
        
case 3: cout << "权限不足" << endl;break;
        
case 8: cout << "未知错误" << endl;break;
        
case 9: cout << "路径未找到" << endl;break;
        
case 21: cout << "无效参数" << endl;break;
    }

}

编译运行:
E:/>cl T.cpp /clr /EHsc
Microsoft (R) C/C++ Optimizing Compiler Version 13.10.3077 for .NET Framework
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

T.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:T.exe
T.obj

E:/>T
System Idle Process     0
System  4
smss.exe        376
csrss.exe       436
winlogon.exe    464
services.exe    508
lsass.exe       520
ati2evxx.exe    676
...

金山词霸正常关闭

四、WMI的结构
WMI最主要的组件是对象管理器,它是客户程序和提供程序之间的代理.客户程序通过System.Management与对象管理器打教道.WMI中的类指的是实体类别,WMI中的实体是确确实实在计算机中存在的.比如:WMI中驱动类,它有实例C盘,D盘,E盘..等等.所以,创建一个WMI实例时,事实上是获取计算机上一个真正实体的引用.

在安全性方面,CLR将阻止代码直接调用实现System.Management类的System.Management.dll.因为System.Management.dll是强命名的,但没有定义AllowPartiallyTrustedCallersAttribute.命名空间的安全性查阅MSDN:__SystemSecurity.

每个命名空间都包含一个__namespace类,它的作用上允许枚举出给定命名空间中的子命名空间.命名空间和类用分号隔开.

示例 -- 罗列所有的命名空间

// WmiNamespaceList.cs
// Author by Yzl
using System;
using System.Management;

public class WmiNamespaceList
{
    
public static void Main(string[] args)
    
{
        
int loop = 0;
        ListSubNamespace(
@"//./root",loop);
    }

    
    
public static void ListSubNamespace(string nsName,int loop)
    
{
        ManagementClass nsClass 
= new ManagementClass(nsName+":__namespace");
        
foreach(ManagementObject namespaceObject in nsClass.GetInstances())
        
{
            
for(int i = 0; i < loop; i ++)
                Console.Write(
"/t");
            Console.WriteLine(namespaceObject[
"Name"]);
            
            ListSubNamespace(nsName 
+ 
                    
@"/" + 
                    namespaceObject[
"Name"],++loop);
            
--loop;
        }

    }

}

本机运行如下:
SECURITY
RSOP
        User
                ms_804
                S_1_5_21_1060284298_220523388_682003330_500
        Computer
                ms_804
Cli
SecurityCenter
WMI
        ms_409
        ms_804
CIMV2
        ms_409
        ms_804
        Applications
                MicrosoftACT
                MicrosoftIE
MSAPPS10
Policy
        ms_409
        ms_804
Microsoft
        HomeNet
DEFAULT
        ms_409
        ms_804
directory
        LDAP
                ms_409
                ms_804
subscription
        ms_409
        ms_804
MSAPPS11

E:/>

要理解的一点是命名空间和提供程序之间没有任何关系;一个提供程序可以在许多命名空间中实现类,并且许多提供程序也可以
在相同的命名空间中实现不同的类。

PS:WMI客户程序需要知道它想要的对象所驻留的命名空间,但是,客户程序不需要知道由哪个提供程序实现了类.

疑问:
1、如何编写提供程序?
2、如何添加新命名空间以及新类?

带着这两个疑问,下次在来研究研究.我现在也不知道.哈哈.

<续>

--------------------------------------------------------------------------------
【版权声明】: 本文原创于泉州软件基地, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年03月13日 17:47:14

抱歉!评论已关闭.