diff --git a/docs/build/html/_modules/windows/winobject/process.html b/docs/build/html/_modules/windows/winobject/process.html index eb21852..7f40069 100644 --- a/docs/build/html/_modules/windows/winobject/process.html +++ b/docs/build/html/_modules/windows/winobject/process.html @@ -895,6 +895,10 @@ handle = winproxy.CreateThread(lpStartAddress=lpStartAddress, lpParameter=lpParameter, dwCreationFlags=dwCreationFlags) return WinThread._from_handle(handle) +
[docs] def load_library(self, dll_path): + """Load the library in current process""" + return winproxy.LoadLibraryA(dll_path)
+
[docs] def execute(self, code, parameter=0): """Execute native code ``code`` in the current thread. diff --git a/docs/build/html/_modules/windows/winobject/system.html b/docs/build/html/_modules/windows/winobject/system.html index dfb97ee..1c499c7 100644 --- a/docs/build/html/_modules/windows/winobject/system.html +++ b/docs/build/html/_modules/windows/winobject/system.html @@ -131,10 +131,11 @@ @utils.fixedpropety def wmi(self): - r"""An object to perform wmi request to "root\\cimv2" + r"""An object to perform wmi requests to various namespaces - :type: :class:`windows.winobject.wmi.WmiRequester`""" - return wmi.WmiRequester() + :type: :class:`windows.winobject.wmi.WmiManager`""" + # return wmi.WmiRequester() + return wmi.WmiManager() #TODO: use GetComputerNameExA ? and recover other names ? @utils.fixedpropety diff --git a/docs/build/html/_modules/windows/winobject/wmi.html b/docs/build/html/_modules/windows/winobject/wmi.html index b72bd93..5d859d5 100644 --- a/docs/build/html/_modules/windows/winobject/wmi.html +++ b/docs/build/html/_modules/windows/winobject/wmi.html @@ -64,13 +64,8 @@ r"""An object to perform wmi request to ``root\cimv2``""" INSTANCE = None - # def __new__(cls, *args, **kwargs): - # if cls.INSTANCE is not None: - # return cls.INSTANCE - # cls.INSTANCE = super(cls, cls).__new__(cls, *args, **kwargs) - # return cls.INSTANCE - def __init__(self, target="root\\cimv2", user=None, password=None): + self.namespace = target locator = IWbemLocator() service = IWbemServices() #CLSID_WbemAdministrativeLocator_IID = windows.com.IID.from_string('CB8555CC-9128-11D1-AD9B-00C04FD8FDFF') @@ -84,11 +79,26 @@
[docs] def select(self, frm, attrs="*"): """Select ``attrs`` from ``frm`` + :rtype: list of dict + """ + return self.query("select * from {0}".format(frm), attrs)
+ + @property + def classes(self): + """The list of class available + + :rtype: list of str + """ + return [x["__CLASS"] for x in self.query('SELECT * FROM meta_class', attrs=["__CLASS"])] + +
[docs] def query(self, query, attrs="*"): + """Execute WMI ``query`` and return the attributes ``attrs`` + :rtype: list of dict """ enumerator = IEnumWbemClassObject() try: - self.service.ExecQuery("WQL", "select * from {0}".format(frm), 0x20, 0, ctypes.byref(enumerator)) + self.service.ExecQuery("WQL", query, 0x20, 0, ctypes.byref(enumerator)) except WindowsError as e: if (e.winerror & 0xffffffff) == WBEM_E_INVALID_CLASS: raise WindowsError(e.winerror, 'WBEM_E_INVALID_CLASS <Invalid WMI class "{0}">'.format(frm)) @@ -106,7 +116,14 @@ if attrs == "*": attrs = [x for x in self.get_names(processor) if not x.startswith("__")] for name in attrs: - processor.Get(name, 0, ctypes.byref(variant_res), None, None) + try: + processor.Get(name, 0, ctypes.byref(variant_res), None, None) + except WindowsError as e: + if (e.winerror & 0xffffffff) == WBEM_E_NOT_FOUND: + raise WindowsError(e.winerror, 'WBEM_E_NOT_FOUND <Invalid Attribute "{0}">'.format(name)) + if (e.winerror & 0xffffffff) in WBEMSTATUS.values: + raise WindowsError(e.winerror, WBEMSTATUS(e.winerror & 0xffffffff).value) + raise # TODO: something clean and generic if variant_res.vt & VT_ARRAY: if variant_res.vt & VT_TYPEMASK == VT_BSTR: @@ -131,12 +148,50 @@ enumerator.Next(0xffffffff, 1, ctypes.byref(processor), ctypes.byref(count)) return res
+ def get_names(self, processor): res = POINTER(SAFEARRAY)() processor.GetNames(None, 0, None, byref(res)) safe_array = ctypes.cast(res, POINTER(windows.com.ImprovedSAFEARRAY))[0] safe_array.elt_type = BSTR - return safe_array.to_list()
+ return safe_array.to_list() + + + def __repr__(self): + return """<{0} namespace="{1}">""".format(type(self).__name__, self.namespace) + +
[docs]class WmiManager(dict): + """The main WMI class exposed, used to list and access differents WMI namespace, can be used as a dict to access + :cls:`WmiRequester` by namespace""" + DEFAULT_NAMESPACE = "root\\cimv2" + def __init__(self): + self.wmi_requester_by_namespace = {} + + @property + def select(self): + r""":func:`WmiRequester.select` for default WMI namespace 'root\\cimv2'""" + return self[self.DEFAULT_NAMESPACE].select + + @property + def query(self): + r""":func:`WmiRequester.query` for default WMI namespace 'root\\cimv2'""" + return self[self.DEFAULT_NAMESPACE].query + + def get_subnamespaces(self, root="root"): + return [x["Name"] for x in self[root].select("__NameSpace", ["Name"])] + + namespaces = property(get_subnamespaces) + """The list of available WMI namespaces""" + + def _open_wmi_requester(self, namespace): + return WmiRequester(namespace) + + def __missing__(self, key): + self[key] = self._open_wmi_requester(key) + return self[key] + + def __repr__(self): + return object.__repr__(self)
diff --git a/docs/build/html/_sources/wmi.rst.txt b/docs/build/html/_sources/wmi.rst.txt index f7b41b3..ffd4be4 100644 --- a/docs/build/html/_sources/wmi.rst.txt +++ b/docs/build/html/_sources/wmi.rst.txt @@ -7,4 +7,8 @@ WMI -- Make request to WMI See sample :ref:`wmi_request` -.. autoclass:: WmiRequester \ No newline at end of file +.. autoclass:: WmiRequester + +.. autoclass:: WmiManager + :no-inherited-members: + :members: select, query, namespaces \ No newline at end of file diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 3680e4b..059174e 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -2101,6 +2101,8 @@
  • (windows.generated_def.WINTRUST_SGNR_INFO_ attribute)
  • +
  • classes (windows.winobject.wmi.WmiRequester attribute) +
  • ClassId (windows.generated_def._SPC_SERIALIZED_OBJECT attribute)
  • CLIENT_ID (class in windows.generated_def) @@ -6001,8 +6003,12 @@
  • LOAD_DLL_DEBUG_INFO (class in windows.generated_def)
  • -
  • load_library() (windows.winobject.process.WinProcess method) +
  • load_library() (windows.winobject.process.CurrentProcess method) + +
  • LoadCount (windows.generated_def._SYSTEM_MODULE32 attribute)