Skip to main content

CI Release Version

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()

Metadata

Release files for aiowmi 1.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aiowmi 1.1.3
File Size Uploaded Provenance Actions
aiowmi-1.1.3.tar.gz 94.1 kB Without provenance Details for aiowmi-1.1.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for aiowmi 1.1.3
File Interpreter ABI Platform Actions
aiowmi-1.1.3-py3-none-any.whl Python 3 none any Details for aiowmi-1.1.3-py3-none-any.whl

Total release size: 215.5 kB

Release files / aiowmi-1.1.3.tar.gz

Download URL aiowmi-1.1.3.tar.gz
Size 94.1 kB
Tags Source
SHA-256 checksum
How to use checksums
3272671ad8fd9a094d941d4191e35415d0d1f8f3477282b5f0ce6a6756acf84b
BLAKE2b-256 checksum
How to use checksums
e43d08e1921059453d52fcc225799df2bb189831ebfdb7ed39fb4da103b7de97
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / aiowmi-1.1.3-py3-none-any.whl

Download URL aiowmi-1.1.3-py3-none-any.whl
Size 121.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
63fcaa1a282a6e6890f0e55cb75fe848f220aac7bfa91e219907152fc9b83466
BLAKE2b-256 checksum
How to use checksums
8a85fbaf037797f0e82d8a0f045dfd581da09c906d9c97282fbaa41d4217a505
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Security for aiowmi 1.1.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.1.3 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page