python 操作wmi例子(邮新浪网友提供:http://blog.sina.com.cn/s/blog_62c02a630100p0lm.html)

List all running processes

import wmi
c = wmi.WMI ()
for process in c.Win32_Process ():
print process.ProcessId, process.Name

List all running notepad processes

import wmi
c = wmi.WMI ()
for process in c.Win32_Process (name="notepad.exe"):
print process.ProcessId, process.Name

Create and then destroy a new notepad process

import wmi
c = wmi.WMI ()
process_id, return_value = c.Win32_Process.Create (CommandLine="notepad.exe")
for process in c.Win32_Process (ProcessId=process_id):
print process.ProcessId, process.Name

result = process.Terminate ()

Show the interface for the .Create method of a Win32_Process class

Notes:

The wmi module tries to take the hard work out of WMI methods by querying the method for its in and out parameters, accepting the in parameters as Python keyword params and returning the output parameters as an tuple return value. The function which is masquerading as the WMI method has a __doc__ value which shows the input and return values.

import wmi
c = wmi.WMI ()
print c.Win32_Process.Create

Show all automatic services which are not running

import wmi
c = wmi.WMI ()
stopped_services = c.Win32_Service (StartMode="Auto", State="Stopped")
if stopped_services:
for s in stopped_services:
print s.Caption, "service is not running"
else:
print "No auto services stopped"

Show the percentage free space for each fixed disk

import wmi
c = wmi.WMI ()
for disk in c.Win32_LogicalDisk (DriveType=3):
print disk.Caption, "%0.2f%% free" % (100.0 * long (disk.FreeSpace) / long (disk.Size))

Run notepad, wait until it‘s closed and then show its text

Notes:

This is an example of running a process and knowing when it‘s finished, not of manipulating text typed into Notepad. So I‘m simply relying on the fact that I specify what file notepad should open and then examining the contents of that afterwards.

This one won‘t work as shown on a remote machine because, for security reasons, processes started on a remote machine do not have an interface (ie you can‘t see them on the desktop). The most likely use for this sort of technique on a remote server to run a setup.exe and then, say, reboot once it‘s completed.

import wmi
c = wmi.WMI ()
filename = r"c:\temp\temp.txt"
process = c.Win32_Process
process_id, result = process.Create (CommandLine="notepad.exe " + filename)
watcher = c.watch_for (
notification_type="Deletion",
wmi_class="Win32_Process",
delay_secs=1,
ProcessId=process_id
)
watcher ()
print "This is what you wrote:"
print open (filename).read ()

Watch for new print jobs

import wmi
c = wmi.WMI ()
print_job_watcher = c.watch_for (
notification_type="Creation",
wmi_class="Win32_PrintJob",
delay_secs=1
)

#
# Or, from 1.0 rc3 onwards
#
# print_job_watcher = c.Win32_PrintJob.watch_for (
# notification_type="Creation",
# delay_secs=1
# )

while 1:
pj = print_job_watcher ()
print "User %s has submitted %d pages to printer %s" % \
(pj.Owner, pj.TotalPages, pj.Name)

Reboot a remote machine

Notes:

To do something this drastic to a remote system, the WMI script must take RemoteShutdown privileges, which means that you must specify them in the connection moniker. The WMI constructor allows you to pass in an exact moniker, or to specify the parts of it that you need. Use help on wmi.WMI.__init__ to find out more.

import wmi
# other_machine = "machine name of your choice"
c = wmi.WMI (computer=other_machine, privileges=["RemoteShutdown"])
os = c.Win32_OperatingSystem (Primary=1)[0]
os.Reboot ()

Show the IP and MAC addresses for IP-enabled network interfaces

import wmi
c = wmi.WMI ()
for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1):
print interface.Description, interface.MACAddress
for ip_address in interface.IPAddress:
print ip_address
print

What‘s running on startup and from where?

import wmi
c = wmi.WMI ()
for s in c.Win32_StartupCommand ():
print "[%s] %s <%s>" % (s.Location, s.Caption, s.Command)

Watch for errors in the event log

