Python WMI
Windows Management Interface connector using asyncio for the Python language.
Supports:
- NTLM Authentication
- Kerberos Authentication
- WMI Query (IWbemServices_ExecQuery)
- Parsing of basic WMI Objects (int/float/str/datetime/array/references)
- Optimized queries using the SmartEnum implementation
Todo:
- Async WMI Query (IWbemServices_ExecQueryAsync)
- Other DCOM/RPC/WMI calls?
- Support for WMI Methods?
- Improve documentation
Usage
The example below covers most of what is suppored by this library:
import asyncio
import logging
import time
from aiowmi.connection import Connection
from aiowmi.query import Query
async def main():
host = '10.0.0.1' # ip address or hostname or fqdn
username = 'username'
password = 'password'
domain = '' # optional domain name
# Query has a default namespace 'root/cimv2'
queries = (
Query('SELECT * FROM Win32_OperatingSystem', namespace='root/cimv2'),
Query('SELECT * FROM Win32_NetworkAdapter'),
Query('SELECT * FROM Win32_LoggedOnUser'),
Query('SELECT * FROM Win32_PnpEntity'),
Query('SELECT Caption, Description, InstallDate, InstallDate2, '
'InstallLocation, InstallSource, InstallState, Language, '
'LocalPackage, Name, PackageCache, PackageCode, PackageName, '
'ProductID, RegCompany, RegOwner, SKUNumber, Transforms, '
'URLInfoAbout, URLUpdateInfo, Vendor, Version '
'FROM Win32_Product'),
Query('SELECT Name, DiskReadsPersec, DiskWritesPersec '
'FROM Win32_PerfFormattedData_PerfDisk_LogicalDisk'),
)
start = time.time()
conn = Connection(host, username, password, domain=domain)
service = None
await conn.connect()
try:
service = await conn.negotiate_ntlm()
for query in queries:
print(f"""
###############################################################################
# Start Query: {query.query}
###############################################################################
""")
async with query.context(conn, service) as qc:
async for props in qc.results():
# Function `get_properties(..)` accepts a few keyword
# arguments:
#
# ignore_defaults:
# Ignore default values. Set missing values to None
# if a value does not exist in the current class.
# ignore_defaults will always be True if
# ignore_missing is set to True.
# ignore_missing:
# If set to True, values missing in the current class
# will not be part of the result.
# load_qualifiers:
# Load the qualifiers of the properties. If False,
# the property qualifier_set will have the offset
# in the heap where the qualifiers are stored.
#
for name, prop in props.items():
print(name, '\n\t', prop.value)
if prop.is_reference():
# References can easy be queried using the
# get_reference(..) function. The function accepts
# a keyword argument `filter_props=[..]` with an
# optional list of properties to query. If omitted,
# the function returns all (*) properties.
res = await prop.get_reference(conn, service)
ref_props = res.get_properties(ignore_missing=True)
for name, prop in ref_props.items():
print('\t\t', name, '\n\t\t\t', prop.value)
print(f"""
----------------------------------- End Item ----------------------------------
""")
finally:
if service:
service.close()
conn.close()
end = time.time()
print('done in ', end-start)
if __name__ == '__main__':
formatter = logging.Formatter(
fmt='[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d] ' +
'%(message)s',
datefmt='%y%m%d %H:%M:%S',
style='%')
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger = logging.getLogger('aiowmi')
logger.addHandler(ch)
logger.setLevel(logging.DEBUG)
asyncio.run(main())
Kerberos
For Kerberos Authentication, make sure to use a FQDN as hostname and domain is no longer optional.
For caching TGT and TGS, a kerberos cache per connection can be kept.
from aiowmi.connection import Connection
from aiowmi.kerberos.cache import KerberosCache
# Example file cache (tgt, tgs are stored and loaded from file)
kcache = KerberosCache('/tmp/kcache.bin')
# Example mem-cache (tgt, tgs are stored in the cache which can be re-used)
kcache = KerberosCache()
conn = Connection(..., kerberos_cache=kcache)
# If different from the host, the kdc_host address may be provided
# for the Kerberos Key Distribution Center (KDC).
#
# Once connected (await conn.connect()), make the following negotiation call:
# service = await conn.negotiate_kerberos()
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
aiowmi-1.1.3.tar.gz
(94.1 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
aiowmi-1.1.3-py3-none-any.whl
(121.4 kB
view details)
File details
Details for the file aiowmi-1.1.3.tar.gz.
File metadata
- Download URL: aiowmi-1.1.3.tar.gz
- Upload date:
- Size: 94.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3272671ad8fd9a094d941d4191e35415d0d1f8f3477282b5f0ce6a6756acf84b
|
|
| MD5 |
b4324fc5460c655404ae5712d86f62fc
|
|
| BLAKE2b-256 |
e43d08e1921059453d52fcc225799df2bb189831ebfdb7ed39fb4da103b7de97
|
File details
Details for the file aiowmi-1.1.3-py3-none-any.whl.
File metadata
- Download URL: aiowmi-1.1.3-py3-none-any.whl
- Upload date:
- Size: 121.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
63fcaa1a282a6e6890f0e55cb75fe848f220aac7bfa91e219907152fc9b83466
|
|
| MD5 |
8c419fcc7ece7aa0cbbc5c6be6c762d4
|
|
| BLAKE2b-256 |
8a85fbaf037797f0e82d8a0f045dfd581da09c906d9c97282fbaa41d4217a505
|