读取系统进程优化,用Process跟WMI哪个好

读取系统进程,用Process跟WMI哪个好 - C#当前位置:& &&&读取系统进程,用Process跟WMI哪个好读取系统进程,用Process跟WMI哪个好&&网友分享于:&&浏览:6次读取系统进程,用Process和WMI哪个好?需求:web页面读取系统进程信息,可以结束进程
方法一:一个方法是用Process.GetProcesses();结合linq查询进程的一些信息
&var&modelList&=&Process.GetProcesses();
&&&&&&&&rptItems.DataSource&=&from&c&in&modelList
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&orderby&c.PrivateMemorySize64&descending
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&where&c.Id!=curren.Id
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&select&new&{&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&c.Id,&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&c.ProcessName,&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&c.Threads.Count,&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FileName=c.MainModule.FileName,//用它就报错
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PrivateMemorySize64&=&(c.PrivateMemorySize64)&/&1024
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&rptItems.DataBind();
方法二:因为用MainModule.FileName时报错,我想用WMI方式
ManagementObjectSearcher&QS&=&new&ManagementObjectSearcher(new&SelectQuery("Win32_Process"));
第一个方法中,当我用了FileName=c.MainModule.FileName,报错:仅完成部分ReadProcessMemory&或WriteProcessMemory&请求,没遇见过这个错误,对进程不是很理解,怎么解决这类错误?
问题:2方法一和方法二哪个好一点?为什么呢?
------解决方案--------------------第一个方法也可以,最好加上try&catch,可能有的进程权限不足或者别的问题。
&var&modelList&=&Process.GetProcesses();&
&&&&&&&&rptItems.DataSource&=&(from&c&in&modelList&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&orderby&c.PrivateMemorySize64&descending&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&where&c.Id!=curren.Id&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&select&c).Select(c&=&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&string&filename&=&"";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&try&{&filename&=&c.MainModule.FileN&}&catch&{&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&new&{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&c.Id,&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&c.ProcessName,&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&c.Threads.Count,&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FileName=&filename,//用它就报错& 共&2&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有使用Python玩转WMI - Python - 伯乐在线
& 使用Python玩转WMI
最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WMI。本文打算更进一步,让我们使用Python玩转WMI。
1 什么是WMI
具体请看微软官网对。这里简单说明下,WMI的全称是Windows Management Instrumentation,即Windows管理规范。它是Windows操作系统上管理数据和操作的基础设施。我们可以使用WMI脚本或者应用自动化管理任务等。
从可以知道WMI支持如下语言:
Application language
Scripts written in Microsoft ActiveX script hosting, including Visual Basic Scripting Edition (VBScript) and Perl
Start with .
For script code examples, see
and the TechNet
Script Repository.
Windows PowerShell
WMI PowerShell Cmdlets, such as .
Visual Basic applications
Active Server Pages
Start with .
C++ applications
Start with
(contains examples).
.NET Framework applications written in C#, Visual Basic .NET, or J#
Classes in the
namespace. (The System.Management namespace is no longer supported). For more information, see .
很遗憾,WMI并不原生支持Python。不过没有关系,它支持VB,而Python中的两个第三方库wmi和win32com,均能以类似VB的用法来使用。那么接下来,我们来讲讲如何使用。
2.1 使用wmi库操作WMI
以下是一个遍历所有进程,所有服务的示例:
import wmi
c = wmi.WMI ()
# 遍历进程
for process in c.Win32_Process ():
print process.ProcessId, process.Name
# 遍历服务
for service in c.Win32_Service ():
print service.ProcessId, service.Name
import wmic = wmi.WMI ()# 遍历进程for process in c.Win32_Process ():&&&&print process.ProcessId, process.Name&# 遍历服务for service in c.Win32_Service ():&&&&print service.ProcessId, service.Name
可以看到,使用起来非常简单。但是有两个问题:一是wmi库实在是太慢了,能不能快点?二是如何知道例子中process和service有哪些属性(比如ProcessId等)?由于wmi库是动态生成底层执行语句,用dir(process)这种方式是获取不到ProcessId这种属性的。
针对第一个问题,我们可以使用win32com这个库来解决,它相较于wmi的速度快了很多。而第二个问题,先卖个关子,后文会有介绍。
2.2 使用win32com库操作WMI
win32com能模仿VB的行为,想了解如何使用win32com来操作WMI,最直接的方式是了解如何使用VB来操作WMI。在微软的官网上提供了很多现成的例子:, 。
其中一个例子关于进程是这样的:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objProcess in colProcesses
Wscript.Echo "Process: " & objProcess.Name
sngProcessTime = (CSng(objProcess.KernelModeTime) + CSng(objProcess.UserModeTime)) /
Wscript.Echo "Processor Time: " & sngProcessTime
Wscript.Echo "Process ID: " & objProcess.ProcessID
Wscript.Echo "Working Set Size: " & objProcess.WorkingSetSize
Wscript.Echo "Page File Size: " & objProcess.PageFileUsage
Wscript.Echo "Page Faults: " & objProcess.PageFaults
12345678910111213
strComputer = "."Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process")For Each objProcess in colProcesses&&&&&Wscript.Echo "Process: " & objProcess.Name&&&&sngProcessTime = (CSng(objProcess.KernelModeTime) + CSng(objProcess.UserModeTime)) / &&&&Wscript.Echo "Processor Time: " & sngProcessTime&&&&Wscript.Echo "Process ID: " & objProcess.ProcessID&&&&Wscript.Echo "Working Set Size: " & objProcess.WorkingSetSize&&&&Wscript.Echo "Page File Size: " & objProcess.PageFileUsage&&&&Wscript.Echo "Page Faults: " & objProcess.PageFaultsNext
它做了这样一件事:首先通过GetObject连接到Win32_Process所在的名称空间,然后执行语句(类似SQL的查询语句)查到所有的进程,再把每一个进程的相关信息打印出来。WQL的具体用法请见,这里不详细介绍。
那么用win32com就可以这么写(例子中打印的属性为了简便,就不像上面那么多啦):
from win32com.client import GetObject
wmi = GetObject('winmgmts:/root/cimv2')
# wmi = GetObject('winmgmts:') #更简单的写法
processes = wmi.ExecQuery('Select * from Win32_Process')
for process in processes:
print(process.ProcessID, process.Name)
from win32com.client import GetObject&wmi = GetObject('winmgmts:/root/cimv2')# wmi = GetObject('winmgmts:') #更简单的写法processes = wmi.ExecQuery('Select * from Win32_Process')for process in processes:&&&&print(process.ProcessID, process.Name)
看上去,VB和win32com的用法非常接近!那么当我们想要使用win32com对WMI进行操作时,就可以参考微软官网上VB的例子,然后比葫芦画瓢写出Python版的代码。
上例中,我们使用了查询函数ExecQuery来查询符合条件的内容,不过如果我们仅仅是想要获得所有的数据,而没有特定的限定条件,就可以使用更简单的方式——InstancesOf,那么就可以写成下面这样:
from win32com.client import GetObject
wmi = GetObject('winmgmts:/root/cimv2')
processes = wmi.InstancesOf('Win32_Process')
for process in processes:
print(process.ProcessID, process.Name)
from win32com.client import GetObject&wmi = GetObject('winmgmts:/root/cimv2')processes = wmi.InstancesOf('Win32_Process')for process in processes:&&&&print(process.ProcessID, process.Name)
有读者可能会问,我们怎么知道自己想要了解的内容在哪个名称空间,我们应该获取哪个实例,又该获取实例中的哪些属性呢?
3 WMI的名称空间
使用下面的脚本可以获得当前计算机上的名称空间:
from win32com.client import GetObject
import pywintypes
def enum_namespace(name):
wmi = GetObject('winmgmts:/' + name)
namespaces = wmi.InstancesOf('__Namespace')
for namespace in namespaces:
enum_namespace('{name}/{subname}'.format(name=name,
subname=namespace.Name))
print(name, 'limit of authority')
print(name)
enum_namespace('root')
123456789101112131415
from win32com.client import GetObjectimport pywintypes&def enum_namespace(name):&&&&try:&&&&&&&&wmi = GetObject('winmgmts:/' + name)&&&&&&&&namespaces = wmi.InstancesOf('__Namespace')&&&&&&&&for namespace in namespaces:&&&&&&&&&&&&enum_namespace('{name}/{subname}'.format(name=name,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& subname=namespace.Name))&&&&except pywintypes.com_error:&&&&&&&&print(name, 'limit of authority')&&&&else:&&&&&&&&print(name)enum_namespace('root')
获得的内容大概是这样的(…表示省略了一些输出内容):
root/subscription
root/subscription/ms_409
root/DEFAULT
root/DEFAULT/ms_409
root/CIMV2
root/CIMV2/Security
root/Cli/MS_409
root/SECURITY
root/WMI/ms_409
root/directory
root/directory/LDAP
root/directory/LDAP/ms_409
root/Interop
root/Interop/ms_409
root/ServiceModel
root/SecurityCenter
root/MSAPPS12
root/Microsoft
123456789101112131415161718192021222324
rootroot/subscriptionroot/subscription/ms_409root/DEFAULTroot/DEFAULT/ms_409root/CIMV2root/CIMV2/Security...root/Cliroot/Cli/MS_409root/SECURITY...root/WMIroot/WMI/ms_409root/directoryroot/directory/LDAProot/directory/LDAP/ms_409root/Interoproot/Interop/ms_409root/ServiceModelroot/SecurityCenterroot/MSAPPS12root/Microsoft...
通用的名称空间的简单介绍:
root 是名称空间层次结构的最高级。
CIMV2 名称空间存放着和系统管理域相关(比如计算机以及它们的操作系统)的对象。
DEFAULT 名称空间存放着默认被创建而不指定名称空间的类。
directory 目录服务的通用名称空间,WMI 创建了名为LDAP的子名称空间。
SECURITY 用来支持Windows 9x计算机上的WMI的名称空间。
WMI 使用Windows Driver Model providers的类所在的名称空间。这是为了避免和CIMV2名称空间中类名冲突。
其中,root/CIMV2可以说是最为基本和常用的名称空间了。它的作用主要是提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM 用户及组,以及更多资源的信息;管理 Windows 事件日志,如读取、备份、清除、复制、删除、监视、重命名、压缩、解压缩和更改事件日志设置。
4 类/实例和属性/值
了解了名称空间的获取,每个名称空间的主要功能,那么如何获取特定名称空间下所有的类,以及它们的属性和值呢?
Windows提供了一个WMI测试器,使得查询这些内容变得尤为方便。按下”win+R”,输入wbemtest,从而打开WMI测试器。打开后的界面如下:
点击“连接”,输入想要查询的名称空间,再点击“连接”即可连到特定名称空间。
然后点击“枚举类”,在弹出的界面中选择“递归”,然后点击“确定”,就会得到这个名称空间下所有的类:
从上图可以看到,之前举例中提到的Win32_Process位列其中,我们不妨双击它,看看关于它的具体内容:
我们可以很容易地找到Win32_Process的属性和方法。除了使用wbemtest查看特定名称空间下的所有类,我们还可以在中找到所有的类。我们依次在这个页面中点击,,, 最终找到Win32_Process的属性和方法:
对比上面两张图,里面的方法都是一致的。
那么如何获得实例和它的值呢?我们继续在刚刚打开的wbemtest界面中点击右边的“实例”按钮,就会显示所有的进程实例。双击某个具体的实例,然后在弹出的界面中点击右侧的“显示MOF”按钮就会显示这个实例中具体属性的值。
通过上述定位名称空间、类、属性的方法,我们就可以愉快地使用Python来玩耍WMI。
5 实战,以IIS为例
了解了这么多内容,咱们就拿个对象练练手。现在有这么个需求,我们想要获取IIS的版本号以及它所有的站点名称,怎么办?
在微软官网上比较容易的找到的说明,根据直觉,我们要查询的信息可能会是在类名中包含setting的类中,那么看起来比较有可能的有, , 。
对这些类都分别看一看,发现IIsSetting中提供了一个例子:
o = getobj("winmgmts:/root/microsoftiisv2")
nodes = o.ExecQuery("select * from IIsWebServerSetting where name='w3svc/1'")
e = new Enumerator(nodes)
for(; ! e.atEnd(); e.moveNext()) {
WScript.Echo(e.item().Name + " (" + e.item().Path_.Class + ")")
// The output should be:
w3svc/1 (IIsWebServerSetting)
nodes = o.ExecQuery("select * from
IIsSetting where name='w3svc/1'")
e = new Enumerator(nodes)
for(; ! e.atEnd(); e.moveNext()) {
WScript.Echo(e.item().Name + " (" + e.item().Path_.Class + ")")
// The output should be:
w3svc/1 (IIsIPSecuritySetting)
w3svc/1 (IIsWebServerSetting)
123456789101112131415161718
o = getobj("winmgmts:/root/microsoftiisv2") nodes = o.ExecQuery("select * from IIsWebServerSetting where name='w3svc/1'") e = new Enumerator(nodes) for(; ! e.atEnd(); e.moveNext()) { &&WScript.Echo(e.item().Name + " (" + e.item().Path_.Class + ")") } // The output should be:&&//&& w3svc/1 (IIsWebServerSetting) &nodes = o.ExecQuery("select * from&&IIsSetting where name='w3svc/1'") e = new Enumerator(nodes) for(; ! e.atEnd(); e.moveNext()) { &&WScript.Echo(e.item().Name + " (" + e.item().Path_.Class + ")") } // The output should be:&&//&& w3svc/1 (IIsIPSecuritySetting) //&& w3svc/1 (IIsWebServerSetting)
从这个例子中,我们可以知道iis的名称空间是‘/root/microsoftiisv2’,然后我们可以直接在这个空间中查询各种相关类,比如说“IIsWebServerSetting”。
结合wbemtest和IIS管理器,我们可以看出IIsWebServerSetting实例中的ServerComment属性值和网站名称一致:
而版本信息则在类名包含setting的类中无法找到,那再去类名包含info的类中瞧一瞧。果然,在中找到了MajorIIsVersionNumber和MinorIIsVersionNumber属性,分别表示大版本和小版本。那么我们就能比较轻松地写出下面的Python代码来获得版本和站点名称:
# coding:utf-8
from win32com.client import GetObject
wmi = GetObject('winmgmts:/root/microsoftiisv2')
webinfo = wmi.execquery('select * from IIsWebInfo ')[0]
version = '{major}.{min}'.format(major=webinfo.MajorIIsVersionNumber,
min=webinfo.MinorIIsVersionNumber)
print(version)
# 站点名称
websettings = wmi.execquery('select * from IIsWebServerSetting ')
websites = ' | '.join(setting.ServerComment for setting in websettings)
print(websites)
1234567891011121314
# coding:utf-8from win32com.client import GetObject&wmi = GetObject('winmgmts:/root/microsoftiisv2')# 版本webinfo = wmi.execquery('select * from IIsWebInfo ')[0]version = '{major}.{min}'.format(major=webinfo.MajorIIsVersionNumber,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& min=webinfo.MinorIIsVersionNumber)print(version)&# 站点名称websettings = wmi.execquery('select * from IIsWebServerSetting ')websites = ' | '.join(setting.ServerComment for setting in websettings)print(websites)
使用Python操作WMI,最大的难点并不在于如何编写Python语句,而在于如果获知想要查询的内容在哪个名称空间以及对应的类和属性。而这些内容则需要查阅官方文档以及使用wbemtest进行探索。获得了这些必要的信息后,再去编写Python代码就是一件非常轻松的事情。
关于作者:
可能感兴趣的话题
o 240 回复
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线vbs使用WMI获得系统进程信息 - 岁月无声 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
vbs使用WMI获得系统进程信息
& 16:10:49
/ 个人分类:
set bjWMI=getobject("winmgmts:\\.\root\cimv2") '连接WMI,命名空间为root\cimv2set colProcess=objWMI.execquery("select * from win32_process where name='notepad.exe'")'使用WSOL查询for each& i in colprocesswscript.echo i.wrokingsetsize/1024 '进程使用内存next
'显示系统所有进程信息set wbem=getobject("winmgmts:\\.\root\cimv2")set wbemobj=wbem.instancesof("win32_process")for each& i in wbemobjwscript.echo "进程"&i.name&"使用内存为"& i.wrokingsetsize/1024& "k,命令行为"&mandlinenext拒绝访问 | www. | 百度云加速
请打开cookies.
此网站 (www.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(38b817fa73dd43d1-ua98).
重新安装浏览器,或使用别的浏览器如何调用一个已经做好的窗口 - C#当前位置:& &&&如何调用一个已经做好的窗口如何调用一个已经做好的窗口&&网友分享于:&&浏览:2次怎么调用一个已经做好的窗口?不是new一个新的,是按一个按钮就弹出一个已经做好的窗体。
------解决方案--------------------引用:Quote: 引用:
晕,你窗体类叫Form2么?我上面只是个例子,你要按你实际情况修改
OK,这样把,我就一个FORM1上面有个按钮,然后FORM2什么都没有,怎么写?不要省略步骤好不好,谢谢。
Form2&f2&=new&Form2();
f2.show();&
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有}

我要回帖

更多关于 系统进程存在注入风险 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信