Improve WMI capabilities by adding access to various namespaces + listing methods + add CurrentProcess.load_library

This commit is contained in:
Clement Rouault
2017-11-08 17:55:47 +01:00
parent e07d4dbe0c
commit 5a79e15440
14 changed files with 4050 additions and 34 deletions
@@ -895,6 +895,10 @@
<span class="n">handle</span> <span class="o">=</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">CreateThread</span><span class="p">(</span><span class="n">lpStartAddress</span><span class="o">=</span><span class="n">lpStartAddress</span><span class="p">,</span> <span class="n">lpParameter</span><span class="o">=</span><span class="n">lpParameter</span><span class="p">,</span> <span class="n">dwCreationFlags</span><span class="o">=</span><span class="n">dwCreationFlags</span><span class="p">)</span>
<span class="k">return</span> <span class="n">WinThread</span><span class="o">.</span><span class="n">_from_handle</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span></div>
<div class="viewcode-block" id="CurrentProcess.load_library"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.CurrentProcess.load_library">[docs]</a> <span class="k">def</span> <span class="nf">load_library</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dll_path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Load the library in current process&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">winproxy</span><span class="o">.</span><span class="n">LoadLibraryA</span><span class="p">(</span><span class="n">dll_path</span><span class="p">)</span></div>
<div class="viewcode-block" id="CurrentProcess.execute"><a class="viewcode-back" href="../../../process.html#windows.winobject.process.CurrentProcess.execute">[docs]</a> <span class="k">def</span> <span class="nf">execute</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">parameter</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Execute native code ``code`` in the current thread.</span>
+4 -3
View File
@@ -131,10 +131,11 @@
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
<span class="k">def</span> <span class="nf">wmi</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;An object to perform wmi request to &quot;root\\cimv2&quot;</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;An object to perform wmi requests to various namespaces</span>
<span class="sd"> :type: :class:`windows.winobject.wmi.WmiRequester`&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">wmi</span><span class="o">.</span><span class="n">WmiRequester</span><span class="p">()</span>
<span class="sd"> :type: :class:`windows.winobject.wmi.WmiManager`&quot;&quot;&quot;</span>
<span class="c1"># return wmi.WmiRequester()</span>
<span class="k">return</span> <span class="n">wmi</span><span class="o">.</span><span class="n">WmiManager</span><span class="p">()</span>
<span class="c1">#TODO: use GetComputerNameExA ? and recover other names ?</span>
<span class="nd">@utils</span><span class="o">.</span><span class="n">fixedpropety</span>
+64 -9
View File
@@ -64,13 +64,8 @@
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;An object to perform wmi request to ``root\cimv2``&quot;&quot;&quot;</span>
<span class="n">INSTANCE</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># def __new__(cls, *args, **kwargs):</span>
<span class="c1"># if cls.INSTANCE is not None:</span>
<span class="c1"># return cls.INSTANCE</span>
<span class="c1"># cls.INSTANCE = super(cls, cls).__new__(cls, *args, **kwargs)</span>
<span class="c1"># return cls.INSTANCE</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="s2">&quot;root</span><span class="se">\\</span><span class="s2">cimv2&quot;</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">namespace</span> <span class="o">=</span> <span class="n">target</span>
<span class="n">locator</span> <span class="o">=</span> <span class="n">IWbemLocator</span><span class="p">()</span>
<span class="n">service</span> <span class="o">=</span> <span class="n">IWbemServices</span><span class="p">()</span>
<span class="c1">#CLSID_WbemAdministrativeLocator_IID = windows.com.IID.from_string(&#39;CB8555CC-9128-11D1-AD9B-00C04FD8FDFF&#39;)</span>
@@ -84,11 +79,26 @@
<div class="viewcode-block" id="WmiRequester.select"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiRequester.select">[docs]</a> <span class="k">def</span> <span class="nf">select</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frm</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="s2">&quot;*&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Select ``attrs`` from ``frm``</span>
<span class="sd"> :rtype: list of dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&quot;select * from </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">frm</span><span class="p">),</span> <span class="n">attrs</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">classes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The list of class available</span>
<span class="sd"> :rtype: list of str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="s2">&quot;__CLASS&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s1">&#39;SELECT * FROM meta_class&#39;</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;__CLASS&quot;</span><span class="p">])]</span>
<div class="viewcode-block" id="WmiRequester.query"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiRequester.query">[docs]</a> <span class="k">def</span> <span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="s2">&quot;*&quot;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Execute WMI ``query`` and return the attributes ``attrs``</span>
<span class="sd"> :rtype: list of dict</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">enumerator</span> <span class="o">=</span> <span class="n">IEnumWbemClassObject</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">ExecQuery</span><span class="p">(</span><span class="s2">&quot;WQL&quot;</span><span class="p">,</span> <span class="s2">&quot;select * from </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">frm</span><span class="p">),</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">enumerator</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">service</span><span class="o">.</span><span class="n">ExecQuery</span><span class="p">(</span><span class="s2">&quot;WQL&quot;</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">enumerator</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">==</span> <span class="n">WBEM_E_INVALID_CLASS</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">,</span> <span class="s1">&#39;WBEM_E_INVALID_CLASS &lt;Invalid WMI class &quot;</span><span class="si">{0}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">frm</span><span class="p">))</span>
@@ -106,7 +116,14 @@
<span class="k">if</span> <span class="n">attrs</span> <span class="o">==</span> <span class="s2">&quot;*&quot;</span><span class="p">:</span>
<span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_names</span><span class="p">(</span><span class="n">processor</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;__&quot;</span><span class="p">)]</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
<span class="n">processor</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">variant_res</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">processor</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">variant_res</span><span class="p">),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">WindowsError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="o">==</span> <span class="n">WBEM_E_NOT_FOUND</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">,</span> <span class="s1">&#39;WBEM_E_NOT_FOUND &lt;Invalid Attribute &quot;</span><span class="si">{0}</span><span class="s1">&quot;&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
<span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span> <span class="ow">in</span> <span class="n">WBEMSTATUS</span><span class="o">.</span><span class="n">values</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">WindowsError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span><span class="p">,</span> <span class="n">WBEMSTATUS</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">winerror</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</span><span class="p">)</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">raise</span>
<span class="c1"># TODO: something clean and generic</span>
<span class="k">if</span> <span class="n">variant_res</span><span class="o">.</span><span class="n">vt</span> <span class="o">&amp;</span> <span class="n">VT_ARRAY</span><span class="p">:</span>
<span class="k">if</span> <span class="n">variant_res</span><span class="o">.</span><span class="n">vt</span> <span class="o">&amp;</span> <span class="n">VT_TYPEMASK</span> <span class="o">==</span> <span class="n">VT_BSTR</span><span class="p">:</span>
@@ -131,12 +148,50 @@
<span class="n">enumerator</span><span class="o">.</span><span class="n">Next</span><span class="p">(</span><span class="mh">0xffffffff</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">processor</span><span class="p">),</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">byref</span><span class="p">(</span><span class="n">count</span><span class="p">))</span>
<span class="k">return</span> <span class="n">res</span></div>
<span class="k">def</span> <span class="nf">get_names</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">processor</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">POINTER</span><span class="p">(</span><span class="n">SAFEARRAY</span><span class="p">)()</span>
<span class="n">processor</span><span class="o">.</span><span class="n">GetNames</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">res</span><span class="p">))</span>
<span class="n">safe_array</span> <span class="o">=</span> <span class="n">ctypes</span><span class="o">.</span><span class="n">cast</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">POINTER</span><span class="p">(</span><span class="n">windows</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">ImprovedSAFEARRAY</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">safe_array</span><span class="o">.</span><span class="n">elt_type</span> <span class="o">=</span> <span class="n">BSTR</span>
<span class="k">return</span> <span class="n">safe_array</span><span class="o">.</span><span class="n">to_list</span><span class="p">()</span></div>
<span class="k">return</span> <span class="n">safe_array</span><span class="o">.</span><span class="n">to_list</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;&quot;&quot;&lt;</span><span class="si">{0}</span><span class="s2"> namespace=&quot;</span><span class="si">{1}</span><span class="s2">&quot;&gt;&quot;&quot;&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">namespace</span><span class="p">)</span></div>
<div class="viewcode-block" id="WmiManager"><a class="viewcode-back" href="../../../wmi.html#windows.winobject.wmi.WmiManager">[docs]</a><span class="k">class</span> <span class="nc">WmiManager</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;The main WMI class exposed, used to list and access differents WMI namespace, can be used as a dict to access</span>
<span class="sd"> :cls:`WmiRequester` by namespace&quot;&quot;&quot;</span>
<span class="n">DEFAULT_NAMESPACE</span> <span class="o">=</span> <span class="s2">&quot;root</span><span class="se">\\</span><span class="s2">cimv2&quot;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wmi_requester_by_namespace</span> <span class="o">=</span> <span class="p">{}</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">select</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;:func:`WmiRequester.select` for default WMI namespace &#39;root\\cimv2&#39;&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_NAMESPACE</span><span class="p">]</span><span class="o">.</span><span class="n">select</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;:func:`WmiRequester.query` for default WMI namespace &#39;root\\cimv2&#39;&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">DEFAULT_NAMESPACE</span><span class="p">]</span><span class="o">.</span><span class="n">query</span>
<span class="k">def</span> <span class="nf">get_subnamespaces</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">root</span><span class="o">=</span><span class="s2">&quot;root&quot;</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="s2">&quot;Name&quot;</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">[</span><span class="n">root</span><span class="p">]</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s2">&quot;__NameSpace&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;Name&quot;</span><span class="p">])]</span>
<span class="n">namespaces</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_subnamespaces</span><span class="p">)</span>
<span class="sd">&quot;&quot;&quot;The list of available WMI namespaces&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">_open_wmi_requester</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">namespace</span><span class="p">):</span>
<span class="k">return</span> <span class="n">WmiRequester</span><span class="p">(</span><span class="n">namespace</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__missing__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_wmi_requester</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
</pre></div>
</div>
+5 -1
View File
@@ -7,4 +7,8 @@ WMI -- Make request to WMI
See sample :ref:`wmi_request`
.. autoclass:: WmiRequester
.. autoclass:: WmiRequester
.. autoclass:: WmiManager
:no-inherited-members:
:members: select, query, namespaces
+19 -3
View File
@@ -2101,6 +2101,8 @@
<li><a href="winstructs_generated.html#windows.generated_def.WINTRUST_SGNR_INFO_.chStores">(windows.generated_def.WINTRUST_SGNR_INFO_ attribute)</a>
</li>
</ul></li>
<li><a href="wmi.html#windows.winobject.wmi.WmiRequester.classes">classes (windows.winobject.wmi.WmiRequester attribute)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def._SPC_SERIALIZED_OBJECT.ClassId">ClassId (windows.generated_def._SPC_SERIALIZED_OBJECT attribute)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def.CLIENT_ID">CLIENT_ID (class in windows.generated_def)</a>
@@ -6001,8 +6003,12 @@
</li>
<li><a href="winstructs_generated.html#windows.generated_def.LOAD_DLL_DEBUG_INFO">LOAD_DLL_DEBUG_INFO (class in windows.generated_def)</a>
</li>
<li><a href="process.html#windows.winobject.process.WinProcess.load_library">load_library() (windows.winobject.process.WinProcess method)</a>
<li><a href="process.html#windows.winobject.process.CurrentProcess.load_library">load_library() (windows.winobject.process.CurrentProcess method)</a>
<ul>
<li><a href="process.html#windows.winobject.process.WinProcess.load_library">(windows.winobject.process.WinProcess method)</a>
</li>
</ul></li>
<li><a href="winstructs_generated.html#windows.generated_def._SYSTEM_MODULE32.LoadCount">LoadCount (windows.generated_def._SYSTEM_MODULE32 attribute)</a>
<ul>
@@ -6098,11 +6104,11 @@
<li><a href="windef_generated.html#windows.generated_def.LPC_DEBUG_EVENT">LPC_DEBUG_EVENT (in module windows.generated_def)</a>
</li>
<li><a href="windef_generated.html#windows.generated_def.LPC_ERROR_EVENT">LPC_ERROR_EVENT (in module windows.generated_def)</a>
</li>
<li><a href="windef_generated.html#windows.generated_def.LPC_EXCEPTION">LPC_EXCEPTION (in module windows.generated_def)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="windef_generated.html#windows.generated_def.LPC_EXCEPTION">LPC_EXCEPTION (in module windows.generated_def)</a>
</li>
<li><a href="windef_generated.html#windows.generated_def.LPC_LOST_REPLY">LPC_LOST_REPLY (in module windows.generated_def)</a>
</li>
<li><a href="windef_generated.html#windows.generated_def.LPC_PORT_CLOSED">LPC_PORT_CLOSED (in module windows.generated_def)</a>
@@ -6690,6 +6696,8 @@
<li><a href="winstructs_generated.html#windows.generated_def._SYMBOL_INFO.NameLen">NameLen (windows.generated_def._SYMBOL_INFO attribute)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def._DEBUG_SYMBOL_ENTRY.NameSize">NameSize (windows.generated_def._DEBUG_SYMBOL_ENTRY attribute)</a>
</li>
<li><a href="wmi.html#windows.winobject.wmi.WmiManager.namespaces">namespaces (windows.winobject.wmi.WmiManager attribute)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def._DEBUG_VALUE_TMP_SUBSTRUCT1.Nat">Nat (windows.generated_def._DEBUG_VALUE_TMP_SUBSTRUCT1 attribute)</a>
</li>
@@ -8041,6 +8049,10 @@
</ul></li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="wmi.html#windows.winobject.wmi.WmiManager.query">query (windows.winobject.wmi.WmiManager attribute)</a>
</li>
<li><a href="wmi.html#windows.winobject.wmi.WmiRequester.query">query() (windows.winobject.wmi.WmiRequester method)</a>
</li>
<li><a href="process.html#windows.winobject.process.CurrentProcess.query_memory">query_memory() (windows.winobject.process.CurrentProcess method)</a>
<ul>
@@ -8981,6 +8993,8 @@
<li><a href="winstructs_generated.html#windows.generated_def._WOW64_CONTEXT.SegSs">(windows.generated_def._WOW64_CONTEXT attribute)</a>
</li>
</ul></li>
<li><a href="wmi.html#windows.winobject.wmi.WmiManager.select">select (windows.winobject.wmi.WmiManager attribute)</a>
</li>
<li><a href="wmi.html#windows.winobject.wmi.WmiRequester.select">select() (windows.winobject.wmi.WmiRequester method)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def.CRYPTCATMEMBER_.sEncodedIndirectData">sEncodedIndirectData (windows.generated_def.CRYPTCATMEMBER_ attribute)</a>
@@ -15336,6 +15350,8 @@
<li><a href="windows.html#windows.winobject.system.System.wmi">wmi (windows.winobject.system.System attribute)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def._SYSTEMTIME.wMilliseconds">wMilliseconds (windows.generated_def._SYSTEMTIME attribute)</a>
</li>
<li><a href="wmi.html#windows.winobject.wmi.WmiManager">WmiManager (class in windows.winobject.wmi)</a>
</li>
<li><a href="winstructs_generated.html#windows.generated_def._SYSTEMTIME.wMinute">wMinute (windows.generated_def._SYSTEMTIME attribute)</a>
</li>
+6
View File
@@ -205,6 +205,12 @@
</table>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.process.CurrentProcess.load_library">
<code class="descname">load_library</code><span class="sig-paren">(</span><em>dll_path</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/process.html#CurrentProcess.load_library"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.process.CurrentProcess.load_library" title="Permalink to this definition"></a></dt>
<dd><p>Load the library in current process</p>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.process.CurrentProcess.memory_state">
<code class="descname">memory_state</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#windows.winobject.process.CurrentProcess.memory_state" title="Permalink to this definition"></a></dt>
+1 -1
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -149,7 +149,7 @@ It also offers some submodules aimed to help the interfacing with <code class="d
<dl class="attribute">
<dt id="windows.winobject.system.System.network">
<code class="descname">network</code><em class="property"> = &lt;windows.winobject.network.Network object at 0x06D0D3D0&gt;</em><a class="headerlink" href="#windows.winobject.system.System.network" title="Permalink to this definition"></a></dt>
<code class="descname">network</code><em class="property"> = &lt;windows.winobject.network.Network object at 0x060C7210&gt;</em><a class="headerlink" href="#windows.winobject.system.System.network" title="Permalink to this definition"></a></dt>
<dd><p>Object of class <a class="reference internal" href="network.html#windows.winobject.network.Network" title="windows.winobject.network.Network"><code class="xref py py-class docutils literal"><span class="pre">windows.winobject.network.Network</span></code></a></p>
</dd></dl>
@@ -190,7 +190,7 @@ It also offers some submodules aimed to help the interfacing with <code class="d
<dl class="attribute">
<dt id="windows.winobject.system.System.registry">
<code class="descname">registry</code><em class="property"> = &lt;windows.winobject.registry.Registry object at 0x06D0D3F0&gt;</em><a class="headerlink" href="#windows.winobject.system.System.registry" title="Permalink to this definition"></a></dt>
<code class="descname">registry</code><em class="property"> = &lt;windows.winobject.registry.Registry object at 0x060C7230&gt;</em><a class="headerlink" href="#windows.winobject.system.System.registry" title="Permalink to this definition"></a></dt>
<dd><p>Object of class <a class="reference internal" href="registry.html#windows.winobject.registry.Registry" title="windows.winobject.registry.Registry"><code class="xref py py-class docutils literal"><span class="pre">windows.winobject.registry.Registry</span></code></a></p>
</dd></dl>
@@ -274,12 +274,12 @@ It also offers some submodules aimed to help the interfacing with <code class="d
<dl class="attribute">
<dt id="windows.winobject.system.System.wmi">
<code class="descname">wmi</code><a class="headerlink" href="#windows.winobject.system.System.wmi" title="Permalink to this definition"></a></dt>
<dd><p>An object to perform wmi request to &#8220;root\cimv2&#8221;</p>
<dd><p>An object to perform wmi requests to various namespaces</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="wmi.html#windows.winobject.wmi.WmiRequester" title="windows.winobject.wmi.WmiRequester"><code class="xref py py-class docutils literal"><span class="pre">windows.winobject.wmi.WmiRequester</span></code></a></td>
<tr class="field-odd field"><th class="field-name">Type:</th><td class="field-body"><a class="reference internal" href="wmi.html#windows.winobject.wmi.WmiManager" title="windows.winobject.wmi.WmiManager"><code class="xref py py-class docutils literal"><span class="pre">windows.winobject.wmi.WmiManager</span></code></a></td>
</tr>
</tbody>
</table>
+53
View File
@@ -65,6 +65,34 @@
<dt id="windows.winobject.wmi.WmiRequester">
<em class="property">class </em><code class="descclassname">windows.winobject.wmi.</code><code class="descname">WmiRequester</code><span class="sig-paren">(</span><em>target='root\cimv2'</em>, <em>user=None</em>, <em>password=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/wmi.html#WmiRequester"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.wmi.WmiRequester" title="Permalink to this definition"></a></dt>
<dd><p>An object to perform wmi request to <code class="docutils literal"><span class="pre">root\cimv2</span></code></p>
<dl class="attribute">
<dt id="windows.winobject.wmi.WmiRequester.classes">
<code class="descname">classes</code><a class="headerlink" href="#windows.winobject.wmi.WmiRequester.classes" title="Permalink to this definition"></a></dt>
<dd><p>The list of class available</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">list of str</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.wmi.WmiRequester.query">
<code class="descname">query</code><span class="sig-paren">(</span><em>query</em>, <em>attrs='*'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/wmi.html#WmiRequester.query"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.wmi.WmiRequester.query" title="Permalink to this definition"></a></dt>
<dd><p>Execute WMI <code class="docutils literal"><span class="pre">query</span></code> and return the attributes <code class="docutils literal"><span class="pre">attrs</span></code></p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body">list of dict</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="windows.winobject.wmi.WmiRequester.select">
<code class="descname">select</code><span class="sig-paren">(</span><em>frm</em>, <em>attrs='*'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/windows/winobject/wmi.html#WmiRequester.select"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.wmi.WmiRequester.select" title="Permalink to this definition"></a></dt>
@@ -81,6 +109,31 @@
</dd></dl>
<dl class="class">
<dt id="windows.winobject.wmi.WmiManager">
<em class="property">class </em><code class="descclassname">windows.winobject.wmi.</code><code class="descname">WmiManager</code><a class="reference internal" href="_modules/windows/winobject/wmi.html#WmiManager"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#windows.winobject.wmi.WmiManager" title="Permalink to this definition"></a></dt>
<dd><p>The main WMI class exposed, used to list and access differents WMI namespace, can be used as a dict to access
<a href="#id1"><span class="problematic" id="id2">:cls:`WmiRequester`</span></a> by namespace</p>
<dl class="attribute">
<dt id="windows.winobject.wmi.WmiManager.namespaces">
<code class="descname">namespaces</code><a class="headerlink" href="#windows.winobject.wmi.WmiManager.namespaces" title="Permalink to this definition"></a></dt>
<dd><p>The list of available WMI namespaces</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.wmi.WmiManager.query">
<code class="descname">query</code><a class="headerlink" href="#windows.winobject.wmi.WmiManager.query" title="Permalink to this definition"></a></dt>
<dd><p><a class="reference internal" href="#windows.winobject.wmi.WmiRequester.query" title="windows.winobject.wmi.WmiRequester.query"><code class="xref py py-func docutils literal"><span class="pre">WmiRequester.query()</span></code></a> for default WMI namespace &#8216;root\cimv2&#8217;</p>
</dd></dl>
<dl class="attribute">
<dt id="windows.winobject.wmi.WmiManager.select">
<code class="descname">select</code><a class="headerlink" href="#windows.winobject.wmi.WmiManager.select" title="Permalink to this definition"></a></dt>
<dd><p><a class="reference internal" href="#windows.winobject.wmi.WmiRequester.select" title="windows.winobject.wmi.WmiRequester.select"><code class="xref py py-func docutils literal"><span class="pre">WmiRequester.select()</span></code></a> for default WMI namespace &#8216;root\cimv2&#8217;</p>
</dd></dl>
</dd></dl>
</div>
+3814
View File
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -7,4 +7,8 @@ WMI -- Make request to WMI
See sample :ref:`wmi_request`
.. autoclass:: WmiRequester
.. autoclass:: WmiRequester
.. autoclass:: WmiManager
:no-inherited-members:
:members: select, query, namespaces
+4
View File
@@ -845,6 +845,10 @@ class CurrentProcess(Process):
handle = winproxy.CreateThread(lpStartAddress=lpStartAddress, lpParameter=lpParameter, dwCreationFlags=dwCreationFlags)
return WinThread._from_handle(handle)
def load_library(self, dll_path):
"""Load the library in current process"""
return winproxy.LoadLibraryA(dll_path)
def execute(self, code, parameter=0):
"""Execute native code ``code`` in the current thread.
+3 -3
View File
@@ -81,10 +81,10 @@ class System(object):
@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.WmiManager()
#TODO: use GetComputerNameExA ? and recover other names ?
@utils.fixedpropety
+64 -9
View File
@@ -14,13 +14,8 @@ class WmiRequester(object):
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')
@@ -34,11 +29,26 @@ class WmiRequester(object):
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"])]
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))
@@ -56,7 +66,14 @@ class WmiRequester(object):
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:
@@ -81,9 +98,47 @@ class WmiRequester(object):
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)
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)