import wmi
c = wmi.WMI (privileges=["Security"])
watcher = c.watch_for (
notification_type="Creation",
wmi_class="Win32_NTLogEvent",
Type="error"
)
while 1:
error = watcher ()
print "Error in %s log: %s" % (error.Logfile, error.Message)
# send mail to sysadmin etc.

List registry keys

import _winreg
import wmi
r = wmi.Registry ()
result, names = r.EnumKey (hDefKey=_winreg.HKEY_LOCAL_MACHINE, sSubKeyName="Software")
for key in names:
print key

Add a new registry key

import _winreg
import wmi
r = wmi.Registry ()
result, = r.CreateKey (hDefKey=_winreg.HKEY_LOCAL_MACHINE, sSubKeyName=r"Software\TJG")

Add a new registry value

import _winreg
import wmi
r = wmi.Registry ()
result, = r.SetStringValue (
hDefKey=_winreg.HKEY_LOCAL_MACHINE,
sSubKeyName=r"Software\TJG",
sValueName="ApplicationName",
sValue="TJG App"
)

Create a new IIS site

NB This has only been tested on Win2k3 / IIS6.

import wmi
c = wmi.WMI (namespace="MicrosoftIISv2")
#
# Could as well be achieved by doing:
# web_server = c.IISWebService (Name="W3SVC")[0]
#
for web_server in c.IIsWebService (Name="W3SVC"):
break

binding = c.new ("ServerBinding")
binding.IP = ""
binding.Port = "8383"
binding.Hostname = ""
result, = web_server.CreateNewSite (
PathOfRootVirtualDir=r"c:\inetpub\wwwroot",
ServerComment="My Web Site",
ServerBindings= [binding.ole_object]
)

Show shared drives

import wmi
c = wmi.WMI ()
for share in c.Win32_Share ():
print share.Name, share.Path

Show print jobs

import wmi
c = wmi.WMI ()

for printer in c.Win32_Printer ():
print printer.Caption
for job in c.Win32_PrintJob (DriverName=printer.DriverName):
print " ", job.Document
print

NB This page at Microsoft is quite a good starting point for handling printer matters with WMI.

Show disk partitions

import wmi
c = wmi.WMI ()

for physical_disk in c.Win32_DiskDrive ():
for partition in physical_disk.associators ("Win32_DiskDriveToDiskPartition"):
for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"):
print physical_disk.Caption, partition.Caption, logical_disk.Caption

Install a product

Needs wmi 1.0rc3 or later

import wmi
c = wmi.WMI ()

c.Win32_Product.Install (
PackageLocation="c:/temp/python-2.4.2.msi",
AllUsers=False
)

This example is after a post by Roger Upole to the python-win32 mailing list.

Connect to another machine as a named user

import wmi

#
# Using wmi module before 1.0rc3
#
connection = wmi.connect_server (server="other_machine", user="tim", password="secret")
c = wmi.WMI (wmi=connection)

#
# Using wmi module at least 1.0rc3
#
c = wmi.WMI (computer="other_machine", user="tim", password="secret")

NB You cannot connect to your own machine this way, no matter how hard you try to obfuscate the server name.

Show a method‘s signature

import wmi
c = wmi.WMI ()
for opsys in c.Win32_OperatingSystem ():
break

print opsys.Reboot
print opsys.Shutdown

This will work in all versions of the wmi module; in 1.0rc3 and later, some enhancements have been made to show the privileges required to run the method.

Schedule a job

Needs wmi 1.0rc3 or later, rc4 for the from_time function

import os
import wmi
import time
#
# These functions are included in wmi from 1.0rc4
#
def str_or_stars (i, length):
if i is None:
return "*" * length
else:
return str (i).rjust (length, "0")

def from_time (
year=None,
month=None,
day=None,
hours=None,
minutes=None,
seconds=None,
microseconds=None,
timezone=None
):
"""Returns a WMI time string of the form yyyymmddHHMMSS.mmmmmm+UUU
replacing each placeholder by its respective integer value, or
stars if None is supplied
"""
wmi_time = ""
wmi_time += str_or_stars (year, 4)
wmi_time += str_or_stars (month, 2)
wmi_time += str_or_stars (day, 2)
wmi_time += str_or_stars (hours, 2)
wmi_time += str_or_stars (minutes, 2)
wmi_time += str_or_stars (seconds, 2)
wmi_time += "."
wmi_time += str_or_stars (microseconds, 6)
wmi_time += str_or_stars (timezone, 4)

