From ec941f1b11a27936b12588c2584bd7f60c566163 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sat, 13 Apr 2019 09:05:04 +0300 Subject: [PATCH] #Python32Add_wmi --- README.md | 2 +- .../Lib/__pycache__/argparse.cpython-37.pyc | Bin 61938 -> 61938 bytes .../Lib/__pycache__/imp.cpython-37.pyc | Bin 9768 -> 9778 bytes .../__pycache__/_msvccompiler.cpython-37.pyc | Bin 13623 -> 13623 bytes .../__pycache__/ccompiler.cpython-37.pyc | Bin 33241 -> 33241 bytes .../__pycache__/filelist.cpython-37.pyc | Bin 9863 -> 9863 bytes .../__pycache__/msvc9compiler.cpython-37.pyc | Bin 17408 -> 17408 bytes .../__pycache__/text_file.cpython-37.pyc | Bin 8470 -> 8470 bytes .../__pycache__/version.cpython-37.pyc | Bin 7381 -> 7381 bytes .../command/__pycache__/bdist.cpython-37.pyc | Bin 3679 -> 3679 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 15788 -> 15788 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 10416 -> 10416 bytes .../__pycache__/build_scripts.cpython-37.pyc | Bin 4315 -> 4315 bytes .../__pycache__/install_data.cpython-37.pyc | Bin 0 -> 2310 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 5103 -> 5103 bytes .../install_scripts.cpython-37.pyc | Bin 2167 -> 2167 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 14533 -> 14533 bytes .../__pycache__/generator.cpython-37.pyc | Bin 12525 -> 12525 bytes .../__pycache__/ascii.cpython-37.pyc | Bin 1909 -> 1909 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 168 -> 168 bytes .../__pycache__/btm_matcher.cpython-37.pyc | Bin 4918 -> 4918 bytes .../__pycache__/btm_utils.cpython-37.pyc | Bin 6168 -> 6168 bytes .../__pycache__/fixer_util.cpython-37.pyc | Bin 12071 -> 12071 bytes .../__pycache__/patcomp.cpython-37.pyc | Bin 5636 -> 5636 bytes .../lib2to3/__pycache__/pygram.cpython-37.pyc | Bin 1223 -> 1223 bytes .../lib2to3/__pycache__/pytree.cpython-37.pyc | Bin 25028 -> 25028 bytes .../__pycache__/refactor.cpython-37.pyc | Bin 20429 -> 20429 bytes .../pgen2/__pycache__/__init__.cpython-37.pyc | Bin 204 -> 204 bytes .../pgen2/__pycache__/driver.cpython-37.pyc | Bin 5165 -> 5165 bytes .../pgen2/__pycache__/grammar.cpython-37.pyc | Bin 7041 -> 7041 bytes .../pgen2/__pycache__/literals.cpython-37.pyc | Bin 1583 -> 1583 bytes .../pgen2/__pycache__/parse.cpython-37.pyc | Bin 6329 -> 6329 bytes .../pgen2/__pycache__/pgen.cpython-37.pyc | Bin 9805 -> 9805 bytes .../pgen2/__pycache__/token.cpython-37.pyc | Bin 1897 -> 1897 bytes .../pgen2/__pycache__/tokenize.cpython-37.pyc | Bin 15165 -> 15165 bytes .../WMI-1.4.9.dist-info/INSTALLER | 1 + .../WMI-1.4.9.dist-info/METADATA | 111 ++ .../site-packages/WMI-1.4.9.dist-info/RECORD | 13 + .../site-packages/WMI-1.4.9.dist-info/WHEEL | 5 + .../WMI-1.4.9.dist-info/top_level.txt | 1 + .../__pycache__/pythoncom.cpython-37.pyc | Bin 291 -> 267 bytes .../__pycache__/wmi.cpython-37.pyc | Bin 0 -> 46979 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 98550 -> 98560 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 623 -> 633 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 186 -> 196 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 20674 -> 20684 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 203029 -> 203039 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24387 -> 24397 bytes .../__pycache__/__about__.cpython-37.pyc | Bin 722 -> 732 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 560 -> 570 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1012 -> 1022 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2864 -> 2874 bytes .../__pycache__/markers.cpython-37.pyc | Bin 8872 -> 8882 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 3877 -> 3887 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19790 -> 19800 bytes .../__pycache__/version.cpython-37.pyc | Bin 10557 -> 10567 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 2405 -> 2415 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 7697 -> 7697 bytes .../_deprecation_warning.cpython-37.pyc | Bin 551 -> 551 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 5132 -> 5132 bytes .../__pycache__/config.cpython-37.pyc | Bin 17694 -> 17694 bytes .../__pycache__/depends.cpython-37.pyc | Bin 5267 -> 5267 bytes .../__pycache__/dist.cpython-37.pyc | Bin 42211 -> 42211 bytes .../__pycache__/extension.cpython-37.pyc | Bin 1978 -> 1978 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 1543 -> 1543 bytes .../__pycache__/glob.cpython-37.pyc | Bin 3753 -> 3753 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 2427 -> 2436 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 4637 -> 4637 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 34434 -> 34434 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 3615 -> 3615 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 32708 -> 32708 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 7205 -> 7205 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 814 -> 814 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 1423 -> 1423 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 15539 -> 15539 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 6795 -> 6795 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 1499 -> 1499 bytes .../__pycache__/version.cpython-37.pyc | Bin 331 -> 331 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 6984 -> 6984 bytes .../windows_support.cpython-37.pyc | Bin 1014 -> 1014 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 193 -> 193 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 24394 -> 24394 bytes .../__pycache__/__about__.cpython-37.pyc | Bin 729 -> 729 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 567 -> 567 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 1019 -> 1019 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 2871 -> 2871 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 19797 -> 19797 bytes .../__pycache__/utils.cpython-37.pyc | Bin 498 -> 498 bytes .../__pycache__/version.cpython-37.pyc | Bin 10564 -> 10564 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 739 -> 739 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 14195 -> 14195 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 9710 -> 9710 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 8577 -> 8586 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 64838 -> 64838 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 21684 -> 21684 bytes .../__pycache__/install.cpython-37.pyc | Bin 4005 -> 4014 bytes .../install_egg_info.cpython-37.pyc | Bin 2415 -> 2415 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 4091 -> 4091 bytes .../install_scripts.cpython-37.pyc | Bin 2294 -> 2294 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 4627 -> 4627 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 6786 -> 6786 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 4526 -> 4526 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 2416 -> 2416 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 10086 -> 10086 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 3778 -> 3778 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 4713 -> 4713 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 1573 -> 1573 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 1318 -> 1318 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 5417 -> 5417 bytes .../cli/__pycache__/__init__.cpython-37.pyc | Bin 3044 -> 3044 bytes .../lib/__pycache__/pywintypes.cpython-37.pyc | Bin 1828 -> 1804 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 1745 -> 1759 bytes .../shell/__pycache__/__init__.cpython-37.pyc | Bin 249 -> 263 bytes .../python-3.7.2/Lib/site-packages/wmi.py | 1441 +++++++++++++++++ .../Scripts/__pycache__/wmiweb.cpython-37.pyc | Bin 0 -> 6912 bytes WPy32-3720/python-3.7.2/Scripts/wmitest.cmd | 3 + .../python-3.7.2/Scripts/wmitest.master.ini | 5 + WPy32-3720/python-3.7.2/Scripts/wmitest.py | 714 ++++++++ WPy32-3720/python-3.7.2/Scripts/wmiweb.py | 239 +++ WPy32-3720/python-3.7.2/readme.txt | 99 ++ 120 files changed, 2633 insertions(+), 1 deletion(-) create mode 100644 WPy32-3720/python-3.7.2/Lib/distutils/command/__pycache__/install_data.cpython-37.pyc create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/INSTALLER create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/METADATA create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/RECORD create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/WHEEL create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/top_level.txt create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/__pycache__/wmi.cpython-37.pyc create mode 100644 WPy32-3720/python-3.7.2/Lib/site-packages/wmi.py create mode 100644 WPy32-3720/python-3.7.2/Scripts/__pycache__/wmiweb.cpython-37.pyc create mode 100644 WPy32-3720/python-3.7.2/Scripts/wmitest.cmd create mode 100644 WPy32-3720/python-3.7.2/Scripts/wmitest.master.ini create mode 100644 WPy32-3720/python-3.7.2/Scripts/wmitest.py create mode 100644 WPy32-3720/python-3.7.2/Scripts/wmiweb.py create mode 100644 WPy32-3720/python-3.7.2/readme.txt diff --git a/README.md b/README.md index 281a64c8..3fbe1eb7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Open source RPA platform (Coming soon Q2 2019) for Windows. Dependencies -* Python 3 x32 [psutil,pywinauto] +* Python 3 x32 [psutil, pywinauto, wmi] * Python 3 x64 * pywinauto (Windows GUI automation) * Semantic UI CSS framework diff --git a/WPy32-3720/python-3.7.2/Lib/__pycache__/argparse.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/__pycache__/argparse.cpython-37.pyc index ee252f6329241583c8cf93d0ae8cc8ae71278be1..07872e1983bb8dde21cf4e8396fb847c571cd5be 100644 GIT binary patch delta 22 ccmezLnEBIVW^N~5UM>b8=quZ}k^A{a0AK(JYXATM delta 22 ccmezLnEBIVW^N~5UM>b8IOI{gk^A{a0AExHJpcdz diff --git a/WPy32-3720/python-3.7.2/Lib/__pycache__/imp.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/__pycache__/imp.cpython-37.pyc index 507463b0fd85d45cbb46efd8742a2a814e6ccee5..75e02a465ff7b90e5c5de55068788d0c5bc91d9d 100644 GIT binary patch delta 199 zcmZ4Cv&o0siIyh_28QLqarY{baGP|O5mFmM!gZT_G*kr8M`lX4(q=j1EO ew}Ipa6$!@X$tP6~aaREq6?uS&uF2C>CjkJ{{y)?J delta 208 zcmdnwv%-hliIW@us2oV# zf(U}-i>fwnQ7~l`>;MWIF)}a|GXWV497P?Qe<@C61X|If9LU%{`JVD^sdk`5ksyc= d0ujz2LKQ?bO}?yhh`SQR^Z*eZlNYE?0sxnmx}=i`pPzLnmx}=ij(OB>)BrN`1qA>A diff --git a/WPy32-3720/python-3.7.2/Lib/distutils/__pycache__/msvc9compiler.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/distutils/__pycache__/msvc9compiler.cpython-37.pyc index f37d2461e2a5795f8859f16c5c442d5b8f6db852..7b86949d99663a1487095352c376322edb19d33b 100644 GIT binary patch delta 36 qcmZqZU~K4Ml}rG|77RB4 delta 36 qcmZqZU~K4Mq$BN+tli$qS7D diff --git a/WPy32-3720/python-3.7.2/Lib/distutils/__pycache__/text_file.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/distutils/__pycache__/text_file.cpython-37.pyc index d293aebd7ca3c67dc465db6e1afea1af8ace91d6..3517367844a22c5bbbf45dd82aa086685c3571d3 100644 GIT binary patch delta 20 acmbQ{G|h?IiI(C diff --git a/WPy32-3720/python-3.7.2/Lib/distutils/command/__pycache__/bdist.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/distutils/command/__pycache__/bdist.cpython-37.pyc index f30023cfa8d3b337659746ca16312695528b220c..b8e74430a622c140a85879fff91e18d81258bbb8 100644 GIT binary patch delta 20 acmcaFb6D0u0Ec+Y)@C5*#BnU)H{bs^s8Y-FXxDn5Ez#}EtClGkA_)6=KeR&!i74H~hXWtw zk@|vBvdrJi5!dE9W0NwQ(~;q?fdbtnCK9;3Qn$8ITHh!Yc{36YFb7PEckM|Q9hKS+ z@sxa3YKkT9egB#El96lyzDD3_!f_nOfC&j(^P2X`(q&Sl)Mzep)q!Asb~zoUE(S3% zw*Y0W^U5e!7*VwD1lRM+h5Uz=#mBbAkB$hFd-!DyvuXNc^_yGp8WMKEtMC?qZeWwL zo%gm{61KwCjjB2In?50?2JC@y#ZZ^-H_;6L24Jz(2_C0gNVhSUcG3f_yKw9Q`#>+? r(rPAZ@Uqn3na@`YND*YgCSIn$=}zqnJlpgllVv+Jnz2|}`bQoBPYj2x delta 654 zcmYL`&rcIk5XU=hEsfhov{?g6a?FeY*#CMwuqFX)yKvl@beQS#aq!>^Fk zlh^qNG#W3)hhk%$S>WJ{%w~tG{?3ZOx#3#5-`fkur2~MU_lUA zY5?{S5CI`8H=tYmzU*l27Si6*zqqM%SB}AvBrD=?r@ow+gJ2Nuv>JmQ@@~c9{qj_H zS&n=m@38N^p-_MIJ`y!0+OiN)mw*-iUTIcv_d(y|xVsj2JL)(BAs6@F25aq z*TBHa2aK{WsbWMWc+q(~zZTtFjh2`0$ncV=U!2L1EaA03Mf3dAAM@5BwFN;oDR2dj zQQ!$TMt%flLs*G27n)Z$k8~eCGu}B^v7S6@r9Jebo&nhEVgG+;TdWOH%$v3Gfh{Pu vfgRvH5c8wDW2>In&ncDaWW~r+zF+nDS8XKs5SpiavfiK#o~irP6aDlb3-*Zv diff --git a/WPy32-3720/python-3.7.2/Lib/distutils/command/__pycache__/build_scripts.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/distutils/command/__pycache__/build_scripts.cpython-37.pyc index 6d3a621518cbc1d262ee4a4c887ed4a1e28c996d..b6d38ad1d52b06a40ec44c790eca33cd02da34c7 100644 GIT binary patch delta 20 acmcbucw3R%iIv6VO{ZgzHdc4lYxH*@-SeZ9)?ygvA& z`?$u~-!xe~Hkdnj^IIU2b(rK*#Js~XTCo^f9gCC9j_sk-afWWksMnx3o+r4x+3=_E>C3z9XaUjDYtX3ZkvsevPQsjQIr~La1b${!$ z-j+Y#ebw)$+Mh2)$)K9WVFA&w9VJp_3M46fGVS-HSmoPq5Chw3aZ|ZB^WPGt*4qn{ zfeLh*7N*`ylLMuTAPbAV9%(Ng3(Ot7`S&1-A%4~ol6NdAq$TZv)v={B;2p#*E3a6` zm7ZL~Sdmp(!|2JnT*tU38*&3?Va(hg>Qun92R>>sIL_=8XYLV zNO2=k?uT)qbP^WIr(GvUXj#TV=6lNU{9$vrJzJBA{SKSPmOq2HY?Hk+Ix^cAIUDiN%j^gg} zkZ``89U6cjDxxrs#wtiNI#~V*9Orcq#@+d^%EzCs?0k3EN>W{HE|Yp5%!D14g-p;r zwo$;8JZHyL<`!E*J5bZq7r>L}l7Oe%DhcxPVXlf`gfi<#iIR)MwzzJR5@l;fHo=)D zlvaZJ9Maqap`ZkQ<4Y?6y{*3theBC~BXHLg4)DN_IcG2a1t;#aU;ml%!kX~Hekrsp zoC$x)r$ElWtM5a<0u<4V_r(Q9`ylgXl4H>oQ!yoktsPY-f>xiMCks+sWUyivwf*|h z`ouow`RkHzkR{B;)J`_RZ|I|oIYuPWh zF6Uc*yS=E=vf87;UIBqmYh@wnHKZC{${jwXj#%PBHy|_BC@(K7LCISvAx$3&y+KPh zRgPIhSsa$Nr14E*#tk#-$VQ~OvB{WmqCDKiWIv6P8N@6ow%i$d2pGmf%^DsU3w3C0 zs?N7jW$97!B~)`FjMwq23Xf_;H25ZOSR~oRoaA-8VKunNn|$0{ff|e~(M7$3-m+Mz z0B}z%^9EER93PJ|{`X+KIzT~0Nj56-AFwm0PR987qZMZ-I%oSNXp_%{KT6+w{ME=7 zazqYyptf-M@jDI|O0Amlf*=WpDhNz92!^Q~#l+Wx;MpjQ=PNa-W;mj@SRds|FRI&Y z?51g~!ek-PAHcD`K;$x!FNkarIcWeTM_r(7E7VSMYD1o|Enx}aTCVUsui|~?S*1qH zGnF8aX)g%$B`BK4vTfq8gI1ands;~UDm1}ohQqRXo#Ebiw`KuBdomj{ z8#DH>(`hrY-|e{i}1Oou51jK6+5WJ)oCcI{nE~L3sE;JX_7dhplS;D#~BQZs!?jkzZrRMFa))3 zH&LO>T|v&ksQYd&S1Lj!d0yKw7{}VQOI#%x1asQjJO;8%orPx4Vsl0+BF2?*Dp7^G z+C}OT)OuX-$FmgXrFL|oMyN8a?OJyEKMqFqcl*8(BEY=^YMCDs@)?YLDofG0l9bu2 zxxGO$1|wdN2lovth7C(Xjb-0vNMG^3H#Z0@OCUzRqKZ_G$@4-%`Yzn7BPMI&#B4mC zloBX@#TRh$2h2@(=@z{9wZR>)Rp0XcBzybO5e_Q7hT!wb+dBnYLJt{+j`}yAthd4> z!IR51WVclKW7=ESr0a#yBZY>S%<3u zPv;YsVC1ppOBx#+?t)vjU?D%K4_ADE@Qy}7BsIOjhmMBfd*ER48tzXa))6=Ll3z)^=T0C9I@RasikglN64^66_qug&wMjx1rRw5 zhMmfZ)SN78RF?TU!uETh7o%WYQe~097}gn)QJF`3kAwlLXjq}UAk zt(#V?f}qm{zgpk6U0{D`E216Ijp#viA_f@@hpI`M5=qF~WGYJe*JA{J9NF(3!jzMU bVFVwK0bKE0q3!QKDj6qz delta 1279 zcmaKsOH5Ni6o#1=%A+k{c(ll)Rcp#EMJV!6!5V0ICp>&X+*~g01#W0*nR_u1gG3_> z)P;IL+>mHwX(pK!7g4If|Bc&j-q>xQ3 zu@;5TmDMF8hR!{dVRR7+s=l1&y7{OZku*u1P*632^)Q2BRy9hk_%$WZ4Yop+%SAK@ zx}4+^jJVdixKaTs$@AKt!5FShy2L2XAefTY7BG=!>M}IAm;RFqi&15qN>pL44v@OG zkJJeKb}x5uS5|bThN+U!4wPBkM`l!id*mA-K3G4dmiVzDhr!69vJ{CbGcvnHmnT3( z81}f`ST`~;ZJ1-~Wcuj__4}T8Cclq$3B<@zRFTS)^1P6nJRA3Fo0K(iVlEn;kzy!* z-CJ+x7ivjP?Jm6XwvZux$NQ5U?n6KLaOo`sf3JMl)9_2^B*W0=d+koUIczdA;|Y0& zF5{vVaMt)ppB}2YNvtWE4cPWO>bY1EZ(|V5Ne_IV+n7zezJA?NtC-0q+^Bb-eaae) zY&LpHV~>ct;8xAJkZ;t35r0m2LL)aEPb}~!NJH?w{&?X!)~6Ahh&y^wAj{m#vyGT& zLXj%25s!(qt^E+&n=ghe;XCV=l@B3KkWB zh)R$&b5SmcEe0YAC(Ell3KW5u#UP>tM3hc0P*-9s+dNr)9Xn&oWGDR;OcmSo-5Ewh+qa0^^=PXssUbSD475N delta 178 zcmaEx_%@N-iITMR@LO_o=86etEUOF%>^h$x#}psvJNzIn3xI(Ej^$xiwym@2mEyEB$e e{-+-*4>ni}q%Rvp_<{&V5Wx&08YUMRR09B-d?^J0 diff --git a/WPy32-3720/python-3.7.2/Lib/encodings/__pycache__/ascii.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/encodings/__pycache__/ascii.cpython-37.pyc index f47cfea6bb94ca1b9255fe1f4f0bc1af08a64d12..75a857aa82e2b02b56f823d57701c3e1a947ea3f 100644 GIT binary patch delta 20 acmey$_mz*^iI^u?1TI delta 20 acmey$_mz*^iI^HU%^Q diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/__init__.cpython-37.pyc index 7e977f291e6c9fdef36a0384400d67b08fa74837..c89a120bbb2d60b64faa77ee89600ef466d12f55 100644 GIT binary patch delta 19 ZcmZ3%xPp<}iI( diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/btm_matcher.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/btm_matcher.cpython-37.pyc index 7dac7688ce22bcb5713c0c8c7f88a84aca432947..ee2f30e97e93edfb239fda1f05580fbab89df519 100644 GIT binary patch delta 20 acmdm{woQ%OiIh)Ru>^Pk diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/fixer_util.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/fixer_util.cpython-37.pyc index 771d73fcfa2088fa444b8646f0c7dc0b2901aacf..c6ea6ee8bab3a3f130457b5739c9abc9084a4d6b 100644 GIT binary patch delta 2634 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 I$s0sN0Ky0z>;M1& delta 129 zcmZqCY0=?!;^pOH0D?;%wHvwD@G?ei-oZPKnJo$^R202AL~uDHcM6D|2qJPOvk7N2 zrc5ppR+CHy3hV^pVz72b9!54sE=Deb8m{7KHBlpfk08*L<4*&oF delta 22 ccmX?dnDNMAMs6owUM>b8xa3j0k$Yz%08&r}?*IS* diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/refactor.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/__pycache__/refactor.cpython-37.pyc index 7ababb269fbb7b03cc8c1390ec664b1d0237bb65..ee29ffb58948f1d74a2c3c675b101c415be7dc52 100644 GIT binary patch delta 22 ccmX>*pYiN`Ms6owUM>b8m{7KHBljVH08Wnv&;S4c delta 22 ccmX>*pYiN`Ms6owUM>b8xa3j0k^7K808T{)umAu6 diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/__init__.cpython-37.pyc index e5b9d6d787bc5f5386eb9655939cb882a5b1c7da..63f63841da67ac7f3b44f13dfee00c7467f9edd1 100644 GIT binary patch delta 19 ZcmX@Zc!rVNiIGu diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/grammar.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/grammar.cpython-37.pyc index 93363da8ef4925286e48c6bae9328cf18e80d471..a98e3042268b8b2768d09975594fb896b478b0b0 100644 GIT binary patch delta 20 acmZoPZ#3t2;^pOH0D=i+8#i*7Ndo{ca0KQ6 delta 20 ZcmZoPZ#3t2;^pOH0D?;%wHvw1qyaA`1jYaW diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/literals.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/literals.cpython-37.pyc index d14941c9bd9bf147617c74d4874adc56044f4c0a..e07aff48b7637fe81ddb02e5ccdb3e612c7df88d 100644 GIT binary patch delta 20 acmZ3_vz~|BiIQ diff --git a/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/pgen.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/lib2to3/pgen2/__pycache__/pgen.cpython-37.pyc index 46448cfa325c23e1dc6a87a55cc399eac7cd50c8..918a82d575e718588ae80543635473b486167b73 100644 GIT binary patch delta 20 acmX@>bJmC3iIbJmC3iIiIiI 5th June 2003 +Licensed under the (GPL-compatible) MIT License: +http://www.opensource.org/licenses/mit-license.php + + +How do I install it? +==================== + +When all's said and done, it's just a module. But for those +who like setup programs:: + + python setup.py install + +It's also pip/easy_install-able + + +How do I use it? +================ + +There's a tutorial here: http://timgolden.me.uk/python/wmi/tutorial.html, +and some examples at: http://timgolden.me.uk/python/wmi/cookbook.html +but as a quick taster, try this, to show all stopped services:: + + import wmi + + c = wmi.WMI () + for s in c.Win32_Service (): + if s.State == 'Stopped': + print s.Caption, s.State + + +Prerequisites +============= + +If you're running a recent Python (2.1+) on a recent Windows (2k, 2k3, XP) +and you have Mark Hammond's win32 extensions installed, you're probably +up-and-running already. Otherwise... + +Windows +------- +If you're running Win9x / NT4 you'll need to get WMI support +from Microsoft. Microsoft URLs change quite often, so I suggest you +do this: http://www.google.com/search?q=wmi+downloads + +Python +------ +http://www.python.org/ (just in case you didn't know) + +pywin32 (was win32all) +---------------------- +http://starship.python.net/crew/mhammond/win32/Downloads.html +Specifically, builds 154/155 fixed a problem which affected the WMI +moniker construction. You can still work without this fix, but some +more complex monikers will fail. + +makepy +------ +(NB my own experience over several systems is that this +step isn't necessary. However, if you have problems...) +You may have to compile makepy support for some typelibs. The following +are reported to be significant: + +Microsoft WMI Scripting Library +WMI ADSI Extension Type Library +WMICntl Type Library + +If you've not done this before, start the PythonWin environment, select +Tools > Com Makepy utility from the menu, select the library by name, and +click [OK]. + + + + diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/RECORD b/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/RECORD new file mode 100644 index 00000000..f099f061 --- /dev/null +++ b/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/RECORD @@ -0,0 +1,13 @@ +../../Scripts/__pycache__/wmiweb.cpython-37.pyc,, +../../Scripts/wmitest.cmd,sha256=JjlDZRwCycRD9qE1dEmL52eg3Z6B5bLOuVFSXNrCQzw,151 +../../Scripts/wmitest.master.ini,sha256=Ht1WvKoyp7pGeIjGVfO1u7Ss5JpIJ_Tin-qSsfERxDM,90 +../../Scripts/wmitest.py,sha256=Adt3ANu0VSoungX-jMuX8nU7ZEmsFTEKDHKt3C2uP-U,26526 +../../Scripts/wmiweb.py,sha256=G-g9dj9GulQwM9-zFFA-WSQZpuos0NtyEWdXBkVA0qQ,7457 +../../readme.txt,sha256=O86UyAwpG_AA9IeUGmL0WOvcK_VDvMMNiO2v0thezs4,2797 +WMI-1.4.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +WMI-1.4.9.dist-info/METADATA,sha256=HfBdxA2ePyrAFDYN7BC2vGQdgwn4vjQJVTCqNCLzjL0,2974 +WMI-1.4.9.dist-info/RECORD,, +WMI-1.4.9.dist-info/WHEEL,sha256=JtBte-IW7C3UcYx3ZpZORq-KtnjVj4xdM4AJCTZPivc,98 +WMI-1.4.9.dist-info/top_level.txt,sha256=3hWjpK7PXPlg0o1uW_JRIChr8XaoGcUjw09WzSsqCh8,4 +__pycache__/wmi.cpython-37.pyc,, +wmi.py,sha256=P48WjfanOsY88nF9RmEbn2RWyHWsj6Ct57MWgM5fQUI,48360 diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/WHEEL b/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/WHEEL new file mode 100644 index 00000000..03075056 --- /dev/null +++ b/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: cp37-none-any + diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/top_level.txt b/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/top_level.txt new file mode 100644 index 00000000..2dbb9cd9 --- /dev/null +++ b/WPy32-3720/python-3.7.2/Lib/site-packages/WMI-1.4.9.dist-info/top_level.txt @@ -0,0 +1 @@ +wmi diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/__pycache__/pythoncom.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/__pycache__/pythoncom.cpython-37.pyc index f512d5a511389f31b9df21f8c5b9054a99feed5f..06deb98365d2fddadd7e464aa2e2d2d97afd1981 100644 GIT binary patch delta 51 zcmZ3?)Xl`}#LLUY00dLYHpcW$ND|t F2mpDW5efhR delta 75 zcmeBXTFk`j#LLUY00eb@(_*?N@=h=+aJGsGElw>ej`4GeaY-%CF3B&5@h?ct3kq;l dD9$e}N={WUGBC7MFfdjyGFB)kN}aep1OP&q7e)X8 diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/__pycache__/wmi.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/__pycache__/wmi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..065931bbe91e598e5a1dd21537f0b8791da21feb GIT binary patch literal 46979 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 literal 0 HcmV?d00001 diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc index a18971faf441bbc8c57db58614209427506e9835..9acec30f2e10ff4e093908d11a47d5040ecdc745 100644 GIT binary patch delta 11692 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 delta 12076 zcmaJ{d0tKzX9h=M2TTOf!l;Huz);tDK$^{ba5A%leZK9=l$>iyhRvQC@~P155oJC#dsOhcKuyqF9*Vq@(l3uJ zedvOY3=?~8i?^J0b!CMPOYiPAgZ>iff8irUZvAoZUbIpFr+53@zc67nnn7WVszG}U zKrX<`x?h*{$ml-CL9a)4_g(I!to|&3@>rGKE?NEdc~#xYHoJZ zYc5+!p9#xLiq>(9Wz_#FdZ?+jw)l$F&oOT&z!v~tMottLIJ#`&ww2&5FZcKYVYRr> zsqVt)SLlwFExw)!s)UAMu3)O&+$xMy|KNY_c;%b#3Dx<^ z)VClK!=E85w%i{Iht%Deu?ND@H<5v3ZgcdufRh;Vh0A>v-UT&bo8F7Sa|0Y?5EY6i zPROC%+BxnIuD@e&bL5ZX7CNHsjuXg{w^i^hN1wh;%<%0{qkz6u51lkG4H&A!S>1o0 z^u6nCbibn?pWH3!T{PbVuq}IVvX_#e5d~@0-y<`o4tILDaC=f=f|cM8u*-!#!GNu` z_?lpuH|*z6!Tugo2FN@BtjtREu)=-io`CN<)|x2X)(i$+Ha)dP|1_gB9gMV_nI1P| zGv+o^xfY)ykw@s2`a)q(tv6g&r7AEa`tzan0KiW`a`_g8l{X~+eSvayP%oN2IP*7* zJBY^<>Qu1I7Yg~xE&aFIedt?#boO{U5V>qleEgu}pb!%Zs<3M2y$W+(0I-tP)*JG$ zu^0H2uNIzjKri(TqB#A$Z&;d(Ik*!;Ro?R8bso01ii!Nkx5klu0JHs35*%!zjM&Jg zstd@q3;i$Zz5d60pc!=oQB_+eC|0yVN1z_l&&~^FHXG_9bc&0x z1(*Ub9^fbdG^Av;DUf^|K2y;;roXINNhcz{+9xUZ5W3U2yO7j9Xm^HARZQf;CB3L;M@XDh#SXHNvom5tFq>mT95zw^u(SvLQ_{o1NY7>3>52ov-@w8_ z6tU|4j!fxlC3!b})$g8i3C(}&xEu57==z>FQcqF3`0EFd$rjs+4Th_H%8FxupXVzJ ztGgv_dVl{$Cn$wA55JD8wmT$ua-b@gF1~60KzM+{a#Sur4nQXW;YDb50}!M4M5|CN z5jlBNf|DAx>$WBIrCxDc*QU(8`L;E#3xQ^*?AqHON<*TK>aWF6?>p9~A$^}?=$AWI zr6H-GW9W&M>s!)aTO1RqTy?RNKGlz`?o0h6J66BwOzi^!=3r$T0XAuUZy(pi+-c?N zE%)a-RIkXl_g?Hwl2OT@uj(H6PwWi0uwrV1(#WPeUX6{=JUW=2=DHQ><@% zs0WRSJpIt!G1*#cmT^{w6L;7vJmz27AQHtOH6?{YrGQkO8Wl0#w6 zvt>zc2s`6}l$rt}F=`s7Bj^9Yy#eM6Zkmdf3cS8XYi;M z<6Fd~47b>a=T3DmzZKv%)9YUPo;FFIyhg8UxILwo z=R_4~_s`W6Hm^KKzgPdZc~#W8R=(WPPD3;+^2*DP$42|BwhSsMVUlVTWJw$4t5Yl- zYMNPI74Qct*$*Z5AKOxB7o^@e-_Z>>))0f~`d1%a)2Agf?7Y@4cSUli3igEi%<4(P4a zvXuKWxM~VzFqt+^7sXH_>BDao#mUN-+VV~K+pg@ho#$-(UZbbKJ*5Rk3e!3pW3Jx* z_LMBpu;OaC`Y!jYvk|=d@^^gyUvi+G`pb8M?N_kCJQKdFD$s69LYws5cRO-|UiR+0 z8B+NtQ2)6bvcn~AD>6<#rqI}R-9LrRr$G6vsI>-d~!Z3ef=k|<)6`^9ntrJ{HqY`4`}%# z%RhC{FlkHg4d`v2ShxFY(ve0r!A8-H$T$$Dh?Ctpci~gZs>ie$+vi ze!e>e<}8f2W3X0F*x8TP=o@zS&apQ<(0zz8_<-ZBMZzMs{@1MBh^YkLXk@H|Y{ICHU9q!B)>ShVGJK1!sr31p6eDP{F&4tytl0GmO%4CqwOJ!9bXgY9Wg% z+`3^`C)%KQ?s}_WJ+LI*I?>v}3yKE44B4Cg+Q|0Z$<+4|pomqQEiD;RYWmZd8*5AC zWPNjSnb_Ecp3%Jat2YD8BKZTn&j30*n3sB(3c$>?i$6ni>pU<<=1msU?Az7jqyi)`0Em{XaxbL z9tMz561r>f`5?rSWy-cDdy)8-c-{t}tOXFsC7U(xUXNnnj}pO=r}uqBDaZp+5$vtL zQE&K%uf zFS7Hxc&jj3s*8W@#`AqYjO=cjDf7G`U?^y`PSBCCIzPQ9TC z^$Z(jNn#&da`l#-rJVw6t`7p`q3iryOw_{%KGdm4@{*Qeh8@~^$dLiAJbcgA^N(cq z1ab8yz*_*K<+#v-Qh(T2YoQ@~$3OLRM+*4HaL18;4C!dU)T24{L1f<1 z6epi<79ATKzs+`=L;Brgp=g;`{Apa6T-XhG+E zg7a4RJWa)k`W$FG!8uX2ToCturH3Ccpgnrd@vbhLkG}c%WwcAbeSB-G=r0qKvGuCA z^&=+=XqkTfM338ZoB z^q7FJjS=k!T(I{v=>Zqvtl`?T;1PF@^}Kl0H@}l$D{U1%(ic26c_Ihp+rWD zkBgyr2UmO!)u`K^I%XSUxlTNNwM%?@y7r&$L|^G!PZuzJ`t+K~%^I5tW+?NN?4!%^ zDN4N_eb?jDi`M&SE#Ved4j{_s4HT&GrKYRb-S<63`HtOW_LNf2ef#J}oB2zon&?tG zY@QPYw9f_=(L{fVi>YWttj6Z5Ke52tm7p)^IG5z9c=t$fxS+U{8b-s|5I5Akh zpvE_YKh!bCw%X!mk#{`BTbd^jQgZb8fM=*D0YFi`Xr7Iy0bRv0#K~j_eF|jbs=R@6 zE}GOfAa25~kjYG-5(haN+zHf=^1rZU5+zVwYX{nHo=&9qXiq~ZiTY3{Q6TC~t`mX_ z_&yY~#qUKOTau|$)@C7SCD(b&s<~*9%2~ykqsjDWN(*MnVdhs*di{1re-b)#u)HoV z7F?7%SqdvvN!;RE)OVd-9>9j2T4g*ANG<@e z(kUi&Cpe}ujv3gN+R>?oF>UDzO8OaGia~CZS#uucmk8Si^oq{qa!+ai0=s18tMTzM z%EQ;=)x3?I2BHZ5GFrGkQE!@4=h2CwZNdIL0O28bo}i&_15!I~u?EG0n93J}?;ze9$=9nPWs0Y4apiUX090O9#o;sFq>iMF zhS$=mf`&B{i1U_)FbfzwueFn9^XgAUU7$_8$~M<#lDCVX{+ZQdxs)%2cN7Us0bf>O#dWfxF}>5)YvQzU=B%>#&OTq?A~4%IH9$7vwJvpSn5&}p+fn>uw9rNi;18dhTcR>Gb%`8kwL zC(Ym-`Z)W2ro~T0bv6DlZb?GwM@)XTA-_G1chFWduOsDmai9+`0~`}~@jsh*7kEuK z0KOf6qduD&&08Jm1-X$@&4XBkJc6KXGP}D{PQz2V^f2YlXR7S0XUZRSJ21xq95AJw z=t5f6a91ZvBI;ru%BS2U;UzJ!&%BvWg>=CDkWa6Tfp~=p!oz--ssxRn0Im{h0LK9& zbspqawA8}WiIPk2?;3vUOp6^^AZEpQ!(pX{V~S{RtEulwMcr@^x11qWX0sWKaTH`o z+98{NHzbn`bF3@f*dAqp6^qxpkbMm+g7Tr)+|!M^Q(v>W8yy+KuL@1Kv;ok=B++lv zlb^hqZ&@7 zRw92c2uKIp`xkVX?u9gxiW)fT@~Eu@1W?(r50UvejZ?tm7tq9M-I+X+E>{U{)W0Ca z*HCQ&(+d0L$*&qCSTAD@f-uDl+$l}39$f0ce-B}%Bs`B9-HV3N$cE*;sN7K>g8`7R z;?F#kbU@z-kcFh`dwi|{N`i+UFc$jx!iCSo;_`wZ`@9g!1%C5%nb|7PpzCiDu&LZ= zW6Ju_yO(X{mgQuL-LZ9x`JX&}bHY6bO=f&1aj6}UEYDP3L__<)%C@}MqgQ0=iN13X zQJB>Q3*#(Dd9A!pxD!w^$TPC~4&&m(>89!uDxg{B_Dg76 zubH5AX0kl(MiZGEL+~#9vEw_rzrL#B-b;A_N4mRx*fEKyp$bqEwClg;p^}XaYxdU^XZYzbcL|&^2GtCP{^c`(6Yl^9B-%a58Gr(;C;%>60 zKjCv00}ci8FTvbm4j0qUBPK#oE;S!Gtz7&9$T$M?n*8!yyZRE-Z6qzCU(CZJ=@W`E zbtUvcS7?`+AraX|eF80h+C4+6H!^0r-m=7H7LB4vCT2|Hq$Rnl>2i~CxOC*Ie#U6J zq_bH56r*v{U%+*<92u-QkB4uE`Oq@TY#L3ue zkdwacSmx^)bYBOYcHB;mx7Lxi-K?HT!yH#jK65z89GFQ{>#qcRar%WIhaJY=rNxbq z-R=7@q-u2qJ|_T71egRc8DI*)Q~*i+;!iX1DJfKvgPO2#4H>g2)|omIUt%9w zZHXy#^Eu&iGsR649G6S^kygVv^OBlsXs(279Jp$4Xms;#HAI|wJNSSA|In(|>#wm~ zc9G(CO_5^79WUQ}R~$_pubKt3=>r#LTbX9WT*@@F=WwBXbwhX#Eu+qOL}uJ{NStA} z(Ir16;k59bN%hc;_46Tp9Rqm?@px-$?8NJ5d8~vA6HkW4i5XGG-=G-x(r;eU# zI|d|EVqqnkq+0XrTx!q%-kD452TMsFr@DZ2F~HjZ?*Jeyn`?DWCqvL7UR`L`dO1B+ zn3uhj7lRNn>t<0ulT=E@^j9;Xl$N(!$h~j1u-L+e-KBgVQiK{$1wiUi0GyQUZ5S1x zl`=gXtQ*H+Yyak}luT+^9(z;+8yq67xkWzE)#Jt_yR6)b*uf+sR zwj(ADtyrGoPHXzjz_b>>tb(L!Jy4J)-AM}qa*-x4l=IM?2WFCR5k6J|3VeTspY#1d zOzjFF2aP&l^R}ARMupJ{*TF?dsH&v4j*qA_D``OP^e8np=_*W+9aQYvX#P}5Hxw-8 zxlt$W4(wKY>=aW{MOQhxlUZ>opFJa0bZ_<&o@2%11;Wd}c#F>FpA+$q1Aj1l$#tb; znWUCjWQllFJ&!sV$2@wCi@i7Iu`#z9YaR_Mlnm3HFMfc4l2;`7B};5WU$q%hO)t?r zbGVwVT5o#S@R7D2Lhvg#6cn~x{4iLnf=bfk&F1SG%B17w*BaVj|A=H0=*%>mYAMsc zGMj0()$-o-ESCHnKwDtQCEZ}NCqTLR_7n`sHrYxqgH8J&C-A`yLxX(JGywZ{3;z;- z#;(JzoX>)Ce6f`L3XdNT$is~~WH!#H8)&2HqiFm^8=22^zP^;p#x~?42VXWOI~DrX zFAVq>ukrkl@2d=|#e5a^grbX+Uc#UqDN;_D6N);}ohBvn+m0Ho|LLhAzYox1AE1z~@U zlK370(kB5T4BW|**ZbIMT?H6leTSKMpd~f^NBCTh&xPFTr9$}T-|Mj_p>rR%ET^AC z@n-(C5+?D}?r6mxst%gFmr!XJ@jSLTOUMZBxL}C6am^tv2xqiR=2ET=ZZa1yr7m={ zxq2yGl=Ka_><2ht^irCe^g7x{0e&{8mQoE3G1becCtYClGP*GHFJN#ffSkN9L+dT` z*)qZtIcQN__ zz~=zF0Coa20(=Fq8{jYiZjr5|arL!z<7(^hSfT7&-y;~j1?1%75Z9PeyxUcMI;712 zkopRDYIcDuH(a>IQYQf<=@)?tZa}QKD@RWoIeGeMD{v>J=a^-`G1 z0aa=PFXo^EP_+PK0HiLHke2lA2MRL0o%NB3>}%>U1_omwh!$ekYRhlAyteD?U*Ck( goxtvb;k(dU4QH|9ntq(4Zs+%}?1o=&pajSN0e|sRlK=n! diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc index 30b9f784519436dd8f8bf5acc93801856f5c12a5..2510fe7940148172905fd07517c6de2a87959925 100644 GIT binary patch delta 62 zcmaFQ@{@(viIV)(6i-Zz2LK%i B4n+U} diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc index 9478ee86755feb9f49cfedb9a574611e7bd07ccb..7a78b37112f94da8fdadb6f3fd2138f64c087fff 100644 GIT binary patch delta 191 zcmX@KknzkyMm{HAUM>b8m|V6o=5EqPzJ)wWInGuwj!DHaiABj7nPsUl#mV^vsli3b zp*}JG1*v&K0gjuG^EBErMosqgvICMGUMm^HHXC^xF*1fvPW4gaj^gljjEE0#4DpDX zJk2K%sN{u@mQ)nbmZESF!2u+qIFd@!;)^q@Qj0<->-bi1L<0pi8H<89ukmGNVhaPQ ii=MpQUx_hz@-2T0jwqIbqWpp)*UA4}#3vgDOauTQ)jVMU delta 170 zcmX@Jknzw$Mm{HAUM>b8Q1GmcsZH3(w~$97$=NCIL0wKwJ63VzdSD|KQX0v z^F^LUTgF?HgT3s48!i3TiSIg>2sD%gV$S0aBMR`JlfNW60zu M{uV$pWCPX%0Eb03!~g&Q diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc index 67a11c4662cdf07045faabe4a5feb4a0c81a777b..8d6537447958770e6b2db0b1c4a7298018e78d01 100644 GIT binary patch delta 24174 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 delta 23999 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 delta 1820 zcmZWqU2Icz6yIs@O83#xu3I+{*w`2C#$dRG;n-KVwQOKvK-t|#S-Es~TSM2@|Ls_2 zfCLkLB1S#&L84}2!X7jvcuj=FEDF&#W8$0FXrdtsK@b@6MF^gA$4A9J{Br)k^Lfwz zoPWPtf~!kV)Z=jE=g_Zm;AG^T*^5QzR+o?WwnYwUs?Z|-m?|QDskvk#rA%o053B8^ zVCX;96atLu*K3bhz`z0Tp0&oR@UeI@qY9%avm!(%;z}YlW#|{YvgBH%1l^F6qghC> zTg0O7Y5W;nOLUsfqL*}Os~22Xh(3`;U(q|7x~;BjL|@3Fujy|#_kimL(O0wR8~U#; zw*VIK`|T%6|0Jcj#c-S9FNOs?(z+gQ;wcl~Z+#E$;r1Pu;XK~i5rX^J`O;l@giUR) z!ZLo+_Ac1azf%P}F7BLye3I9ox7}&~heG*4tU@K|CS|z&ZE)c4?c0hAs1{L3;IjxP z=gTuq^0A}iI7s+;M-4p0A3K@|6=%7th%6hZEl*lggw35FK?z>&YA$t>&afR<60@pC z(TX{;8~wd*Z0afl58ITOHo5VPI`f>#xh@ZsXPG48TIM+ucelsAmV>$&N*T%sFy!Ct zC?VllPWs4PW(E<0Zd~ZDc6k1$XXfBjefjfxDyGZd=HPt)i3@A>v;KL2N@{I`MO4uD zZG?>&>wOCfZy+nCzFKUH`U!3ZPTpvfFRz z<@ptL1cqHr#!?gU(oT95@fcf3{WoV6KGm9LD2Cg4}3r#{82lmE$xFjQY zGBK-72YoifI;Cbr31`~N4k6asqG>^!DGt%WCy8en``P4>IhtX#?>h_A`0>6IJ%^bd zV~8+}GnkpJS*&Sfe$p`MORY4$5~a6VjLH4U z;-gPvTEr2S6}-K_CJ-ahSWR=BP6)ANBp;{) z6;B;_5M1W$1<~l7svHyQWHjot3zL&#sr0-UV&4I>5q&IivqT}goExbxxXC8>81Cbz zBSTvsviOL=$lI&TJTBSBRoEH$Q4hxueVV+qh_X46EP)` zP=$Db`E?BI87dhz;{DN%65d^76-_NaU!su}P7I7y4Q^p^8^epHNm>yZ`acnexj--T zRSdk*qL#s2M47eid~9XtWC%0J_{CVglV??^3^NQG-W{v3nPZSaPo%*%$n0i)SHx!h E7x1FS^Z)<= diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc index feca55e241982fdac59b58ab79422b8a17db9e70..c38979aeb8fcd6e394d9115397d07945514058a7 100644 GIT binary patch delta 61 zcmcb_dWV(QiI7iI6i)yE delta 53 zcmdnwy26#uiIV)(6mKqJ HwUY$^d*Khy diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc index 3ca738dc7fcfbd8c7af1c0ff2a285831bd8196be..0b5c9138051e9fc156d4735a3eb6f8b1401a8736 100644 GIT binary patch delta 126 zcmZ1~w_c9diIRPAgP3QCj=hYGMw2&iX)sz$zR5L%*9d4(kpqy>WGu3nT*n>CZ37Z< X0uj!W7xIZu{>puf(PZ-;o=heHjHo4^ delta 116 zcmZ24w^WYTiIU;6gpeQgche36~{OxrxwMybwySOwMEhj(bn!#%f)L!HWBs3X|EGKW^6PY}R+mYKAB%i}A)RMm{HAUM>b8m|V6oroLb!pA(Z(rL$FxV^VQUVo`ENW?5=XadLh^YH(3< Ts85W4L26!5faB&2re|INws97I delta 55 zcmcaHi}BnnMm{HAUM>b8Q1Gmcsm$HT=fotD?`#zlTAW%`9OIarS`_1wU!IqfpO{j- JxrphR7XZe!5+eWr diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc index 2c5ea4ed56f9eddc5ec94be8e75ece9f266b8f68..eaa2152ea86843d5c488047d310670a5f39c6877 100644 GIT binary patch delta 82 zcmdlRbUcX9iI#VS*gs~D#kIXI3}?uIU}ev^R*)iIV)(6mPa> lp0B`oYx8a8Iu^!)$x#|z+_^xVMUfyPYVtuP@yTqOjsQn18Mgoc diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc index 3ab8c21021fb419479dc0a449832f01973bc91b8..833bcc3a13a4b9a8417d77d6ba40bb241c4a8cd6 100644 GIT binary patch delta 413 zcmaDV^j?V1iI ze&sk@#W*Gv$0QadXJnS8#uO*#7o-LkC5QUN_!p$+1qC>6mSAFI6bEV3WGv!_X@nTT zv)Pncj8TLSDC(!lc8jwhv8W`oBr`v+h;4E_ixdaQMoqRN?#YcTMvOe0x3E|<@`4m= zGQ9*lL3;8Z)_L55AVa|}6qvk}&07&{i6}@=97ITf2uUDui>;t2H7&E^)?`6;aYmlW zn(Pl5WhZlUND81kYqAMPjxjGt3r9f_&_hKfl|=#|W28WY8i>#Y5%6$;dS~)w4t;l^ xH!6W1DbCDGzr|b(w2nQopdcl)s92M=NEW1v2}s;x%}dNpEiTf+ZI&me3;-FiTKWJ0 delta 464 zcmZ{hze~eF6vw?Lo=IvVRBV+lqM*b@v>^C{ids++++0dPPJ7Zon;b7EZ3lP3@pkCU%qZzT^-! z)g3ulF?A9s!a^8Be4OoV1SbiHB-lCU5H#Xm)QMRuN#_cbR8Z^_u!r)mLMPoe%4BU^ zM~{7)*@A%#Wf(_*HkrYqL1uKB$ecv#RMHD&J2&?!*y_eyB~JQiZW0$?@C$EwH#3UT z+u{T|<;{BPo*u2|&XX9NLX;5|jf@K57hyl2l0{Pc#jW45z)`iam!&Ey?Jk$>R501j zC=-H5tv@DGb*ob=qTCV?3l4Gs9-2)f<`D~spT&J|LOol{q^VrHx{qd1(8xw3*5wH- Z{#%72YfE>0+2M7fZwY>lWq1vfd;)c{WTgNA diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc index 09994fd4980a704ba732aba5d275c542b7989630..0d41e78344cb0240cb7af7f3c53d86934d9c83f9 100644 GIT binary patch delta 23 dcmbPeGtq|6iIjmx}=irj~7ti45AvC*TSIR)7Yc delta 25 fcmbQ&#W=5vkjmx}=i6g+EVPWo@;6L19pQA!3i diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/depends.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/depends.cpython-37.pyc index 8326354f1c8c2430bff7ae94abf8c562086abbe1..8dd1d09656b374132c72c47a4802a9fdc47e8479 100644 GIT binary patch delta 23 dcmbQNIa!m>iIiIb8m|C_mhV|q|zNb8Q1GmcVK}mp@9Gi&Xs-wl diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/extension.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/extension.cpython-37.pyc index 645ab8c1d34c0d4cb7237412a7ba8980429fed32..29f5b85566c50422b0dea8e986cbe6dbc1b848bb 100644 GIT binary patch delta 22 ccmdnRzl)#OiI*~mAW4*)}~1|I+b delta 23 dcmZ1}yHb|ViI{w>7k#LLUY00d5{wJ~?uH}bt_bc%MiiU}=FEh>)5NX<#jOO0_XC~!$ENsRHy zPfpB<2}#W@h$+Y{(9O&%E=kPE(akSPFRV04O^zu}Eh#N1$_eDYlmD@OUr5}XE%GLtzn5El5}!N(kz5!n delta 106 zcmbO)Ghc?+iI1+}1#4 vMK&P9cCt6GlCV9HnFhqgEI@*Tk%PI&esTkE9Jd)r2}lgc-^(pNiBBE?YR4D# diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc index be9b6bd9814f7416ba2ab273fea4af81544d1c7f..d77f8cf21b47abb2809b11d8061f5d760c1d2a17 100644 GIT binary patch delta 25 fcmX@|pYh0lMm{HAUM>b8m|C_mhH3FezHRjYa~ue+ delta 25 fcmX@|pYh0lMm{HAUM>b8Q1YyenKW-B-?n-HZm+5C)8oQu`q7L&2z JW+q8xW&o$74eS5_ delta 58 zcmZ2#vDAXkiIMUtB*ar&{c`GDBIo1gKCbFmuUVlp<^ J%p|GI3;=kW4A=kw diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc index e12f406dbef2c5fc9dbb629c8c53e51f1d2be350..96bde842991dccd1467b96ca3d319a5748f990fc 100644 GIT binary patch delta 22 ccmZ3-wvLV0iIU!Q=)qTZ{%BQ0{~AJ2CM)8 diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc index 6f0c5cfdde773cbb565189dd41b9f4a9e6b11562..6c06f0128f065c22b5f4be5c8116214aa9525370 100644 GIT binary patch delta 23 dcmeA+?Kb6e;^pOH0D`Gy8)FQWHuBX<0RTXB1-1YH delta 23 ccmeA+?Kb6e;^pOH00Je?+8ABMjeNCI063%s-2eap diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc index a11d0c54d2d7cc958e6818b66b35c77dda7ee945..db8aba63219e4f466a672f13470c8b6209a4429e 100644 GIT binary patch delta 23 dcmcc3eVd!liI`xc~qF delta 22 ccmX@jbef6RiI-v9sr diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc index 2a4bc3d66356151d8211df9c06212e4c8154148c..72ee42f4407f3ef1b55f395e7ff5e5fda9e78f30 100644 GIT binary patch delta 23 dcmX?McEXI$iIq delta 23 dcmX?McEXI$iIo ib1f>$FVbYW#Zr)1l5uOYFLM&3=;RH|qCoN(vjG510UEjh delta 83 zcmeyy{*9g2iIkQi diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc index 44c53da10d22255a6768336174d50feea30de728..59fe7e24e25816ea15d172bba9f4df408ab8dd6c 100644 GIT binary patch delta 19 ZcmX@ec#x6XiIb8m|C_m=3B)^KAU&|Y?cUT delta 25 fcmX@LkMYz#Mm{HAUM>b8Q1YyenN+%w&n6xKVtfZI diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc index b6c56da92d69cacdf824447894fb7eee9cbcc4ba..9274a2f037373efd0bdbc73b899ea8e937aa01ff 100644 GIT binary patch delta 22 ccmcb~dXtsciIw05W<682|tP diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc index 292184d287a8ed2eb1a4eee349401615269d0769..a0717da24d7b04d9d525778e0e05667ff3626771 100644 GIT binary patch delta 22 ccmey({+pfGiIV!Z diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc index 192a389f1477000fda04f24ee0adfa512ffa6f73..8bff9ebadb32c7af68b5219d93a66563d9b05a3a 100644 GIT binary patch delta 25 fcmcaQi}C6#Mm{HAUM>b8m|C_mroLb!pSv#rWmyNW delta 25 fcmcaQi}C6#Mm{HAUM>b8Q1Yyesm$HT=k5ytU2_J~ diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc index 6e41c41921bbf7ceb7b1d8d0ba76b2f7207b31aa..36326e903d67477174a05db58916672cdb946aa2 100644 GIT binary patch delta 22 ccmeyw{E3;@iIV!Z delta 22 ccmeyw{E3;@iIi_@% diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc index 7c0d24e5d748850d490f6093312e1d734bda60c3..b71b27c64c54b8243b73e0f87234ed4511e0272e 100644 GIT binary patch delta 23 dcmX>SbR>w+iISbR>w+iI1e^Twu8 z+?jdBC5bsX@j01Ex7dpEOA<>`qd1Ba%Tn_TN{XXci$OZ0*osq2fc#r5C89Yv{ MT~{P9*_&ww0P~eRc>n+a delta 177 zcmaFN`k0m1iIiQ*0x{097@G6q%`M*N%#gG5C(Cp5mW*XvC?lUyW)9xcQ#_!yZXoOYIvA`{P zRGb7Xz)cC=7E8s{zW#VL-q9fr!p`w~kC#TYbx+<*gWTh7p>b{5OGLB0;w#XAcBO8f zY_r(g0$k%t|AhSAW52gzR2qs+G{V0P+~E)YAl>CZ{u=7#o%Ktu3D{%62rv!|0KL3m zc50=&D~XuBfkv9*O93}cX}N%%nvhvEN$A%0SSp&85L576@N8H|lj*BHYFybaULue~ zpg5t%I&@PaB?>(1u5?TyQvM$mP&2&N5TF^ZQl7SEU|g4ww|E7;2vh@302K(-q8GQN z)2bN4x&cstK?%jO_5T8l*T4#w2c0y`!C);7Yt6wYRAID_Wbm66M@-_Owz;R4sE<7% zC(Usrv{yF2Efnx!Op1LgrB`ZUTmhF8Zr~Zuhg?+PHz6M_^ViS`NoC(}`>G5oX7L4k zCOI5-(JD8GYa~0vo31%&>(-1K>rSLaQe42Utyh65_?G1Qtt>B#>WZk!R7@o#;EHoV zN_(;YfI0FU+GxoQs8+z}gOTcKC0->6TP18PCdEb{$$t8jZ5+rTtx*XrfDv zBPP~xUI1-4U~Nw)Ga{bNiY&Zez)xTu_zobk@BwuI1}l4M*;kBsY>}VY|J! zKz{WnhR*+LnJ)`hk)fZdQVJ=-S8DE&rrRBdEi}x>T_Ix+<$C5h?$V3aA`^YxGl&tCgqimtY79d5Z<;MW6<7062lbS&X8N zR7w@YST_O+FeIT^^ZQT3SOHeKJm8=a4g~6GL~ji|p$fBoB!gdUNGTK#_03&%L>YDm z9W=|K;BMLcj-cO*F)8+ZNsrXRyaFyKT);D)3p#0Tz>K1=91wAqrYQ0;)(2eZ^2xm30olo8!h8P;Sp5!1vZ?>MlMFdJnzN;5s_NW4dl zAtt^fUjsUjVCzgJ(jum5q8HvzU>*1Yd<9Tgc!7EVgO$BB>!5@%=R3xyLVg<_7=tko z6I`gti7WAo4I4LD7w$;Zt%(a)^BWAtf8c#Dq$GrC^5nheoICfNcW(Da_eKLlwY4=B z;(2|4C$n{NCotq=>C%L6)}ve#QQl8q{00AY$YCHwT_=CV$Axqit6=Cki;sv!obmHW zH8)EHx zHJzK;VxC_`HbJeS7B)nEq4tIp0%$T_Y1o?UF)cn!#ZW|yvJqNmiiZ3+)z>Yvd0MaA zVl&iL|B8*#*ZRw<+bxw7L94J8xS0lF0{=>ID)&QXpQn z??#FuYK%FhgnF8>3}qUl>~`sKqn9P8Q7XsCKwS}VE3@Vb*RkDmupKEhCITzaj{s@x zEd6NOW~*d0|2#X0XxXI$a}X=Px@>z%3%4lBGbA-ykH-A6WPdMxj$Tp*kh(*EqLKLx zNI4hkUBxjC-CT@U%ii3YCC6TN>^bpCI1F^XcbAIGx{*)&EZfP=EePqd1uowr4?N;< zlJ2#AIyZ$w(!dO00S+(=tO8GfH6TgJ_HQad!X`cs3gi- uFHa7k`f163rkC}|D?f?ADWFdv?a>U^TgX~j+vfZw!rg!=CU2s(&c*+Eqsy28 delta 928 zcmZvb%}*0S7{)sVx0Fg-fkI0q1qvZWqQ*#q8a`SpiRl4BO`x>Yg%+tSyJU7t@GBT; zVkE|pydLqw#fukR58g=BtBD6s`!^Vj|AF%iq$Gsh~F`BPrz*i+uTTNx2iK1yGF%f4HX6F{2!&;CkG3F#>2vQ}O&c}5Hpj9)@J zTtftE#_np`XU&t)UV((0_d%!WpMRIl(%ZmgmZAMXG;|N)S{=WSVUqp^LXpEZ#Mto^ z%UoAiOZ*11og# z$8yx)vco3nYsV--U_L0|1Qse~tym~+SS8&o8#+%SH3W^%Kw|G+j$3;(qQ-WDY88OV@0-i;)gRd4*(&scuW3~l3QIydY>CTNLI;Pf5d#KXONNX!2~8g<&uG3a}I#3#22 rqWY!n>m6c)@_ye%;2bb4kaZU|$Fr=Os%3G$gYW=gh-0?XR^Q5hNBYP6 diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc index d1a1c7221c8178237735abe2f7e6bbd3a519ddf7..885e881256119e8353a5c5306fae91864b4c89da 100644 GIT binary patch delta 485 zcmZp4?sDdH;^pOH0D`Gy8)LfEHu9Zk^v-g&ig8RTj!7&^&d4lFjVVsfFGvk8N)Gjj z@h?ct3kqoQ9F*kx1#~2y&Cohl|1)8u;+Larj&t)>3j47ktWE+`68*7jjSrDNQBBDV=Jc!5! z5tbmr6-eCTDK1GY$xO~o1qNJ75!f}HlP|IgZ~i00#>iManOV*V=uI;@RmPIZF>=a` zC7T=M3KK3ZX#VdWyjSm6C#3 delta 493 zcmX}oPfHs?6aetPHAqcjwh`8lnygBRBuK1^8e6o9`D1%1lu`q-453Rp)WuD9cXk7& zSV@lYRCot_@$AKm><94HYkTNP=%F6G^%L~cc|ABVKi<4~GsC>o+OU?WPEJN2$Wi5= z*>UbF@g1sW?Kx}uT=?vO+q}!!j_cOVz+|tTwrR6H-f@|0xkan%2c~To9r4lYukkkX zdC+qM$Fak_5{bf1Sd2ebU@Lr;cmrVIS9NuKTRtUT;15-k+jr^+qIJq>5(E3mOEAKP zsqC1nu4|uQAFs76wD6ZU0EVsUO|bB6`im^er)HIkV7F2?m$`O&hT0}r|W1iWyhdjKc+ zcQz-TpF7<+q&tShdtyMeiHgKX-gn$z;zt1&T|uod@b_GE+@rF$c&?=I-F)dE<6?c! diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc index 776ed3b3721cb619befbe3468845588110bacad5..58b1a2058c3929ec6769dfc02f4ed57ac022ced6 100644 GIT binary patch delta 3054 zcmZuz3s98T72dN8n^hh`j)~r6pdP(1jVK#l`!D4`|}dq_3mPVqOsN{ z4PjJric=G#so^0cVw``fiGef{1z*uBG|_dM=7 z_uO;0?Ut$SmdSsnpWje}{8TU7mGyA;E`M85kZ0HnqR_47xU6}ayDTTK*qZO*-xfVi z9^O|JP9FVq(YXLHE1s6J+ZviJL1n|Fo{3{f8yKgrqF&)SYJ!^`rp>SPf^=p(EvyV>;O0cp)g+xO6Q$bVbN_MhXN7+=diq6 z$v}Mp>X?DgG==EK*TX6B00g>RiZP3yL8D!d=XpkI;+55JQaeAg(MBiql^ee?(hc3Q zDalAj^u{+|HBm25-r7KS_{`R1I>IB~E|H19`u29Bt2}Aj6xz#0+rs&+nnx&1-?A;2 zq(0RI1@A>TY{z5C6ONL_TA52+<)74yrEfT`CX7NjuO`mt8njfQuJaZt4b}J5ETW_j zrFi+USz58?E?km7S}Sq7%SK1L=EMvW5k_gT8T$_gG{b?43B$tm^wBbCWj7^4;*bH3)by+@*a0;NdABG%4 z0Utru1&9PY2b7B0%w0{PJmcN7W+Wr7_itTKdM};g9`x(+u@zfgt`f~%;IQ|*35LmI za5&D01~7_fKE5NAqV<37h$D*U;GKKu6aH+cixTu1@BhZn?`}G>Ig;JqnTXY+H9EtRg-v<7k)ZsqVhglO4Lp1hv_(pX;L;H9xTd(#bhKiiD}&U zX=T(b=(~|=sRWOCU|)0K*eFt9K9e)|*Qb6T>aPBPii(;FDemWeQKw3oc3)IK6?H1l zJ+O}A_{#$sl*aLGdm|1Z_%3NXZ@KZ&F)`laFa+L!Bka}w6s2=|dnHZcuJ%~3XQWeA zs7DVr4R3;u{2Jy+tLb3U_}szwD1)mG)tg%&$k3lSe1&K{zjQW~XB~aTuN~605@dGc z^)HXk#^T6hYa%kG=NJ;>e3!wW8ef{TS$^1*u z@x13moH-AqjaPMqGM!v%v>7=&HcYQP>7vl*uvDVV#+prRJ?>m3ua9&FwID`A7S8eEG&#Q+w<4H6UCfad{O01conOfIM*fZA5!K&L;) zKkXdnh3&HS-4GU?$svP+4urzR2oy`CqFHvA>QM`cC3;WiN|P*E(O)knIpF;y5_N*g zM)AG+3!Q@vjsU=NaI!+L^yowfIpuWZWOXn*;H4C*Hznoqc9%J|9FY&fc?gVhrYN5R zihq>X{SL+QhOPu!!EIgT5rej}6ox30YKH7HLF9K&Bzr-2jWa+6Uip0pQOf^28%E_E z)_o{YRaMmz6+}{et=qn6P^HwwO2>v40L~!Yg8XIx5$}34pEq&Q=nPxaym|cMkUu?oIn-&iHnPge$CS_MNk!IUK&Fi zxcpMWv_aKID~fwX9aOsttg6axP@O(X;J^#ex_J34_3K*t<8EI=G;BT4=QtbwO2r<@4YxRfifywf;eG zE73dpihtJ;)$!QAc_SYzl*iZRC@FC)$tiVN^EFY&>-tiuflu`%C)Y@qo`+qUyVU7+ zIEr2I_Cl9i#NeRo0o&xdsFff)UeWasz)Cde^RK57?dG>`tjR#9d%SE8p^2T)Hi>I6 z2c7BdvM$r?>c-2d+XP$nR>5t+5SdP(R5cjoftZFGeZ4JYAtMs2W%tdA@{=(47L942XvA-G@iSgG~Uef-?Ra z2)y~~rI*k08{dY%gvV2)0n!0@_Cyx6H9&@BJw9_woDSihErdh#|CLko1mix_-&N+y z(O%SSrEY6(v8Lv;_!Ugmd_%K|d*cROCD2FW9cHjPXyl$JDiIwr5yL6ocrCm F{{vJcNKya* delta 3083 zcmZuz3s98T72dN8n~g3ADvu)XpbSNbT9Jy7sH0SBMAAqq8wxJ)^AcQgcQM6C%&3_} zYcYBz&ZHV}2#Sy>F@GY)No+yUBvq7DN3#{RsZvoPw6WEinD%}b;)BQx-=2G(_ndp~ zx&M*drX#ma-m|^DMi}H@WLkB0@1nil`K4oRzAuOpmzL|a7izAm+`=+@k&Ry|ok2Ek zD-9x>ey;SA4;C*zCDD6jG_~l{RMj2?(tz%G zGs#FDdh^zGCc4T~>ze2mpRY@%4j#9?TqeG5`!1qho>HGkA8=`XkfduH0?AjetD(Cd=b4R%LzGD`j8O=;xkz*6zfd6lq8xL?uHKPK;}_8I)BT#FD14NR z>^9rWTu!Y*^gsY@w>iI36qE?z%~{Qps7J-v$FCy{$ za5hzf`;p2DSy)YoM9yo=@<^6EzBt>TPqzh5#v;aePg!;SAf%wMk4yRdM+^q1{52Rz zJkFu*%V`F`(f+X|3AQGY%vpybCaG{wNX~E%QzUO8JXn+mi^)i45>vSO(1xfK=(~`5 zr3ANmXroWUu~E#F24V)=4mZyGA=F*{Ar%#M7Pz>r_w9SKCGG-e&XJVkf;R`1PWI(GB@GF^y+|rw8h&Ga>WubE`wo|Lr3`(P^^{n z;CmX+uXiVqi;r}#3?8yRIxHTEQt-gK0h6u13&0UU@ZP z`mk!F6~(=x4y)Z7NL6LmsZI|QIPhY$E}ljUc^Iu`tC!Ws>a8TI`xCB((JIcoc87%i z%yl!-8n*Q%{5ajZzCc>b`}-!!_PE@)WcZCyhg_+``iWICY}0)=25Yt-^VhfaCsOe5 zPyRFk@MTzXe9wYwAgbXk2<+{V0u7}WOYMT{>$gWDpf}qMUB3Hpq*%&{^GxO z64i0!jr7n53+1-vJIc!)%W^B7_99Kxam|f+RL^H_BqzTmUAjj(HCJVY%i$<<#ut=0 zT_Oet-3Zt!<)T)C?07|Q2Lo23USIg{1w`-jTmM;|iB5NW5P`D2BSO>(+H#0(?S+9BC%R_-JC=vyyNCeJ`W}&y41aR z{gh{H6dXuL7)6*lF_bQY%pRiF4-QPo#X(+iYv0drp`}$f9sqR*5_MtK)mn>X65vZn z)tp`|t;J!z_`k0bZQ_C3b7?bA`!;g+05lSyn+TW+2!-z5cSuBI84q{~%J_B=_$E*f zzkH?t@NLj4yrm))kOsgjD6*lg0n+8tJuZ<$PdznGFzs#L&MIfF_FFB# z(q+#p)6{qti(#t98+uLLn>J`Ffi@CvW4i@p2$Ua>SWm;+4Lcl*ETx?G0i5^UrT+sZ C7(X`v diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc index f40893af8adca5602e3a5a22e920884a83c4c18d..65c1e1c38f7c4973e38baea52eee72e2b3eb402c 100644 GIT binary patch delta 25 fcmdn8l5xvQMm{HAUM>b8m|C_mW_{X5zGWc*W1t8Z delta 25 fcmdn8l5xvQMm{HAUM>b8Q1Yyed6c}7Z&?TcT@VLz diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc index 56d81897af932783265361a6c0ae1dac404d88f0..67c312892ade7d8d44916a414485bbd8c8cc45b9 100644 GIT binary patch delta 281 zcmZ1~zfPXliIu>PG(X}ab`)XZb4#lc4B(!=C4dF z%;Hg;1&JjY@oAYksZm_16(vQ9@hO=_#ghw}#V4z?{bCf}ti(QznNf7|POf@Jk855 zTOkKhcZ;XEB(WqjIX4yPw3H$dkREXm!3t77*@o}5h$x6_1R`WXgglUlnk>z)$7nj) Hi$59w&#z8q delta 268 zcmZ1{zf_*riI|;&(GQXkBNnu=N4x{Vo64P zT4qk_t<8LFGK`F(o3+`eF*Ax!KEzeeD7M*&TZEA@YH~QwMj*+_t6-oDbVrdWkkDi) zVgs?Yfy6E5|38Gqz;gh>Xbs5t(?-b=?Vv7Qahfh8!uE1C^`IYz* z#>mP25-s*YAmI=Yp#UOcKtwKxC<76-K;jl}e0*|FVsUYDYEDjkd=W250z_ys7DY@B QlAO<$4iage{9Upe0QGq?fdBvi delta 188 zcmZoNZ8GI^;^pOH00Je?+L${s8~F_R7;kNM;G4r7Pyi9JAR-S$l!J&mAaRQ~K0Y}ovA8%nH76%NzK9nj0U|URiy|in QNzP}>0Ex6r{w~=K0M&#tWdHyG diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc index 064dc9f329557ba61de1c315ccd8749ab2d6fb92..944de804ac607bab344af2d43ca87832ab73cf49 100644 GIT binary patch delta 23 dcmZ3dyiS?ViI?oU1`o?a9`Ost@^ zC^aWDDQdE_s6J!VKbn=N6|IwNG9y<-pi5`GwRo#@fy2rS~whUN)6z?-KHcl>5RySJ&lHdmtw^(ztQ!KnvDIbVfHu=1=9@}aVbJJvIl{t*{lNYF5SLpz$=z*r K>)7OXY83z}yK?dX delta 369 zcmaFn_soyaiI`p585fm{>t+ zQEE_QBGA5D%(=zsMSYW(OF1yMPktfwjIm|&dFefjYz08cqJqg2Wp6T0ot!Oa$J-1P z&}1vJ1c@)$yiM*l6Jy8bNs9Lw89OEyDXW{U1WE7%iCe6>*(sStMH@hDj^zA;%95hg z)S_u1E=y5rVoFf}NGTtPSUdT=vL4$e5Oe2bW|cXNZIc(MTvzD_spT!tNKMU&FH0>d z&dkp%Y6mH50c!#gZIfrK7BX&_%&V5cxN~xuTCnN@kTA#rQJi3%X_+~xMFJo}uwR5g Lth1BfsZ{^~d*pWl diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/wheel/__pycache__/metadata.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/wheel/__pycache__/metadata.cpython-37.pyc index 05a4b04ea88a503693f32bc4fa38dba3fd3bfe38..e6a40ad8ee987ab488230e3edb0cba98ac0be240 100644 GIT binary patch delta 22 ccmX>kdq|eoiIkdq|eoiI#LLUY00dLZHpWEAY~+(zOW{JgZx z^jniZu=p@WO}1r~VdR}0#cJv(0n~eo6Rz|YYi?p?QtB=C{G62d-29Z43`Lqi6~B_5 ztzsOLienOsk~1>PQe%MT6{H3iC5QSHQG4=9HW_6;pvod`kb&&!Ir&M6ImKYj LNQBm84t5y;jc++H delta 208 zcmeC-Tf)cZ#LLUY00eb@(_$`2Z{(9?VT_ur!Lms#N;oC6xTLfsGpAUuxUx7oKQApa zJ!&{Dy`Si#6xp`a*r@&(oh ljOvp&vdJj(0!=7V2NJi~({u8Z5_5{dh9VJalRvP@002-CK9v9f diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/win32com/__pycache__/__init__.cpython-37.pyc b/WPy32-3720/python-3.7.2/Lib/site-packages/win32com/__pycache__/__init__.cpython-37.pyc index b6fdb360cebc854064c98ab4f314c866f46cd894..b276fcb20e73ff663f86152f98e59f79fc500d35 100644 GIT binary patch delta 111 zcmcb}d!LujiI{K|B;ig8RT zj!7&^&d4lFjVVsfFGvk8N)Gjj@h?ct3kqn& zMa40W$*Dy#js*oSi6x0KKKaRsIWZxrxdkx=nFYF;dBr7(IXSxN@fGFfCT2-71(jg) ICSEZH04EeABme*a diff --git a/WPy32-3720/python-3.7.2/Lib/site-packages/wmi.py b/WPy32-3720/python-3.7.2/Lib/site-packages/wmi.py new file mode 100644 index 00000000..c3dbfcbe --- /dev/null +++ b/WPy32-3720/python-3.7.2/Lib/site-packages/wmi.py @@ -0,0 +1,1441 @@ +""" +Windows Management Instrumentation (WMI) is Microsoft's answer to +the DMTF's Common Information Model. It allows you to query just +about any conceivable piece of information from any computer which +is running the necessary agent and over which have you the +necessary authority. + +Since the COM implementation doesn't give much away to Python +programmers, I've wrapped it in some lightweight classes with +some getattr / setattr magic to ease the way. In particular: + +* The :class:`_wmi_namespace` object itself will determine its classes + and allow you to return all instances of any of them by + using its name as an attribute:: + + disks = wmi.WMI ().Win32_LogicalDisk () + +* In addition, you can specify what would become the WHERE clause + as keyword parameters:: + + fixed_disks = wmi.WMI ().Win32_LogicalDisk (DriveType=3) + +* The objects returned by a WMI lookup are wrapped in a Python + class which determines their methods and classes and allows + you to access them as though they were Python classes. The + methods only allow named parameters:: + + for p in wmi.WMI ().Win32_Process (Name="notepad.exe"): + p.Terminate (Result=1) + +* Doing a print on one of the WMI objects will result in its + `GetObjectText\_` method being called, which usually produces + a meaningful printout of current values. + The repr of the object will include its full WMI path, + which lets you get directly to it if you need to. + +* You can get the associators and references of an object as + a list of python objects by calling the associators () and + references () methods on a WMI Python object:: + + for p in wmi.WMI ().Win32_Process (Name="notepad.exe"): + for r in p.references (): + print r + + .. note:: + Don't do this on a Win32_ComputerSystem object; it will + take all day and kill your machine! + + +* WMI classes (as opposed to instances) are first-class + objects, so you can get hold of a class, and call + its methods or set up a watch against it:: + + process = wmi.WMI ().Win32_Process + process.Create (CommandLine="notepad.exe") + +* To make it easier to use in embedded systems and py2exe-style + executable wrappers, the module will not force early Dispatch. + To do this, it uses a handy hack by Thomas Heller for easy access + to constants. + +Typical usage will be:: + + import wmi + + vodev1 = wmi.WMI ("vodev1") + for disk in vodev1.Win32_LogicalDisk (): + if disk.DriveType == 3: + space = 100 * long (disk.FreeSpace) / long (disk.Size) + print "%s has %d%% free" % (disk.Name, space) + +Many thanks, obviously to Mark Hammond for creating the win32all +extensions, but also to Alex Martelli and Roger Upole, whose +c.l.py postings pointed me in the right direction. +Thanks especially in release 1.2 to Paul Tiemann for his code +contributions and robust testing. +""" +__VERSION__ = __version__ = "1.4.9" + +_DEBUG = False + +import sys +import datetime +import re +import struct +import warnings + +from win32com.client import GetObject, Dispatch +import pywintypes + +def signed_to_unsigned (signed): + """Convert a (possibly signed) long to unsigned hex. Useful + when converting a COM error code to the more conventional + 8-digit hex:: + + print "%08X" % signed_to_unsigned (-2147023174) + """ + unsigned, = struct.unpack ("L", struct.pack ("l", signed)) + return unsigned + +class SelfDeprecatingDict (object): + """Provides for graceful degradation of objects which + are currently dictionaries (and therefore accessed via + `.keys`, `.items`, etc.) into lists. Wraps an existing + `dict` and allows it to be addressed as a `dict` or as a + `list` during an interregnum, issuing a `DeprecationWarning` + if accessed as a `dict`. + """ + + dict_only = set (dir (dict)).difference (dir (list)) + + def __init__ (self, dictlike): + self.dict = dict (dictlike) + self.list = list (self.dict) + + def __getattr__ (self, attribute): + if attribute in self.dict_only: + warnings.warn ("In future this will be a list and not a dictionary", DeprecationWarning) + return getattr (self.dict, attribute) + else: + return getattr (self.list, attribute) + + def __iter__ (self): + return iter (self.list) + + def __str__ (self): + return str (self.list) + + def __repr__ (self): + return repr (self.list) + + def __getitem__ (self, item): + try: + return self.list[item] + except TypeError: + return self.dict[item] + +class ProvideConstants (object): + """When called on a ``win32com.client.Dispatch`` object, + provides lazy access to constants defined in the typelib. + They can then be accessed as attributes of the :attr:`_constants` + property. (From Thomas Heller on c.l.py). + """ + def __init__(self, comobj): + comobj.__dict__["_constants"] = self + self.__typecomp = \ + comobj._oleobj_.GetTypeInfo().GetContainingTypeLib()[0].GetTypeComp() + + def __getattr__(self, name): + if name.startswith("__") and name.endswith("__"): + raise AttributeError (name) + result = self.__typecomp.Bind(name) + if not result[0]: + raise AttributeError (name) + return result[1].value + +obj = GetObject ("winmgmts:") +ProvideConstants (obj) + +wbemErrInvalidQuery = obj._constants.wbemErrInvalidQuery +wbemErrTimedout = obj._constants.wbemErrTimedout +wbemFlagReturnImmediately = obj._constants.wbemFlagReturnImmediately +wbemFlagForwardOnly = obj._constants.wbemFlagForwardOnly + +# +# Exceptions +# +class x_wmi (Exception): + """Ancestor of all wmi-related exceptions. Keeps track of + an info message and the underlying COM error if any, exposed + as the :attr:`com_error` attribute. + """ + def __init__ (self, info="", com_error=None): + self.info = info + self.com_error = com_error + + def __str__ (self): + return "" % ( + self.info or "Unexpected COM Error", + self.com_error or "(no underlying exception)" + ) + +class x_wmi_invalid_query (x_wmi): + "Raised when a WMI returns `wbemErrInvalidQuery`" + pass + +class x_wmi_timed_out (x_wmi): + "Raised when a watcher times out" + pass + +class x_wmi_no_namespace (x_wmi): + """Raised when an attempt is made to query or watch + from a class without a namespace. + """ + pass + +class x_access_denied (x_wmi): + "Raised when WMI raises 80070005" + pass + +class x_wmi_authentication (x_wmi): + "Raised when an invalid combination of authentication properties is attempted when connecting" + pass + +class x_wmi_uninitialised_thread (x_wmi): + """Raised when WMI returns 800401E4 on connection, usually + indicating that no COM threading model has been initialised + """ + pass + +WMI_EXCEPTIONS = { + signed_to_unsigned (wbemErrInvalidQuery) : x_wmi_invalid_query, + signed_to_unsigned (wbemErrTimedout) : x_wmi_timed_out, + 0x80070005 : x_access_denied, + 0x80041003 : x_access_denied, + 0x800401E4 : x_wmi_uninitialised_thread, +} + +def handle_com_error (err=None): + """Convenience wrapper for displaying all manner of COM errors. + Raises a :exc:`x_wmi` exception with more useful information attached + + :param err: The structure attached to a `pywintypes.com_error` + """ + if err is None: + _, err, _ = sys.exc_info () + hresult_code, hresult_name, additional_info, parameter_in_error = err.args + hresult_code = signed_to_unsigned (hresult_code) + exception_string = ["%s - %s" % (hex (hresult_code), hresult_name)] + scode = None + if additional_info: + wcode, source_of_error, error_description, whlp_file, whlp_context, scode = additional_info + scode = signed_to_unsigned (scode) + exception_string.append (" Error in: %s" % source_of_error) + exception_string.append (" %s - %s" % (hex (scode), (error_description or "").strip ())) + for error_code, klass in WMI_EXCEPTIONS.items (): + if error_code in (hresult_code, scode): + break + else: + klass = x_wmi + raise klass (com_error=err) + + +BASE = datetime.datetime (1601, 1, 1) +def from_1601 (ns100): + return BASE + datetime.timedelta (microseconds=int (ns100) / 10) + +def from_time (year=None, month=None, day=None, hours=None, minutes=None, seconds=None, microseconds=None, timezone=None): + """Convenience wrapper to take a series of date/time elements and return a WMI time + of the form `yyyymmddHHMMSS.mmmmmm+UUU`. All elements may be int, string or + omitted altogether. If omitted, they will be replaced in the output string + by a series of stars of the appropriate length. + + :param year: The year element of the date/time + :param month: The month element of the date/time + :param day: The day element of the date/time + :param hours: The hours element of the date/time + :param minutes: The minutes element of the date/time + :param seconds: The seconds element of the date/time + :param microseconds: The microseconds element of the date/time + :param timezone: The timeezone element of the date/time + + :returns: A WMI datetime string of the form: `yyyymmddHHMMSS.mmmmmm+UUU` + """ + def str_or_stars (i, length): + if i is None: + return "*" * length + else: + return str (i).rjust (length, "0") + + 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) + if timezone >= 0: + wmi_time += "+" + else: + wmi_time += "-" + timezone = abs (timezone) + wmi_time += str_or_stars (timezone, 3) + + return wmi_time + +def to_time (wmi_time): + """Convenience wrapper to take a WMI datetime string of the form + yyyymmddHHMMSS.mmmmmm+UUU and return a 9-tuple containing the + individual elements, or None where string contains placeholder + stars. + + :param wmi_time: The WMI datetime string in `yyyymmddHHMMSS.mmmmmm+UUU` format + + :returns: A 9-tuple of (year, month, day, hours, minutes, seconds, microseconds, timezone) + """ + def int_or_none (s, start, end): + try: + return int (s[start:end]) + except ValueError: + return None + + year = int_or_none (wmi_time, 0, 4) + month = int_or_none (wmi_time, 4, 6) + day = int_or_none (wmi_time, 6, 8) + hours = int_or_none (wmi_time, 8, 10) + minutes = int_or_none (wmi_time, 10, 12) + seconds = int_or_none (wmi_time, 12, 14) + microseconds = int_or_none (wmi_time, 15, 21) + timezone = wmi_time[22:] + if timezone == "***": + timezone = None + + return year, month, day, hours, minutes, seconds, microseconds, timezone + +def _set (obj, attribute, value): + """Helper function to add an attribute directly into the instance + dictionary, bypassing possible `__getattr__` calls + + :param obj: Any python object + :param attribute: String containing attribute name + :param value: Any python object + """ + obj.__dict__[attribute] = value + +class _wmi_method: + """A currying sort of wrapper around a WMI method name. It + abstract's the method's parameters and can be called like + a normal Python object passing in the parameter values. + + Output parameters are returned from the call as a tuple. + In addition, the docstring is set up as the method's + signature, including an indication as to whether any + given parameter is expecting an array, and what + special privileges are required to call the method. + """ + + def __init__ (self, ole_object, method_name): + """ + :param ole_object: The WMI class/instance whose method is to be called + :param method_name: The name of the method to be called + """ + try: + self.ole_object = Dispatch (ole_object) + self.method = ole_object.Methods_ (method_name) + self.qualifiers = {} + for q in self.method.Qualifiers_: + self.qualifiers[q.Name] = q.Value + self.provenance = "\n".join (self.qualifiers.get ("MappingStrings", [])) + + self.in_parameters = self.method.InParameters + self.out_parameters = self.method.OutParameters + if self.in_parameters is None: + self.in_parameter_names = [] + else: + self.in_parameter_names = [(i.Name, i.IsArray) for i in self.in_parameters.Properties_] + if self.out_parameters is None: + self.out_parameter_names = [] + else: + self.out_parameter_names = [(i.Name, i.IsArray) for i in self.out_parameters.Properties_] + + doc = "%s (%s) => (%s)" % ( + method_name, + ", ".join ([name + ("", "[]")[is_array] for (name, is_array) in self.in_parameter_names]), + ", ".join ([name + ("", "[]")[is_array] for (name, is_array) in self.out_parameter_names]) + ) + privileges = self.qualifiers.get ("Privileges", []) + if privileges: + doc += " | Needs: " + ", ".join (privileges) + self.__doc__ = doc + except pywintypes.com_error: + handle_com_error () + + def __call__ (self, *args, **kwargs): + """Execute the call to a WMI method, returning + a tuple (even if is of only one value) containing + the out and return parameters. + """ + try: + if self.in_parameters: + parameter_names = {} + for name, is_array in self.in_parameter_names: + parameter_names[name] = is_array + + parameters = self.in_parameters + + # + # Check positional parameters first + # + for n_arg in range (len (args)): + arg = args[n_arg] + parameter = parameters.Properties_[n_arg] + if parameter.IsArray: + try: list (arg) + except TypeError: raise TypeError ("parameter %d must be iterable" % n_arg) + parameter.Value = arg + + # + # If any keyword param supersedes a positional one, + # it'll simply overwrite it. + # + for k, v in kwargs.items (): + is_array = parameter_names.get (k) + if is_array is None: + raise AttributeError ("%s is not a valid parameter for %s" % (k, self.__doc__)) + else: + if is_array: + try: list (v) + except TypeError: raise TypeError ("%s must be iterable" % k) + parameters.Properties_ (k).Value = v + + result = self.ole_object.ExecMethod_ (self.method.Name, self.in_parameters) + else: + result = self.ole_object.ExecMethod_ (self.method.Name) + + results = [] + for name, is_array in self.out_parameter_names: + value = result.Properties_ (name).Value + if is_array: + # + # Thanks to Jonas Bjering for bug report and patch + # + results.append (list (value or [])) + else: + results.append (value) + return tuple (results) + + except pywintypes.com_error: + handle_com_error () + + def __repr__ (self): + return "" % self.__doc__ + +class _wmi_property (object): + + def __init__ (self, property): + self.property = property + self.name = property.Name + self.value = property.Value + self.qualifiers = dict ((q.Name, q.Value) for q in property.Qualifiers_) + self.type = self.qualifiers.get ("CIMTYPE", None) + + def set (self, value): + self.property.Value = value + + def __repr__ (self): + return "" % self.name + + def __getattr__ (self, attr): + return getattr (self.property, attr) + +# +# class _wmi_object +# +class _wmi_object: + """The heart of the WMI module: wraps the objects returned by COM + ISWbemObject interface and provide readier access to their properties + and methods resulting in a more Pythonic interface. Not usually + instantiated directly, rather as a result of calling a :class:`_wmi_class` + on the parent :class:`_wmi_namespace`. + + If you get hold of a WMI-related COM object from some other + source than this module, you can wrap it in one of these objects + to get the benefits of the module:: + + import win32com.client + import wmi + + wmiobj = win32com.client.GetObject ("winmgmts:Win32_LogicalDisk.DeviceID='C:'") + c_drive = wmi._wmi_object (wmiobj) + print c_drive + """ + + def __init__ (self, ole_object, instance_of=None, fields=[], property_map={}): + try: + _set (self, "ole_object", ole_object) + _set (self, "id", ole_object.Path_.DisplayName.lower ()) + _set (self, "_instance_of", instance_of) + _set (self, "properties", {}) + _set (self, "methods", {}) + _set (self, "property_map", property_map) + _set (self, "_associated_classes", None) + _set (self, "_keys", None) + + if fields: + for field in fields: + self.properties[field] = None + else: + for p in ole_object.Properties_: + self.properties[p.Name] = None + + for m in ole_object.Methods_: + self.methods[m.Name] = None + + _set (self, "_properties", self.properties.keys ()) + _set (self, "_methods", self.methods.keys ()) + _set (self, "qualifiers", dict ((q.Name, q.Value) for q in self.ole_object.Qualifiers_)) + + except pywintypes.com_error: + handle_com_error () + + def __lt__ (self, other): + return self.id < other.id + + def __str__ (self): + """For a call to print [object] return the OLE description + of the properties / values of the object + """ + try: + return self.ole_object.GetObjectText_ () + except pywintypes.com_error: + handle_com_error () + + def __repr__ (self): + """ + Indicate both the fact that this is a wrapped WMI object + and the WMI object's own identifying class. + """ + try: + return "<%s: %s>" % (self.__class__.__name__, self.Path_.Path.encode ("ascii", "backslashreplace")) + except pywintypes.com_error: + handle_com_error () + + def _cached_properties (self, attribute): + if self.properties[attribute] is None: + self.properties[attribute] = _wmi_property (self.ole_object.Properties_ (attribute)) + return self.properties[attribute] + + def _cached_methods (self, attribute): + if self.methods[attribute] is None: + self.methods[attribute] = _wmi_method (self.ole_object, attribute) + return self.methods[attribute] + + def __getattr__ (self, attribute): + """ + Attempt to pass attribute calls to the proxied COM object. + If the attribute is recognised as a property, return its value; + if it is recognised as a method, return a method wrapper which + can then be called with parameters; otherwise pass the lookup + on to the underlying object. + """ + try: + if attribute in self.properties: + property = self._cached_properties (attribute) + factory = self.property_map.get (attribute, self.property_map.get (property.type, lambda x: x)) + value = factory (property.value) + # + # If this is an association, certain of its properties + # are actually the paths to the aspects of the association, + # so translate them automatically into WMI objects. + # + if property.type.startswith ("ref:"): + return WMI (moniker=value) + else: + return value + elif attribute in self.methods: + return self._cached_methods (attribute) + else: + return getattr (self.ole_object, attribute) + except pywintypes.com_error: + handle_com_error () + + def __setattr__ (self, attribute, value): + """If the attribute to be set is valid for the proxied + COM object, set that objects's parameter value; if not, + raise an exception. + """ + try: + if attribute in self.properties: + self._cached_properties (attribute).set (value) + if self.ole_object.Path_.Path: + self.ole_object.Put_ () + else: + raise AttributeError (attribute) + except pywintypes.com_error: + handle_com_error () + + def __eq__ (self, other): + return self.id == other.id + + def __hash__ (self): + return hash (self.id) + + def _getAttributeNames (self): + """Return list of methods/properties for IPython completion""" + attribs = [str (x) for x in self.methods.keys ()] + attribs.extend ([str (x) for x in self.properties.keys ()]) + return attribs + + def _get_keys (self): + """A WMI object is uniquely defined by a set of properties + which constitute its keys. Lazily retrieves the keys for this + instance or class. + + :returns: list of key property names + """ + # NB You can get the keys of an instance more directly, via + # Path\_.Keys but this doesn't apply to classes. The technique + # here appears to work for both. + if self._keys is None: + _set (self, "_keys", []) + for property in self.ole_object.Properties_: + for qualifier in property.Qualifiers_: + if qualifier.Name == "key" and qualifier.Value: + self._keys.append (property.Name) + return self._keys + keys = property (_get_keys) + + def wmi_property (self, property_name): + """Return the cached object representing one property + of this object + """ + return _wmi_property (self.ole_object.Properties_ (property_name)) + + def put (self): + """Push all outstanding property updates back to the + WMI database. + """ + self.ole_object.Put_ () + + def set (self, **kwargs): + """Set several properties of the underlying object + at one go. This is particularly useful in combination + with the new () method below. However, an instance + which has been spawned in this way won't have enough + information to write pack, so only try if the + instance has a path. + """ + if kwargs: + try: + for attribute, value in kwargs.items (): + if attribute in self.properties: + self._cached_properties (attribute).set (value) + else: + raise AttributeError (attribute) + # + # Only try to write the attributes + # back if the object exists. + # + if self.ole_object.Path_.Path: + self.ole_object.Put_ () + except pywintypes.com_error: + handle_com_error () + + def path (self): + """Return the WMI URI to this object. Can be used to + determine the path relative to the parent namespace:: + + pp0 = wmi.WMI ().Win32_ParallelPort ()[0] + print pp0.path ().RelPath + + .. Do more with this + """ + try: + return self.ole_object.Path_ + except pywintypes.com_error: + handle_com_error () + + def derivation (self): + """Return a tuple representing the object derivation for + this object, with the most specific object first:: + + pp0 = wmi.WMI ().Win32_ParallelPort ()[0] + print ' <- '.join (pp0.derivation ()) + """ + try: + return self.ole_object.Derivation_ + except pywintypes.com_error: + handle_com_error () + + def _cached_associated_classes (self): + if self._associated_classes is None: + if isinstance (self, _wmi_class): + params = {'bSchemaOnly' : True} + else: + params = {'bClassesOnly' : True} + try: + associated_classes = dict ( + (assoc.Path_.Class, _wmi_class (self._namespace, assoc)) for + assoc in self.ole_object.Associators_ (**params) + ) + _set (self, "_associated_classes", associated_classes) + except pywintypes.com_error: + handle_com_error () + + return self._associated_classes + associated_classes = property (_cached_associated_classes) + + def associators (self, wmi_association_class="", wmi_result_class=""): + """Return a list of objects related to this one, optionally limited + either by association class (ie the name of the class which relates + them) or by result class (ie the name of the class which would be + retrieved):: + + c = wmi.WMI () + pp = c.Win32_ParallelPort ()[0] + + for i in pp.associators (wmi_association_class="Win32_PortResource"): + print i + + for i in pp.associators (wmi_result_class="Win32_PnPEntity"): + print i + """ + try: + return [ + _wmi_object (i) for i in \ + self.ole_object.Associators_ ( + strAssocClass=wmi_association_class, + strResultClass=wmi_result_class + ) + ] + except pywintypes.com_error: + handle_com_error () + + def references (self, wmi_class=""): + """Return a list of associations involving this object, optionally + limited by the result class (the name of the association class). + + NB Associations are treated specially; although WMI only returns + the string corresponding to the instance of each associated object, + this module will automatically convert that to the object itself:: + + c = wmi.WMI () + sp = c.Win32_SerialPort ()[0] + + for i in sp.references (): + print i + + for i in sp.references (wmi_class="Win32_SerialPortSetting"): + print i + """ + # + # FIXME: Allow an actual class to be passed in, using + # its .Path_.RelPath property to determine the string + # + try: + return [_wmi_object (i) for i in self.ole_object.References_ (strResultClass=wmi_class)] + except pywintypes.com_error: + handle_com_error () + +# +# class _wmi_event +# +class _wmi_event (_wmi_object): + """Slight extension of the _wmi_object class to allow + objects which are the result of events firing to return + extra information such as the type of event. + """ + event_type_re = re.compile ("__Instance(Creation|Modification|Deletion)Event") + def __init__ (self, event, event_info, fields=[]): + _wmi_object.__init__ (self, event, fields=fields) + _set (self, "event_type", None) + _set (self, "timestamp", None) + _set (self, "previous", None) + + if event_info: + event_type = self.event_type_re.match (event_info.Path_.Class).group (1).lower () + _set (self, "event_type", event_type) + if hasattr (event_info, "TIME_CREATED"): + _set (self, "timestamp", from_1601 (event_info.TIME_CREATED)) + if hasattr (event_info, "PreviousInstance"): + _set (self, "previous", event_info.PreviousInstance) + +# +# class _wmi_class +# +class _wmi_class (_wmi_object): + """Currying class to assist in issuing queries against + a WMI namespace. The idea is that when someone issues + an otherwise unknown method against the WMI object, if + it matches a known WMI class a query object will be + returned which may then be called with one or more params + which will form the WHERE clause:: + + c = wmi.WMI () + c_drives = c.Win32_LogicalDisk (Name='C:') + """ + def __init__ (self, namespace, wmi_class): + _wmi_object.__init__ (self, wmi_class) + _set (self, "_class_name", wmi_class.Path_.Class) + if namespace: + _set (self, "_namespace", namespace) + else: + class_moniker = wmi_class.Path_.DisplayName + winmgmts, namespace_moniker, class_name = class_moniker.split (":") + namespace = _wmi_namespace (GetObject (winmgmts + ":" + namespace_moniker), False) + _set (self, "_namespace", namespace) + + def __getattr__ (self, attribute): + try: + if attribute in self.properties: + return _wmi_property (self.Properties_ (attribute)) + else: + return _wmi_object.__getattr__ (self, attribute) + except pywintypes.com_error: + handle_com_error () + + + def query (self, fields=[], **where_clause): + """Make it slightly easier to query against the class, + by calling the namespace's query with the class preset. + Won't work if the class has been instantiated directly. + """ + # + # FIXME: Not clear if this can ever happen + # + if self._namespace is None: + raise x_wmi_no_namespace ("You cannot query directly from a WMI class") + + try: + field_list = ", ".join (fields) or "*" + wql = "SELECT " + field_list + " FROM " + self._class_name + if where_clause: + wql += " WHERE " + " AND ". join (["%s = %r" % (k, str (v)) for k, v in where_clause.items ()]) + return self._namespace.query (wql, self, fields) + except pywintypes.com_error: + handle_com_error () + + __call__ = query + + def watch_for ( + self, + notification_type="operation", + delay_secs=1, + fields=[], + **where_clause + ): + if self._namespace is None: + raise x_wmi_no_namespace ("You cannot watch directly from a WMI class") + + valid_notification_types = ("operation", "creation", "deletion", "modification") + if notification_type.lower () not in valid_notification_types: + raise x_wmi ("notification_type must be one of %s" % ", ".join (valid_notification_types)) + + return self._namespace.watch_for ( + notification_type=notification_type, + wmi_class=self, + delay_secs=delay_secs, + fields=fields, + **where_clause + ) + + def instances (self): + """Return a list of instances of the WMI class + """ + try: + return [_wmi_object (instance, self) for instance in self.Instances_ ()] + except pywintypes.com_error: + handle_com_error () + + def new (self, **kwargs): + """This is the equivalent to the raw-WMI SpawnInstance\_ + method. Note that there are relatively few uses for + this, certainly fewer than you might imagine. Most + classes which need to create a new *real* instance + of themselves, eg Win32_Process, offer a .Create + method. SpawnInstance\_ is generally reserved for + instances which are passed as parameters to such + `.Create` methods, a common example being the + `Win32_SecurityDescriptor`, passed to `Win32_Share.Create` + and other instances which need security. + + The example here is `Win32_ProcessStartup`, which + controls the shown/hidden state etc. of a new + `Win32_Process` instance:: + + import win32con + import wmi + c = wmi.WMI () + startup = c.Win32_ProcessStartup.new (ShowWindow=win32con.SW_SHOWMINIMIZED) + pid, retval = c.Win32_Process.Create ( + CommandLine="notepad.exe", + ProcessStartupInformation=startup + ) + + .. warning:: + previous versions of this docstring illustrated using this function + to create a new process. This is *not* a good example of its use; + it is better handled with something like the example above. + """ + try: + obj = _wmi_object (self.SpawnInstance_ (), self) + obj.set (**kwargs) + return obj + except pywintypes.com_error: + handle_com_error () + +# +# class _wmi_result +# +class _wmi_result: + """Simple, data only result for targeted WMI queries which request + data only result classes via fetch_as_classes. + """ + def __init__(self, obj, attributes): + if attributes: + for attr in attributes: + self.__dict__[attr] = obj.Properties_ (attr).Value + else: + for p in obj.Properties_: + attr = p.Name + self.__dict__[attr] = obj.Properties_(attr).Value + +# +# class WMI +# +class _wmi_namespace: + """A WMI root of a computer system. The classes attribute holds a list + of the classes on offer. This means you can explore a bit with + things like this:: + + c = wmi.WMI () + for i in c.classes: + if "user" in i.lower (): + print i + """ + def __init__ (self, namespace, find_classes): + _set (self, "_namespace", namespace) + # + # wmi attribute preserved for backwards compatibility + # + _set (self, "wmi", namespace) + + self._classes = None + self._classes_map = {} + # + # Pick up the list of classes under this namespace + # so that they can be queried, and used as though + # properties of the namespace by means of the __getattr__ + # hook below. + # If the namespace does not support SubclassesOf, carry on + # regardless + # + if find_classes: + _ = self.classes + + def __repr__ (self): + return "<_wmi_namespace: %s>" % self.wmi + + def __str__ (self): + return repr (self) + + def _get_classes (self): + if self._classes is None: + self._classes = self.subclasses_of () + return SelfDeprecatingDict (dict.fromkeys (self._classes)) + classes = property (_get_classes) + + def get (self, moniker): + try: + return _wmi_object (self.wmi.Get (moniker)) + except pywintypes.com_error: + handle_com_error () + + def handle (self): + """The raw OLE object representing the WMI namespace""" + return self._namespace + + def subclasses_of (self, root="", regex=r".*"): + try: + SubclassesOf = self._namespace.SubclassesOf + except AttributeError: + return set () + else: + return set ( + c.Path_.Class + for c in SubclassesOf (root) + if re.match (regex, c.Path_.Class) + ) + + def instances (self, class_name): + """Return a list of instances of the WMI class. This is + (probably) equivalent to querying with no qualifiers:: + + wmi.WMI ().instances ("Win32_LogicalDisk") + # should be the same as + wmi.WMI ().Win32_LogicalDisk () + """ + try: + return [_wmi_object (obj) for obj in self._namespace.InstancesOf (class_name)] + except pywintypes.com_error: + handle_com_error () + + def new (self, wmi_class, **kwargs): + """This is now implemented by a call to :meth:`_wmi_class.new`""" + return getattr (self, wmi_class).new (**kwargs) + + new_instance_of = new + + def _raw_query (self, wql): + """Execute a WQL query and return its raw results. Use the flags + recommended by Microsoft to achieve a read-only, semi-synchronous + query where the time is taken while looping through. + NB Backslashes need to be doubled up. + """ + flags = wbemFlagReturnImmediately | wbemFlagForwardOnly + wql = wql.replace ("\\", "\\\\") + try: + return self._namespace.ExecQuery (strQuery=wql, iFlags=flags) + except pywintypes.com_error: + handle_com_error () + + def query (self, wql, instance_of=None, fields=[]): + """Perform an arbitrary query against a WMI object, and return + a list of _wmi_object representations of the results. + """ + return [ _wmi_object (obj, instance_of, fields) for obj in self._raw_query(wql) ] + + def fetch_as_classes (self, wmi_classname, fields=(), **where_clause): + """Build and execute a wql query to fetch the specified list of fields from + the specified wmi_classname + where_clause, then return the results as + a list of simple class instances with attributes matching field_list. + + If fields is left empty, select * and pre-load all class attributes for + each class returned. + """ + wql = "SELECT %s FROM %s" % (fields and ", ".join (fields) or "*", wmi_classname) + if where_clause: + wql += " WHERE " + " AND ".join (["%s = '%s'" % (k, v) for k, v in where_clause.items()]) + return [_wmi_result (obj, fields) for obj in self._raw_query(wql)] + + def fetch_as_lists (self, wmi_classname, fields, **where_clause): + """Build and execute a wql query to fetch the specified list of fields from + the specified wmi_classname + where_clause, then return the results as + a list of lists whose values correspond to field_list. + """ + wql = "SELECT %s FROM %s" % (", ".join (fields), wmi_classname) + if where_clause: + wql += " WHERE " + " AND ".join (["%s = '%s'" % (k, v) for k, v in where_clause.items()]) + results = [] + for obj in self._raw_query(wql): + results.append ([obj.Properties_ (field).Value for field in fields]) + return results + + def watch_for ( + self, + raw_wql=None, + notification_type="operation", + wmi_class=None, + delay_secs=1, + fields=[], + **where_clause + ): + """Set up an event tracker on a WMI event. This function + returns an wmi_watcher which can be called to get the + next event:: + + c = wmi.WMI () + + raw_wql = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_Process'" + watcher = c.watch_for (raw_wql=raw_wql) + while 1: + process_created = watcher () + print process_created.Name + + # or + + watcher = c.watch_for ( + notification_type="Creation", + wmi_class="Win32_Process", + delay_secs=2, + Name='calc.exe' + ) + calc_created = watcher () + + Now supports timeout on the call to watcher:: + + import pythoncom + import wmi + c = wmi.WMI (privileges=["Security"]) + watcher1 = c.watch_for ( + notification_type="Creation", + wmi_class="Win32_NTLogEvent", + Type="error" + ) + watcher2 = c.watch_for ( + notification_type="Creation", + wmi_class="Win32_NTLogEvent", + Type="warning" + ) + + while 1: + try: + error_log = watcher1 (500) + except wmi.x_wmi_timed_out: + pythoncom.PumpWaitingMessages () + else: + print error_log + + try: + warning_log = watcher2 (500) + except wmi.x_wmi_timed_out: + pythoncom.PumpWaitingMessages () + else: + print warning_log + """ + if isinstance (wmi_class, _wmi_class): + class_name = wmi_class._class_name + else: + class_name = wmi_class + wmi_class = getattr (self, class_name) + is_extrinsic = "__ExtrinsicEvent" in wmi_class.derivation () + if raw_wql: + wql = raw_wql + else: + fields = set (['TargetInstance'] + (fields or ["*"])) + field_list = ", ".join (fields) + if is_extrinsic: + if where_clause: + where = " WHERE " + " AND ".join (["%s = '%s'" % (k, v) for k, v in where_clause.items ()]) + else: + where = "" + wql = "SELECT " + field_list + " FROM " + class_name + where + else: + if where_clause: + where = " AND " + " AND ".join (["TargetInstance.%s = '%s'" % (k, v) for k, v in where_clause.items ()]) + else: + where = "" + wql = \ + "SELECT %s FROM __Instance%sEvent WITHIN %d WHERE TargetInstance ISA '%s' %s" % \ + (field_list, notification_type, delay_secs, class_name, where) + + try: + return _wmi_watcher ( + self._namespace.ExecNotificationQuery (wql), + is_extrinsic=is_extrinsic, + fields=fields + ) + except pywintypes.com_error: + handle_com_error () + + def __getattr__ (self, attribute): + """Offer WMI classes as simple attributes. Pass through any untrapped + unattribute to the underlying OLE object. This means that new or + unmapped functionality is still available to the module user. + """ + # + # Don't try to match against known classes as was previously + # done since the list may not have been requested + # (find_classes=False). + # + try: + return self._cached_classes (attribute) + except pywintypes.com_error: + return getattr (self._namespace, attribute) + + def _cached_classes (self, class_name): + """Standard caching helper which keeps track of classes + already retrieved by name and returns the existing object + if found. If this is the first retrieval, store it and + pass it back + """ + if class_name not in self._classes_map: + self._classes_map[class_name] = _wmi_class (self, self._namespace.Get (class_name)) + return self._classes_map[class_name] + + def _getAttributeNames (self): + """Return list of classes for IPython completion engine""" + return [x for x in self.classes if not x.startswith ('__')] + +# +# class _wmi_watcher +# +class _wmi_watcher: + """Helper class for WMI.watch_for below (qv)""" + + _event_property_map = { + "TargetInstance" : _wmi_object, + "PreviousInstance" : _wmi_object + } + def __init__ (self, wmi_event, is_extrinsic, fields=[]): + self.wmi_event = wmi_event + self.is_extrinsic = is_extrinsic + self.fields = fields + + def __call__ (self, timeout_ms=-1): + """When called, return the instance which caused the event. Supports + timeout in milliseconds (defaulting to infinite). If the watcher + times out, :exc:`x_wmi_timed_out` is raised. This makes it easy to support + watching for multiple objects. + """ + try: + event = self.wmi_event.NextEvent (timeout_ms) + if self.is_extrinsic: + return _wmi_event (event, None, self.fields) + else: + return _wmi_event ( + event.Properties_ ("TargetInstance").Value, + _wmi_object (event, property_map=self._event_property_map), + self.fields + ) + except pywintypes.com_error: + handle_com_error () + +PROTOCOL = "winmgmts:" +def connect ( + computer="", + impersonation_level="", + authentication_level="", + authority="", + privileges="", + moniker="", + wmi=None, + namespace="", + suffix="", + user="", + password="", + find_classes=False, + debug=False +): + """The WMI constructor can either take a ready-made moniker or as many + parts of one as are necessary. Eg:: + + c = wmi.WMI (moniker="winmgmts:{impersonationLevel=Delegate}//remote") + # or + c = wmi.WMI (computer="remote", privileges=["!RemoteShutdown", "Security"]) + + I daren't link to a Microsoft URL; they change so often. Try Googling for + WMI construct moniker and see what it comes back with. + + For complete control, a named argument "wmi" can be supplied, which + should be a SWbemServices object, which you create yourself. Eg:: + + loc = win32com.client.Dispatch("WbemScripting.SWbemLocator") + svc = loc.ConnectServer(...) + c = wmi.WMI(wmi=svc) + + This is the only way of connecting to a remote computer with a different + username, as the moniker syntax does not allow specification of a user + name. + + If the `wmi` parameter is supplied, all other parameters are ignored. + """ + global _DEBUG + _DEBUG = debug + + try: + try: + if wmi: + obj = wmi + + elif moniker: + if not moniker.startswith (PROTOCOL): + moniker = PROTOCOL + moniker + obj = GetObject (moniker) + + else: + if user: + if privileges or suffix: + raise x_wmi_authentication ("You can't specify privileges or a suffix as well as a username") + elif computer in (None, '', '.'): + raise x_wmi_authentication ("You can only specify user/password for a remote connection") + else: + obj = connect_server ( + server=computer, + namespace=namespace, + user=user, + password=password, + authority=authority, + impersonation_level=impersonation_level, + authentication_level=authentication_level + ) + + else: + moniker = construct_moniker ( + computer=computer, + impersonation_level=impersonation_level, + authentication_level=authentication_level, + authority=authority, + privileges=privileges, + namespace=namespace, + suffix=suffix + ) + obj = GetObject (moniker) + + wmi_type = get_wmi_type (obj) + + if wmi_type == "namespace": + return _wmi_namespace (obj, find_classes) + elif wmi_type == "class": + return _wmi_class (None, obj) + elif wmi_type == "instance": + return _wmi_object (obj) + else: + raise x_wmi ("Unknown moniker type") + + except pywintypes.com_error: + handle_com_error () + + except x_wmi_uninitialised_thread: + raise x_wmi_uninitialised_thread ("WMI returned a syntax error: you're probably running inside a thread without first calling pythoncom.CoInitialize[Ex]") + +WMI = connect + +def construct_moniker ( + computer=None, + impersonation_level=None, + authentication_level=None, + authority=None, + privileges=None, + namespace=None, + suffix=None +): + security = [] + if impersonation_level: security.append ("impersonationLevel=%s" % impersonation_level) + if authentication_level: security.append ("authenticationLevel=%s" % authentication_level) + # + # Use of the authority descriptor is invalid on the local machine + # + if authority and computer: security.append ("authority=%s" % authority) + if privileges: security.append ("(%s)" % ", ".join (privileges)) + + moniker = [PROTOCOL] + if security: moniker.append ("{%s}!" % ",".join (security)) + if computer: moniker.append ("//%s/" % computer) + if namespace: + parts = re.split (r"[/\\]", namespace) + if parts[0] != 'root': + parts.insert (0, "root") + moniker.append ("/".join (parts)) + if suffix: moniker.append (":%s" % suffix) + return "".join (moniker) + +def get_wmi_type (obj): + try: + path = obj.Path_ + except AttributeError: + return "namespace" + else: + if path.IsClass: + return "class" + else: + return "instance" + +def connect_server ( + server, + namespace = "", + user = "", + password = "", + locale = "", + authority = "", + impersonation_level="", + authentication_level="", + security_flags = 0x80, + named_value_set = None +): + """Return a remote server running WMI + + :param server: name of the server + :param namespace: namespace to connect to - defaults to whatever's defined as default + :param user: username to connect as, either local or domain (dom\\name or user@domain for XP) + :param password: leave blank to use current context + :param locale: desired locale in form MS_XXXX (eg MS_409 for Am En) + :param authority: either "Kerberos:" or an NT domain. Not needed if included in user + :param impersonation_level: valid WMI impersonation level + :param security_flags: if 0, connect will wait forever; if 0x80, connect will timeout at 2 mins + :param named_value_set: typically empty, otherwise a context-specific `SWbemNamedValueSet` + + Example:: + + remote_connetion = wmi.connect_server ( + server="remote_machine", user="myname", password="mypassword" + ) + c = wmi.WMI (wmi=remote_connection) + """ + # + # Thanks to Matt Mercer for example code to set + # impersonation & authentication on ConnectServer + # + if impersonation_level: + try: + impersonation = getattr (obj._constants, "wbemImpersonationLevel%s" % impersonation_level.title ()) + except AttributeError: + raise x_wmi_authentication ("No such impersonation level: %s" % impersonation_level) + else: + impersonation = None + + if authentication_level: + try: + authentication = getattr (obj._constants, "wbemAuthenticationLevel%s" % authentication_level.title ()) + except AttributeError: + raise x_wmi_authentication ("No such impersonation level: %s" % impersonation_level) + else: + authentication = None + + server = Dispatch ("WbemScripting.SWbemLocator").\ + ConnectServer ( + server, + namespace, + user, + password, + locale, + authority, + security_flags, + named_value_set + ) + if impersonation: + server.Security_.ImpersonationLevel = impersonation + if authentication: + server.Security_.AuthenticationLevel = authentication + return server + +def Registry ( + computer=None, + impersonation_level="Impersonate", + authentication_level="Default", + authority=None, + privileges=None, + moniker=None +): + + warnings.warn ("This function can be implemented using wmi.WMI (namespace='DEFAULT').StdRegProv", DeprecationWarning) + if not moniker: + moniker = construct_moniker ( + computer=computer, + impersonation_level=impersonation_level, + authentication_level=authentication_level, + authority=authority, + privileges=privileges, + namespace="default", + suffix="StdRegProv" + ) + + try: + return _wmi_object (GetObject (moniker)) + + except pywintypes.com_error: + handle_com_error () + +# +# Typical use test +# +if __name__ == '__main__': + system = WMI () + for my_computer in system.Win32_ComputerSystem (): + print ("Disks on", my_computer.Name) + for disk in system.Win32_LogicalDisk (): + print (disk.Caption, disk.Description, disk.ProviderName or "") + diff --git a/WPy32-3720/python-3.7.2/Scripts/__pycache__/wmiweb.cpython-37.pyc b/WPy32-3720/python-3.7.2/Scripts/__pycache__/wmiweb.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7737255cbbd2e6b145b530770b0d70f22ce3c6d7 GIT binary patch literal 6912 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 SOx>I?G}Ev!zKU6dEdL)N3VN9U literal 0 HcmV?d00001 diff --git a/WPy32-3720/python-3.7.2/Scripts/wmitest.cmd b/WPy32-3720/python-3.7.2/Scripts/wmitest.cmd new file mode 100644 index 00000000..a6537b6a --- /dev/null +++ b/WPy32-3720/python-3.7.2/Scripts/wmitest.cmd @@ -0,0 +1,3 @@ +@echo off +for /l %%n in (24,1,31) do if exist c:\python%%n\python.exe (echo. & echo python%%n & c:\python%%n\python.exe -W ignore wmitest.py) +pause diff --git a/WPy32-3720/python-3.7.2/Scripts/wmitest.master.ini b/WPy32-3720/python-3.7.2/Scripts/wmitest.master.ini new file mode 100644 index 00000000..cff2740b --- /dev/null +++ b/WPy32-3720/python-3.7.2/Scripts/wmitest.master.ini @@ -0,0 +1,5 @@ +[settings] +; domain= +; machine= +; user= +; password= diff --git a/WPy32-3720/python-3.7.2/Scripts/wmitest.py b/WPy32-3720/python-3.7.2/Scripts/wmitest.py new file mode 100644 index 00000000..490029d1 --- /dev/null +++ b/WPy32-3720/python-3.7.2/Scripts/wmitest.py @@ -0,0 +1,714 @@ +"""Unit tests for WMI modules + +Some tests are optional, since they rely on remote machines and +usernames / passwords. To enable these, copy wmitest.master.ini +to wmitest.ini and set the parameters you have available. + +The watcher tests spawn temporary processes and temporary +logical drives. These may get left behind. +""" + +# +# TODO: +# - Test for negative timezone +# - Test for share name with embedded single quote +# + +import os, sys +import datetime +try: + import ConfigParser +except ImportError: + import configparser as ConfigParser +import operator +try: + import Queue +except ImportError: + import queue as Queue +try: + next +except NameError: + def next (iterator): return iterator.next () +import subprocess +import tempfile +import threading +import time +import unittest +import warnings + +import pythoncom +import win32api +import win32con +import win32file + +import wmi + +ini = ConfigParser.SafeConfigParser () +ini.read (["wmitest.master.ini", "wmitest.ini"]) +settings = {} +if ini.has_section ("settings"): + settings.update (ini.items ("settings")) +excludes = [i.strip () for i in settings.get ("excludes", "").split (",")] + +COMPUTERS = [None, "."] +if "machine" in settings: + COMPUTERS.append (settings['machine']) +IMPERSONATION_LEVELS = [None, "identify", "impersonate", "delegate"] +AUTHENTICATION_LEVELS = [None, "default", "none", "connect", "call", "pkt", "pktintegrity", "pktprivacy"] +AUTHORITIES = [None] +if set (["domain", "machine"]) <= set (settings): + #~ AUTHORITIES.append ("kerberos:%s" % settings['domain']) + AUTHORITIES.append ("ntlmdomain:%s" % settings['domain']) +PRIVILEGES = [None, ['security', '!shutdown']] +NAMESPACES = [None, "root/cimv2", "default"] + +class TestBasicConnections (unittest.TestCase): + + def test_basic_connection (self): + "Check that a standard connection works" + self.assert_ (wmi.WMI ()) + + def test_remote_connection (self): + "Check that a remote connection works, if specified" + if "machine" in settings: + self.assert_ (wmi.WMI (settings['machine'])) + else: + warnings.warn ("Skipping test_remote_connection") + + def test_simple_moniker (self): + "Check that a simple moniker works" + self.assert_ (wmi.WMI (moniker="winmgmts:")) + + def test_moniker_with_class (self): + "Check that specifying a class in moniker works" + c0 = wmi.WMI ().Win32_ComputerSystem + c1 = wmi.WMI (moniker="winmgmts:Win32_ComputerSystem") + self.assert_ (c0 == c1) + + def test_moniker_with_instance (self): + "Check that specifying an instance in the moniker works" + for c0 in wmi.WMI ().Win32_ComputerSystem (): + break + c1 = wmi.WMI (moniker='winmgmts:Win32_ComputerSystem.Name="%s"' % c0.Name) + self.assert_ (c0 == c1) + + def test_impersonation_levels (self): + "Check that specifying an impersonation level works" + for impersonation in IMPERSONATION_LEVELS: + self.assert_ (wmi.WMI (impersonation_level=impersonation)) + + def test_authentication_levels (self): + "Check that specifying an authentication level works" + for authentication in AUTHENTICATION_LEVELS: + try: + c = wmi.WMI (authentication_level=authentication) + except wmi.x_access_denied: + warnings.warn ("Access denied for authentication level %s" % authentication) + else: + self.assert_ (c) + + def test_authority (self): + "Check that specifying an authority works" + for authority in AUTHORITIES: + self.assert_ (wmi.WMI (authority=authority)) + + def test_privileges (self): + "Check that specifying privileges works" + for privileges in PRIVILEGES: + self.assert_ (wmi.WMI (privileges=privileges)) + + def test_namespace (self): + "Check that specifying a namespace works" + for namespace in NAMESPACES: + self.assert_ (wmi.WMI (namespace=namespace)) + + def test_suffix (self): + "Check that a suffix returns the class of that name" + self.assert_ (wmi.WMI (namespace="DEFAULT", suffix="StdRegProv") == wmi.WMI (namespace="DEFAULT").StdRegProv) + + def test_user_password (self): + "Check that username & password are passed through for a remote connection" + if set (["machine", "user", "password"]) <= set (settings): + self.assert_ (wmi.WMI (computer=settings['machine'], user=settings['user'], password=settings['password'])) + else: + warnings.warn ("Skipping test_user_password because no machine, user or password") + + def test_too_much_authentication (self): + "Check that user/password plus privs / suffix raises exception" + self.assertRaises (wmi.x_wmi_authentication, wmi.WMI, computer='***', user="***", password="***", privileges=["***"]) + self.assertRaises (wmi.x_wmi_authentication, wmi.WMI, computer='***', user="***", password="***", suffix="***") + + def test_user_password_with_impersonation_level (self): + "Check that an impersonation level works with a username / password" + if not (set (["machine", "user", "password"]) <= set (settings)): + warnings.warn ("Skipping test_user_password_with_impersonation_level because no machine, user or password") + else: + self.assert_ ( + wmi.WMI ( + computer=settings['machine'], + user=settings['user'], + password=settings['password'], + impersonation_level="impersonate" + ) + ) + + def test_user_password_with_invalid_impersonation_level (self): + "Check that an impersonation level works with a username / password" + if not (set (["machine", "user", "password"]) <= set (settings)): + warnings.warn ("Skipping test_user_password_with_invalid_impersonation_level because no machine, user or password") + else: + self.assertRaises ( + wmi.x_wmi_authentication, + wmi.WMI, + computer=settings['machine'], + user=settings['user'], + password=settings['password'], + impersonation_level="***" + ) + + def test_user_password_with_authentication_level (self): + "Check that an invalid impersonation level raises x_wmi_authentication" + if not (set (["machine", "user", "password"]) <= set (settings)): + warnings.warn ("Skipping test_user_password_with_authentication_level because no machine, user or password") + else: + self.assert_ ( + wmi.WMI ( + computer=settings['machine'], + user=settings['user'], + password=settings['password'], + authentication_level="pktIntegrity" + ) + ) + + def test_user_password_with_invalid_authentication_level (self): + "Check that an invalid authentication level raises x_wmi_authentication" + if not (set (["machine", "user", "password"]) <= set (settings)): + warnings.warn ("Skipping test_user_password_with_invalid_authentication_level because no machine, user or password") + else: + self.assertRaises ( + wmi.x_wmi_authentication, + wmi.WMI, + computer=settings['machine'], + user=settings['user'], + password=settings['password'], + authentication_level="***" + ) + + def test_local_user_password (self): + "Check that user/password for local connection raises exception" + self.assertRaises (wmi.x_wmi_authentication, wmi.WMI, user="***", password="***") + + def test_find_classes (self): + "Check ability to switch class scan on and off" + self.assert_ (wmi.WMI (find_classes=True)._classes) + self.assertFalse (wmi.WMI (find_classes=False)._classes) + + def test_find_classes_false (self): + "By default, don't scan for classes but load them on demand" + self.assertFalse (wmi.WMI ()._classes) + self.assert_ (wmi.WMI ().classes) + + def test_classes_acts_as_list (self): + self.assert_ (wmi.WMI ().classes.index) + + def test_classes_acts_as_dict (self): + self.assert_ (wmi.WMI ().classes.keys) + +class TestThreadedConnection (unittest.TestCase): + + + def test_initialised_thread (self): + """A WMI connection in a thread which has been initialised for COM + should succeed. + """ + def f (q): + pythoncom.CoInitialize () + try: + try: + wmi.WMI () + except: + q.put (False) + else: + q.put (True) + finally: + pythoncom.CoUninitialize () + + q = Queue.Queue () + threading.Thread (target=f, args=(q,)).start () + self.assert_ (q.get ()) + + def test_uninitialised_thread (self): + """A WMI connection in a thread which has not been initialised + for COM should fail with a wmi-specific exception. + """ + def f (q): + try: + wmi.WMI () + except wmi.x_wmi_uninitialised_thread: + q.put (True) + except: + q.put (False) + else: + q.put (False) + + q = Queue.Queue () + threading.Thread (target=f, args=(q,)).start () + self.assert_ (q.get ()) + +class TestMoniker (unittest.TestCase): + + def test_moniker (self): + """Look at all possible options for moniker construction and pass + them through to a WMI connector + """ + for computer in COMPUTERS: + if computer in (None, "."): + local_authorities = [None] + else: + local_authorities = AUTHORITIES + for impersonation_level in IMPERSONATION_LEVELS: + for authentication_level in AUTHENTICATION_LEVELS: + for authority in local_authorities: + for privileges in PRIVILEGES: + for namespace in NAMESPACES: + moniker = wmi.construct_moniker ( + computer=computer, + impersonation_level=impersonation_level, + authority=authority, + privileges=privileges, + namespace=namespace + ) + self.assert_ (wmi.WMI (moniker=moniker), "Moniker failed: %s" % moniker) + + def test_moniker_root_namespace (self): + "Check that namespace is prefixed by root if needed" + self.assertEquals (wmi.construct_moniker (namespace="default"), "winmgmts:root/default") + self.assertEquals (wmi.construct_moniker (namespace="root/default"), "winmgmts:root/default") + +class TestFunctions (unittest.TestCase): + + times = [ + ((2000, 1, 1), "20000101******.******+***"), + ((2000, 1, 1, 10, 0, 0), "20000101100000.******+***"), + ((2000, 1, 1, 10, 0, 0, 100), "20000101100000.000100+***"), + ((2000, 1, 1, 10, 0, 0, 100, "GMT"), "20000101100000.000100+GMT") + ] + + def test_signed_to_unsigned (self): + tests = [ + (0, 0), + (-1, 0xffffffff), + (+1, 1), + (0x7fffffff, 0x7fffffff), + (-0x7fffffff, 0x80000001) + ] + for signed, unsigned in tests: + self.assertEquals (wmi.signed_to_unsigned (signed), unsigned) + + def test_from_1601 (self): + "Check conversion from 100-ns intervals since 1601 (!)" + self.assertEquals (wmi.from_1601 (0), datetime.datetime (1601, 1, 1)) + self.assertEquals (wmi.from_1601 (24 * 60 * 60 * 10 * 1000 * 1000), datetime.datetime (1601, 1, 2)) + + def test_from_time (self): + "Check conversion from time-tuple to time-string" + for t, s in self.times: + self.assertEquals (wmi.from_time (*t), s) + + def test_to_time (self): + "Check conversion from time-string to time-tuple" + for t, s in self.times: + t = tuple (list (t) + ([None] * 8))[:8] + self.assertEquals (wmi.to_time (s), t) + + def test_get_wmi_type (self): + "Check that namespace, class & instance are identified correctly" + self.assertEquals (wmi.get_wmi_type (wmi.WMI ()), "namespace") + self.assertEquals (wmi.get_wmi_type (wmi.WMI ().Win32_ComputerSystem), "class") + for i in wmi.WMI ().Win32_ComputerSystem (): + self.assertEquals (wmi.get_wmi_type (i), "instance") + + def test_registry (self): + """Convenience Registry function is identical to picking + the StdRegProv class out of the DEFAULT namespace""" + self.assertEquals (wmi.Registry (), wmi.WMI (namespace="DEFAULT").StdRegProv) + +class TestWMI (unittest.TestCase): + + def setUp (self): + self.connection = wmi.WMI (namespace="root/cimv2", find_classes=False) + self.logical_disks = set (self.connection.Win32_LogicalDisk ()) + +class TestNamespace (TestWMI): + + def test_subclasses_of_simple (self): + self.assert_ ("Win32_ComputerSystem" in self.connection.subclasses_of ()) + + def test_subclasses_of_subtree (self): + self.assert_ ("Win32_Desktop" in self.connection.subclasses_of ("CIM_Setting")) + + def test_subclasses_of_pattern (self): + self.assert_ (set (["Win32_LogicalDisk", "Win32_MappedLogicalDisk"]) <= set (self.connection.subclasses_of ("CIM_LogicalDevice", "Win32_.*Disk"))) + + def test_instances (self): + self.assertEquals (self.logical_disks, set (self.connection.instances ("Win32_LogicalDisk"))) + + def test_new (self): + "Check this is an alias for the new method of the equivalent class" + self.assertEquals (self.connection.new ("Win32_Process")._instance_of, self.connection.Win32_Process) + + def test_query (self): + self.assertEquals (self.logical_disks, set (self.connection.query ("SELECT * FROM Win32_LogicalDisk"))) + + def test_ipython_attributes_with_find_classes (self): + connection = wmi.WMI (find_classes=True) + self.assertEquals (sorted (connection._getAttributeNames ()), sorted (i for i in connection.classes if not i.startswith ("__"))) + + def test_getattr (self): + "Check that WMI classes are returned by attribute access on their namespace" + connection = wmi.WMI (find_classes=True) + for c in list (connection.classes)[:5]: + wmi_class = getattr (connection, c) + self.assert_ (isinstance (wmi_class, wmi._wmi_class)) + self.assertEquals (wmi_class._class_name, c) + + def test_watch_for (self): + """Check that the watch_for method returns a watcher. The watcher itself + will be tested elsewhere. + """ + watcher = self.connection.watch_for ( + wmi_class="Win32_Process" + ) + self.assert_ (isinstance (watcher, wmi._wmi_watcher)) + +class TestClass (TestWMI): + + def test_class_from_namespace (self): + self.assert_ (self.connection.Win32_ComputerSystem._namespace is self.connection) + + def test_class_without_namespace (self): + wmi_class = wmi.GetObject ("winmgmts:Win32_ComputerSystem") + self.assert_ (wmi._wmi_class (None, wmi_class)._namespace) + + def test_query (self): + self.assertEquals ( + set (self.connection.Win32_ComputerSystem.query ()), + set (self.connection.query ("SELECT * FROM Win32_ComputerSystem")) + ) + + def test_query_with_where (self): + this_drive = os.getcwd ()[:2] + for drive in self.connection.Win32_LogicalDisk (Name=this_drive): + self.assertEquals (drive.Name, this_drive) + + def test_query_with_fields (self): + this_drive = os.getcwd ()[:2] + properties = set (["MediaType"]) + self.assert_ ("Name" not in properties) + for drive in self.connection.Win32_LogicalDisk (properties, Name=this_drive): + self.assertEquals (set (drive.properties), set (properties)) + self.assert_ (drive.MediaType) + self.assertRaises (AttributeError, getattr, drive, "Name") + + def test_watch_for (self): + """Check that the watch_for method returns a watcher. The watcher itself + will be tested elsewhere. + """ + watcher = self.connection.Win32_Process.watch_for () + self.assert_ (isinstance (watcher, wmi._wmi_watcher)) + + def test_instances (self): + self.assertEquals ( + set (self.connection.Win32_LogicalDisk ()), + set (self.connection.Win32_LogicalDisk.instances ()) + ) + + def test_new (self): + process = self.connection.Win32_Process.new () + self.assertEquals (wmi.get_wmi_type (process), "instance") + self.assertEquals (process._instance_of, self.connection.Win32_process) + + +class TestWatcher (TestWMI): + + def new_letter (self): + return \ + set ("%s:" % chr (i) for i in range (ord ('A'), 1 + ord ('Z'))).\ + difference (d.DeviceID for d in self.connection.Win32_LogicalDisk ()).\ + pop () + + @staticmethod + def create (new_letter): + print "about to create drive with letter", new_letter + here = os.path.dirname (os.path.abspath (__file__)) + win32file.DefineDosDevice (0, new_letter, here) + try: + # + # This sleep is needed for the WMI pollster to react + # + time.sleep (2) + finally: + win32file.DefineDosDevice (2, new_letter, here) + + def test_creation (self): + try: + new_letter = self.new_letter () + except KeyError: + warnings.warn ("Unable to find a spare drive letter to map.") + return + + watcher = self.connection.Win32_LogicalDisk.watch_for ( + notification_type="Creation", + DeviceID=new_letter + ) + t = threading.Timer (2, self.create, (new_letter,)) + t.start () + found_disk = watcher (timeout_ms=20000) + self.assert_ (isinstance (found_disk, wmi._wmi_object)) + self.assertEqual (found_disk.Caption, new_letter) + t.join () + + def test_event_with_no_params (self): + try: + new_letter = self.new_letter () + except KeyError: + warnings.warn ("Unable to find a spare drive letter to map.") + return + + watcher = self.connection.Win32_LogicalDisk.watch_for () + t = threading.Timer (2, self.create, (new_letter,)) + t.start () + found_disk = watcher (timeout_ms=20000) + self.assert_ (isinstance (found_disk, wmi._wmi_object)) + self.assertEqual (found_disk.Caption, new_letter) + t.join () + + def test_valid_notification_types (self): + for notification_type in ['operation', 'modification', 'creation', 'deletion']: + self.assert_ (self.connection.Win32_LogicalDisk.watch_for (notification_type=notification_type)) + + def test_invalid_notification_types (self): + self.assertRaises (wmi.x_wmi, self.connection.Win32_LogicalDisk.watch_for, notification_type="***") + + + def do_not_test_extrinsic_event (self): + + # + # This doesn't seem implementable at the moment + # as a test. I can't find a reproducible extrinsic + # event except for Win32_DeviceChangeEvent and that + # one would require someone to, eg, plug in / unplug + # a USB stick. + # + # It looks as though Win32_ProcessStartTrace should work + # and it does on my laptop; just not on my desktop. + # + + def _create (queue): + queue.put (subprocess.Popen ([sys.executable, "-c", "import time; time.sleep (10)"])) + + watcher = self.connection.Win32_ProcessStartTrace.watch_for ( + fields=["*"]##, + #~ ProcessName=os.path.basename (sys.executable) + ) + q = Queue.Queue () + t = threading.Timer (2, _create, (q,)) + try: + t.start () + found_process = watcher (timeout_ms=20000) + spawned_process = q.get_nowait () + self.assert_ (isinstance (found_process, wmi._wmi_event)) + self.assertEqual (int (found_process.ProcessID), spawned_process.pid) + finally: + t.cancel () + +class TestMethods (TestWMI): + + def test_exists (self): + "Check that a well-known method is available by attribute" + self.assert_ (self.connection.Win32_Process.Create) + + def test_params (self): + "Check that the names and arrayness of params are picked up when not arrays" + self.assertEquals ( + [(n, False) for n in ["CommandLine", "CurrentDirectory", "ProcessStartupInformation"]], + self.connection.Win32_Process.Create.in_parameter_names + ) + self.assertEquals ( + [("ProcessId", False), ("ReturnValue", False)], + self.connection.Win32_Process.Create.out_parameter_names + ) + + def test_positional_params (self): + dir = tempfile.mkdtemp () + filename = "abc.txt" + contents = str (datetime.datetime.now ()) + handle, result = self.connection.Win32_Process.Create ( + "cmd /c echo %s > %s" % (contents, filename), + dir, + self.connection.Win32_ProcessStartup.new (ShowWindow=0) + ) + time.sleep (0.5) + self.assertEqual (open (os.path.join (dir, filename)).read (), contents + " \n") + + def test_named_params (self): + dir = tempfile.mkdtemp () + filename = "abc.txt" + contents = str (datetime.datetime.now ()) + handle, result = self.connection.Win32_Process.Create ( + ProcessStartupInformation=self.connection.Win32_ProcessStartup.new (ShowWindow=0), + CurrentDirectory=dir, + CommandLine="cmd /c echo %s > %s" % (contents, filename) + ) + time.sleep (0.5) + self.assertEqual (open (os.path.join (dir, filename)).read (), contents + " \n") + + def test_in_params_with_array (self): + "Check that the names and arrayness of params are picked up when arrays" + self.assertEquals ( + [("DNSServerSearchOrder", True)], + self.connection.Win32_NetworkAdapterConfiguration.SetDNSServerSearchOrder.in_parameter_names + ) + + def test_instance_methods_are_distinct (self): + """Check that the methods of difference instances of a class are distinct. + This caused a problem when calling .Terminate on one process killed another. + """ + methods = [d.Reset for d in self.logical_disks] + for i in range (len (methods)-1): + self.assertNotEqual (methods[i], methods[i+1]) + + def test_call_from_class (self): + "Check that a method can be called from a class" + self.assert_ (self.connection.Win32_Process.Create ( + CommandLine=sys.executable + " -c pass", + ProcessStartupInformation=self.connection.Win32_ProcessStartup.new (ShowWindow=0) + )) + + def test_call_from_instance (self): + "Check that a method can be called from an instance" + handle, _ = self.connection.Win32_Process.Create ( + CommandLine=sys.executable, + ProcessStartupInformation=self.connection.Win32_ProcessStartup.new (ShowWindow=0) + ) + result = 1 + for p in self.connection.Win32_Process (Handle=handle): + result, = p.Terminate () + self.assertEqual (result, 0) + +class TestProperties (TestWMI): + + def test_access (self): + "Check that all properties are available as attributes" + for d in self.logical_disks: + break + for p in d.ole_object.Properties_: + self.assertEqual (p.Value, getattr (d, p.Name)) + + def test_attribute_passthrough (self): + "Check that unknown attributes are passed through to the underlying object" + for d in self.logical_disks: + break + # + # Can't rely on the COM Objects testing identical or equal; + # have to check their values and their emptiness. + # + self.assert_ (d.Properties_) + self.assert_ (d.ole_object.Properties_) + self.assertEqual ( + [p.Value for p in d.Properties_], + [p.Value for p in d.ole_object.Properties_] + ) + + def test_settable (self): + "Check that a writeable property can be written" + name = str (time.time ()).split (".")[0] + old_value = "***" + new_value = "!!!" + username = win32api.GetUserNameEx (win32con.NameSamCompatible) + self.assert_ (not self.connection.Win32_Environment (Name=name, UserName=username)) + self.connection.Win32_Environment.new (Name=name, UserName=username, VariableValue=old_value).put () + for envvar in self.connection.Win32_Environment (Name=name, UserName=username): + self.assertEqual (envvar.VariableValue, old_value) + envvar.VariableValue = new_value + try: + for envvar in self.connection.Win32_Environment (Name=name, UserName=username): + self.assertEqual (envvar.VariableValue, new_value) + finally: + for envvar in self.connection.Win32_Environment (Name=name, UserName=username): + envvar.VariableValue = None + +class TestInstances (TestWMI): + + def test_hashable (self): + "Ensure instances are hashable so can be used in a set/dict" + self.assert_ (dict.fromkeys (self.logical_disks)) + + def test_equalable (self): + "Ensure instances compare equal" + self.assertEqual (self.logical_disks, self.logical_disks) + + def test_sortable (self): + "Ensure instances sort by full path/key" + self.assertEqual ( + sorted (self.logical_disks), + sorted (self.logical_disks, key=operator.attrgetter ("DeviceID")) + ) + + def test_references (self): + "Ensure that associations are special-cased to return wrapped objects" + for d in self.logical_disks: + break + for r in d.references ("Win32_LogicalDiskRootDirectory"): + self.assert_ (r.is_association) + self.assertEqual (r.GroupComponent, d) + self.assert_ (isinstance (r.GroupComponent, wmi._wmi_object)) + self.assert_ (isinstance (r.PartComponent, wmi._wmi_object)) + + def test_associators (self): + "Ensure that associators are returned by association / result" + for d in self.logical_disks: + if d.DeviceID == os.path.abspath (__file__)[:2]: + break + else: + raise RuntimeError ("Unable to find the logical drive corresponding to this file") + root_dir = d.associators (wmi_association_class="Win32_LogicalDiskRootDirectory")[0] + self.assertEqual (root_dir.Name.lower (), d.Name.lower () + "\\".lower ()) + root_dir = d.associators (wmi_result_class="Win32_Directory")[0] + self.assertEqual (root_dir.Name.lower (), d.Name.lower () + "\\") + + def test_derivation (self): + "Check that derivation mimics WMI-provided Derivation_ property" + for d in self.logical_disks: + break + self.assertEqual (d.derivation (), d.ole_object.Derivation_) + + def test_keys (self): + "Check that the readonly keys property returns the keys for an object" + self.assertEqual (self.connection.Win32_LogicalDisk.keys, ['DeviceID']) + self.assertEqual (next (iter (self.logical_disks)).keys, ['DeviceID']) + +class TestInstanceCreation (TestWMI): + + def test_create_instance (self): + self.assert_ (isinstance (self.connection.Win32_ProcessStartup.new (ShowWindow=2), wmi._wmi_object)) + +class TestAssociations (TestWMI): + + def test_all_properties_available (self): + # + # An association can contain not only the associated + # classes but also extra information as well. Ensure + # that both types of data are correctly handled. + # + for q in self.connection.Win32_DiskQuota (): + for p in q.properties: + try: + getattr (q, p) + except wmi.x_wmi: + assert False, "Error getting %s from %s" % (p, q) + else: + assert True + +if __name__ == '__main__': + unittest.main () diff --git a/WPy32-3720/python-3.7.2/Scripts/wmiweb.py b/WPy32-3720/python-3.7.2/Scripts/wmiweb.py new file mode 100644 index 00000000..d23e60ab --- /dev/null +++ b/WPy32-3720/python-3.7.2/Scripts/wmiweb.py @@ -0,0 +1,239 @@ +from cgi import escape +import threading +try: + from urllib import quote +except ImportError: + from urllib.parse import quote +from wsgiref.simple_server import make_server +from wsgiref.util import request_uri, application_uri, shift_path_info + +import wmi + +try: + unicode +except NameError: + unicode = str + +doc = [] + +def link (text, computer, namespace=None, wmi_class=None): + link = '' + escape (text) + '' + +def start_doc (title): + doc[:] = [] + doc.append (""" + + + %(title)s + + + + """ % locals ()) + +def finish_doc (): + doc.append (""" + + + """ % locals ()) + +def doc_table (items, n_cols=3): + n_rows, n_spare_cols = divmod (len (items), n_cols) + doc.append ('') + + for n_row in range (n_rows): + doc.append ("") + for n_col in range (n_cols): + doc.append ("" % items[n_cols * n_col + n_row]) + doc.append ("") + + if n_spare_cols: + doc.append ("") + for n_col in reversed (range (n_spare_cols)): + doc.append ("" % items[len (items) - 1 - n_col]) + doc.append ("") + + doc.append ("
  • %s
  • %s
  • ") + +def doc_breadcrumbs (computer, namespace, wmi_class=None): + doc.append ('') + +def doc_wmi_class (computer, namespace, wmi_class, wmi_connection): + start_doc ("WMI: Class %(wmi_class)s in namespace %(namespace)s on %(computer)s" % locals ()) + doc_breadcrumbs (computer, namespace, wmi_class) + doc.append ("

    %(wmi_class)s

    " % locals ()) + klass = getattr (wmi_connection, wmi_class) + + doc.append ("
    ") + doc.append ("

    Ancestors

    ") + ancestors = klass.derivation () + if ancestors: + doc.append (" : ".join (link (ancestor, computer, namespace, ancestor) for ancestor in reversed (ancestors))) + else: + doc.append ("

    No ancestors

    ") + + doc.append ("
    ") + doc.append ("

    Children

    ") + children = sorted (c.Path_.Class for c in klass._namespace.SubclassesOf (wmi_class)) + if children: + doc.append ('
      ') + for child in children: + doc.append ('
    • %s
    • ' % link (child, computer, namespace, child)) + doc.append ('
    ') + else: + doc.append ('

    No children

    ') + + doc.append ("
    ") + doc.append ("

    Associated classes

    ") + associations = sorted (klass.associated_classes) + if associations: + doc.append ("
      ") + for association in associations: + doc.append ('
    • %s
    • ' % link (association, computer, namespace, association)) + doc.append ("
    ") + else: + doc.append ("

    No associated classes

    ") + + doc.append ("
    ") + doc.append ("

    Properties

    ") + properties = sorted (klass._properties) + n_properties = len (properties) + if n_properties == 0: + doc.append ("

    No properties

    ") + if 1 <= n_properties <= 10: + doc_table (properties, 1) + elif 10 < n_properties <= 20: + doc_table (properties, 2) + elif 20 < n_properties <= 30: + doc_table (properties, 3) + else: + doc_table (properties, 4) + + doc.append ("
    ") + doc.append ("

    Keys

    ") + keys = sorted (klass.keys) + if keys: + doc.append ("
      ") + for key in keys: + doc.append ("
    • %s
    • " % key) + doc.append ("
    ") + else: + doc.append ("

    No keys

    ") + + doc.append ("
    ") + doc.append ("

    Methods

    ") + methods = sorted (klass._methods) + if methods: + doc.append ("
      ") + for m in methods: + doc.append ('
    • %s
      %s
    • ' % (m, escape (str (getattr (klass, m))))) + doc.append ("
    ") + else: + doc.append ("

    No methods

    ") + + doc.append ("
    ") + doc.append ("

    Qualifiers

    ") + qualifiers = sorted (klass.qualifiers.items ()) + if qualifiers: + doc.append ("
      ") + for q in qualifiers: + doc.append ("
    • %s: %s
    • " % q) + doc.append ("
    ") + else: + doc.append ("

    No qualifiers

    ") + + finish_doc () + +def doc_namespace (computer, namespace, wmi_connection): + start_doc ("WMI: Namespace %(namespace)s on %(computer)s" % locals ()) + doc_breadcrumbs (computer, namespace) + + namespaces = namespace.split ("\\") + namespace_links = [] + for i, n in enumerate (namespaces): + namespace_links.append (link (n, computer, "\\".join (namespaces[:i+1]))) + doc.append ("

    %s

    " % "\\".join (namespace_links)) + + doc.append ("
    ") + subnamespaces = sorted (wmi_connection.__NAMESPACE ()) + doc.append ("

    Namespaces:

    ") + if subnamespaces: + doc.append ("
      ") + for subnamespace in subnamespaces: + name = subnamespace.Name + doc.append ('
    • %s
    • ' % link (name, computer, namespace + "\\" + name)) + doc.append ("
    ") + else: + doc.append ("

    No namespaces

    ") + + doc.append ("
    ") + subclasses = sorted (wmi_connection.classes) + doc.append ("

    Classes:

    ") + if subclasses: + doc.append ("
      ") + for subclass in subclasses: + doc.append ('
    • %s
    • ' % link (subclass, computer, namespace, subclass)) + doc.append ("
    ") + else: + doc.append ("

    No classes

    ") + + finish_doc () + +def handle_namespace (environ, computer, namespace): + if not namespace: + wmi_connection = wmi.WMI (computer, namespace="root/cimv2") + for setting in wmi_connection.Win32_WMISetting (): + namespace=setting.ASPScriptDefaultNamespace + break + + wmi_connection = wmi.WMI (computer, namespace=namespace, find_classes=True) + wmi_class = shift_path_info (environ) + if wmi_class: + doc_wmi_class (computer, namespace, wmi_class, wmi_connection) + else: + doc_namespace (computer, namespace, wmi_connection) + +def handle_computer (environ, computer): + handle_namespace (environ, computer, shift_path_info (environ)) + +def app (environ, start_response): + computer = shift_path_info (environ) + if computer == "favicon.ico": + start_response ("404 Not Found", [("Content-Type", "text/plain")]) + return [] + elif computer: + start_response ("200 OK", [("Content-Type", "text/html; charset=utf-8")]) + handle_computer (environ, computer) + return (unicode (d).encode ("utf8") + unicode ("\n").encode ("utf8") for d in doc) + else: + start_response ("301 Moved Permanently", [("Location", "/localhost"), ("Content-Type", "text/plain")]) + return ["Redirected to /localhost"] + +PORT = 8010 + +def run_browser (): + import os + os.startfile ("http://localhost:%d" % PORT) + +if __name__ == '__main__': + threading.Timer (3.0, run_browser).start () + httpd = make_server ('', PORT, app) + try: + httpd.serve_forever () + except KeyboardInterrupt: + print ("Shutting down gracefully...") diff --git a/WPy32-3720/python-3.7.2/readme.txt b/WPy32-3720/python-3.7.2/readme.txt new file mode 100644 index 00000000..fd8be650 --- /dev/null +++ b/WPy32-3720/python-3.7.2/readme.txt @@ -0,0 +1,99 @@ +***************** +Python WMI Module +***************** + +What is it? +=========== + +Windows Management Instrumentation (WMI) is Microsoft's implementation of +Web-Based Enterprise Management (WBEM), an industry initiative to provide +a Common Information Model (CIM) for pretty much any information about a +computer system. + +The Python WMI module is a lightweight wrapper on top of the pywin32 +extensions, and hides some of the messy plumbing needed to get Python to +talk to the WMI API. It's pure Python and should work with any version of +Python from 2.1 onwards (list comprehensions) and any recent version of +pywin32. + + +Where do I get it? +================== + +http://timgolden.me.uk/python/wmi/index.html + + +Copyright & License? +==================== + +(c) Tim Golden 5th June 2003 +Licensed under the (GPL-compatible) MIT License: +http://www.opensource.org/licenses/mit-license.php + + +How do I install it? +==================== + +When all's said and done, it's just a module. But for those +who like setup programs:: + + python setup.py install + +It's also pip/easy_install-able + + +How do I use it? +================ + +There's a tutorial here: http://timgolden.me.uk/python/wmi/tutorial.html, +and some examples at: http://timgolden.me.uk/python/wmi/cookbook.html +but as a quick taster, try this, to show all stopped services:: + + import wmi + + c = wmi.WMI () + for s in c.Win32_Service (): + if s.State == 'Stopped': + print s.Caption, s.State + + +Prerequisites +============= + +If you're running a recent Python (2.1+) on a recent Windows (2k, 2k3, XP) +and you have Mark Hammond's win32 extensions installed, you're probably +up-and-running already. Otherwise... + +Windows +------- +If you're running Win9x / NT4 you'll need to get WMI support +from Microsoft. Microsoft URLs change quite often, so I suggest you +do this: http://www.google.com/search?q=wmi+downloads + +Python +------ +http://www.python.org/ (just in case you didn't know) + +pywin32 (was win32all) +---------------------- +http://starship.python.net/crew/mhammond/win32/Downloads.html +Specifically, builds 154/155 fixed a problem which affected the WMI +moniker construction. You can still work without this fix, but some +more complex monikers will fail. + +makepy +------ +(NB my own experience over several systems is that this +step isn't necessary. However, if you have problems...) +You may have to compile makepy support for some typelibs. The following +are reported to be significant: + +Microsoft WMI Scripting Library +WMI ADSI Extension Type Library +WMICntl Type Library + +If you've not done this before, start the PythonWin environment, select +Tools > Com Makepy utility from the menu, select the library by name, and +click [OK]. + +