i dZddlZddlZddlZddlZddlZddlZddlZddlZdZ GddZ ddZ e dkr7e dddlZd Zd ezZejZed zZ eed Zeed Zeed ede de ddeeeee de dejzejedzeeefD]Z eje#e$rYwxYwdS#eefD]Z eje#e$rYwxYwwxYwdS)a Windows Process Control winprocess.run launches a child process and returns the exit code. Optionally, it can: redirect stdin, stdout & stderr to files run the command as another user limit the process's running time control the process window (location, size, window state, desktop) Works on Windows NT, 2000 & XP. Requires Mark Hammond's win32 extensions. This code is free for any purpose, with no warranty of any kind. -- John B. Dell'Aquila Nc|d\}}}tj|||tjtjS)z Login as specified user and return handle. loginString: 'Domain User Password'; for local login use . or empty string as domain e.g. '. administrator secret_password'  )split win32security LogonUserwin32conLOGON32_LOGON_INTERACTIVELOGON32_PROVIDER_DEFAULT) loginStringdomainuserpasswds DC:\PYTHON\_runtimes\venv\Lib\site-packages\win32/Demos/winprocess.py logonUserrsH',,T22FD&  " *)   cFeZdZdZ d dZd dZd dZdZd ZdS) Processz A Windows process. Nc Ttj} tjtjz | _|$t jt j| _ n|| _ |$t jt j | _ n|| _ |$t jt j | _ n|| _ || _|)|\| _| _| xjtjzc_|)|\| _| _| xjtjzc_| | | _d|dddtjdd| f } |It/|} t1j| tj| g| R} t1jntj| } | \|_|_|_|_ dS)a( Create a Windows process. cmd: command to run login: run as user 'Domain User Password' hStdin, hStdout, hStderr: handles for process I/O; default is caller's stdin, stdout & stderr show: wShowWindow (0=SW_HIDE, 1=SW_NORMAL, ...) xy: window offset (x, y) of upper left corner in pixels xySize: window size (width, height) in pixels desktop: lpDesktop - name of desktop e.g. 'winsta0\default' None = inherit current desktop '' = create new desktop if necessary User calling login requires additional privileges: Act as part of the operating system [not needed on Windows XP] Increase quotas Replace a process level token Login string must EITHER be an administrator's account (ordinary user can't access current desktop - see Microsoft Q165194) OR use desktop='' to run another desktop invisibly (may be very slow to startup & finalize). Nr)! win32process STARTUPINFOrSTARTF_USESTDHANDLESSTARTF_USESHOWWINDOWdwFlagswin32api GetStdHandleSTD_INPUT_HANDLE hStdInputSTD_OUTPUT_HANDLE hStdOutputSTD_ERROR_HANDLE hStdError wShowWindowdwXdwYSTARTF_USEPOSITIONdwXSizedwYSizeSTARTF_USESIZE lpDesktopCREATE_NEW_CONSOLErrImpersonateLoggedOnUserCreateProcessAsUser RevertToSelf CreateProcesshProcesshThreadPIdTId)selfcmdloginhStdinhStdouthStderrshowxyxySizedesktopsiprocArgshUser procHandless r__init__zProcess.__init__2sF % ' '2X5RR >#01JKKBLL!BL ?$1(2LMMBMM#BM ?#01JKKBLL"BL >NBFBF JJ(5 5JJ  %+ "BJ JJ(1 1JJ  "BL      +       e$$E  1% 8 8 8&:5L8LLLK  & ( ( ( (&4h?K:E7 t|TXtxxxrcR| tj}tj|j|S)zg Wait for process to finish or for specified number of milliseconds to elapse. ) win32eventINFINITEWaitForSingleObjectr0)r4mSecs rwaitz Process.waits& <&D-dmTBBBrctj|jd||tjkr0t j|jdtj ddSdS)z Kill process. Try for an orderly shutdown via WM_CLOSE. If still running after gracePeriod (5 sec. default), terminate. rdN) win32gui EnumWindows __close__rHrD WAIT_OBJECT_0rTerminateProcessr0rSleep)r4 gracePeriods rkillz Process.killsf T^Q/// 99[ ! !Z%= = =  )$- ; ; ; N3      > =rctj|\}}||jkr#tj|t jdddSdS)zd EnumWindows callback - sends WM_CLOSE to any window owned by this process. rN)rGetWindowThreadProcessIdr2rL PostMessagerWM_CLOSE)r4hwnddummyr3r2s rrNzProcess.__close__sJ  8>>S $(??  x'8!Q ? ? ? ? ? ?rc4tj|jS)z+ Return process exit code. )rGetExitCodeProcessr0)r4s rexitCodezProcess.exitCodes.t}===r)NNNNrNNN)N)rI) __name__ __module__ __qualname____doc__rBrHrSrNr\rrrr-s  LFLFLFLF\CCCC    @@@>>>>>rrc |)tj||d<|)tj||d<|)tj||d<t|fi|}||t jkr#|td| S)al Run cmd as a child process and return exit code. mSec: terminate cmd after specified number of milliseconds stdin, stdout, stderr: file objects for child I/O (use hStdin etc. to attach handles instead of files); default is caller's stdin, stdout & stderr; kw: see Process.__init__ for more keyword options Nr7r8r9zprocess timeout exceeded) msvcrt get_osfhandlefilenorrHrDrOrSOSErrorr\)r5rGstdinstdoutstderrkwchilds rrunrls +ELLNN;;8  ,V]]__==9  ,V]]__==9 C  2  E zz$:333 0111 >>  r__main__zTesting winprocess.py...zREM Test of winprocess.py piping commands to a shell. REM This 'notepad' process will terminate in %d seconds. vol net user _this_is_a_test_of_stderr_ z.txtzw+bmbcszCMD.EXE exit code:zcmd.exe)r:rgrhrizNOTEPAD exit code:znotepad.exe %si)r:rG)NNNN) r`rcosrrrDrLrrrrrlr]printtempfiletimeoutSeconds cmdStringmktempcmd_nameout_nameopenr5outwriteencodeseekclosename SW_MAXIMIZEnunlinkrfrarrrs  "s>s>s>s>s>s>s>s>l. z E $%%%OOON   x  H& Hd8U##d8U## )""6**+++    C S E E E      C 38+)#d*       H%  A  (####      (H%  A  (####     QsC)B?E /EEE E2E&%E2&E. +E2-E. .E2