return wmi_time

c = wmi.WMI ()
year, month, day, hours, mins, secs = time.gmtime ()[:6]
job_id, result = c.Win32_ScheduledJob.Create (
Command=r"cmd.exe /c dir /b c:\ > c:\\temp.txt",
StartTime=from_time (
hours=hours,
minutes=mins+1,
seconds=secs,
microseconds=0,
timezone="+000"
)
)
print job_id

for line in os.popen ("at"):
print line

The WMI ScheduledJob class correponds to the AT Windows service (controlled through the "at" command). As far as I know, it is notrelated to the Scheduled Tasks mechanism, controlled by a control panel applet.

Run a process minimised

Needs wmi 1.0rc5 or later

import wmi
import win32con

c = wmi.WMI ()
startup = c.Win32_ProcessStartup.new (ShowWindow=win32con.SW_SHOWMINIMIZED)
pid, result = c.Win32_Process.Create (
CommandLine="notepad.exe",
ProcessStartupInformation=startup
)
print pid

Thanks to Keith Veleba for providing the question and code which prompted this example

Find Drive Types

import wmi

#
# cut-and-pasted from MSDN
#
DRIVE_TYPES = """
0 Unknown
1 No Root Directory
2 Removable Disk
3 Local Disk
4 Network Drive
5 Compact Disc
6 RAM Disk
"""
drive_types = dict((int (i), j) for (i, j) in (l.split ("\t") for l in DRIVE_TYPES.splitlines () if l))

c = wmi.WMI ()
for drive in c.Win32_LogicalDisk ():
print drive.Caption, drive_types[drive.DriveType]

List Namespaces

import wmi

def enumerate_namespaces (namespace=u"root", level=0):
print level * " ", namespace.split ("/")[-1]
c = wmi.WMI (namespace=namespace)
for subnamespace in c.__NAMESPACE ():
enumerate_namespaces (namespace + "/" + subnamespace.Name, level + 1)

enumerate_namespaces ()

Use WMI in a thread

Note the use of pythoncom.Co(Un)initialize. WMI is a COM-based technology, so to use it in a thread, you must init the COM threading model. This applies also if you‘re running in a service, for example, which is implicitly threaded.

import pythoncom
import wmi
import threading
import time

class Info (threading.Thread):
def __init__ (self):
threading.Thread.__init__ (self)
def run (self):
print ‘In Another Thread...‘
pythoncom.CoInitialize ()
try:
c = wmi.WMI ()
for i in range (5):
for process in c.Win32_Process ():
print process.ProcessId, process.Name
time.sleep (2)
finally:
pythoncom.CoUninitialize ()

if __name__ == ‘__main__‘:
print ‘In Main Thread‘
c = wmi.WMI ()
for process in c.Win32_Process ():
print process.ProcessId, process.Name
Info ().start ()

Monitor multiple machines for power events

This is a demonstration of extrinsic events, threading and remote monitoring... all in one small package! The idea is that the power subsystem generates extrinsic events via its WMI provider whenever a machine enters or leaves suspend mode. Extrinsic events are useful because WMI doesn‘t have to poll for them so you shouldn‘t miss any. The multiple machines was just a practical example of using threads.

Note the use of CoInitialize and CoUninitialize in the thread control code.
Note also the simplified use of [wmi].[class].watch_for which will work for intrinsic and extrinsic events transparentlyimport pythoncom

import wmi
import threading
import Queue

class Server (threading.Thread):

def __init__ (self, results, server, user, password):
        threading.Thread.__init__ (self)
       self.results = results
self.server = server
self.user = user
self.password = password
self.setDaemon (True)

def run (self):
pythoncom.CoInitialize ()
try:
#
# If you don‘t want to use explicit logons, remove
# the user= and password= params here and ensure
# that the user running *this* script has sufficient
# privs on the remote machines.
#
c = wmi.WMI (self.server, user=self.user, password=self.password)
power_watcher = c.Win32_PowerManagementEvent.watch_for ()
while True:
self.results.put ((self.server, power_watcher ()))
finally:
pythoncom.CoUninitialize ()

