【文章标题】: 设备管理02
【文章作者】: 有酒醉
【作者邮箱】: wuqr32@sina.com
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
接下来我们使用本地代码完成这些程序所执行的操作
示例 -- 启动Oralce Linstener服务
// 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:/>
示例 -- 查找当前正在运行的进程
// 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 *o = 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类,它的作用上允许枚举出给定命名空间中的子命名空间.命名空间和类用分号隔开.
示例 -- 罗列所有的命名空间
// 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