#
# Obviously, change these to match the machines
# in your network which probably won‘t be named
# after Harry Potter characters. And which hopefully
# use a less obvious admin password.
#
servers = [
("goyle", "administrator", "secret"),
("malfoy", "administrator", "secret")
]
if __name__ == ‘__main__‘:
power_events = Queue.Queue ()
for server, user, password in servers:
print "Watching for", server
Server (power_events, server, user, password).start ()

while True:
server, power_event = power_events.get ()
print server, "=>", power_event.EventType

Find the current wallpaper

import wmi
import win32api
import win32con

c = wmi.WMI ()
full_username = win32api.GetUserNameEx (win32con.NameSamCompatible)
for desktop in c.Win32_Desktop (Name=full_username):
print desktop.Wallpaper or "[No Wallpaper]", desktop.WallpaperStre

时间: 2024-10-08 03:02:53

python 操作wmi例子(邮新浪网友提供:http://blog.sina.com.cn/s/blog_62c02a630100p0lm.html)的相关文章

python 操作 office

http://www.cnblogs.com/youxin/p/3548647.html?utm_source=tuicool&utm_medium=referral 首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个WORD文档,就可以在里面编辑VB脚本,实现我们自己的效果.对于这种一本万利的买卖,Python怎么能放过,它内置了对于win32 com接口的支持,我们可以方便的控制. 要想熟练使用office win32 com接口,没有什么比M

文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个redis的订阅者何消费者. 定义一个类: import redis class Redis_helper(): def __init__(self): self.__conn = redis.Redis(host='192.168.11.87') #创建一个连接 def pub(self, mes, c

Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装和基本使用 Memcached安装: wget http://memcached.org/latest

使用python操作elasticsearch实现数据插入分析

前言: 例行公事,有些人可能不太了解elasticsearch,下面搜了一段,大家瞅一眼. Elasticsearch是一款分布式搜索引擎,支持在大数据环境中进行实时数据分析.它基于Apache Lucene文本搜索引擎,内部功能通过ReST API暴露给外部.除了通过HTTP直接访问Elasticsearch,还可以通过支持Java.JavaScript.Python及更多语言的客户端库来访问.它也支持集成Apache Hadoop环境.Elasticsearch在有些处理海量数据的公司中已经

python操作mysql数据库实现增删改查

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 你可以访问Python数据库接口及API查看详细的支持数据库列表. 不同的数据库你需要下载不同的DB API模块,例如你需要

Python操作Mysql基础教程

Python操作Mysql 最近在学习python,这种脚本语言毫无疑问的会跟数据库产生关联,因此这里介绍一下如何使用python操作mysql数据库.我python也是零基础学起,所以本篇博客针对的是python初学者,大牛可以选择绕道. 另外,本篇博客基于的环境是Ubuntu13.10,使用的python版本是2.7.5. MYSQL数据库 MYSQL是一个全球领先的开源数据库管理系统.它是一个支持多用户.多线程的数据库管理系统,与Apache.PHP.Linux共同组成LAMP平台,在we

Python之路【第十篇】Python操作Memcache、Redis、RabbitMQ、SQLAlchemy、

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. 1.Memcached安装配置 #安装倚赖包 yum install libevent-devel #安装软件 yum -y

python基础教程学习笔记---(7)python操作mysql

1.基本介绍: python标准数据库接口为python DB-API,它为开发人员提供了数据库应用编程接口,可以支持mysql.Oracle.MSSQL.Sybase等多种数据库,不同的数据库需要下载不同的DB-API模块. DBI-API是一个规范,它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口. python DB-API的使用流程是: ①引入API模块:②获取与数据库的连接:③执行SQL语句:④关闭数据库连接. 2.什

Python 操作 MySQL数据库

一.安装 MySQL 可以直接从MySQL官方网站下载最新版本.MySQL是跨平台的,选择对应的平台下载安装文件,安装即可. 如果是Windows用户,那么安装过程非常简单,直接根据向导一步一步操作即可. 如果是 Linux 用户,安装过程也是相当简单的. ## Ubuntu / Debian $ sudo apt-get install mysql-server $ sudo apt-get install mysql-client ## CentOS / RHEL # yum install