
    %
i              
          d Z ddlZddlZddlZddlZddlZddlZddlZddlZd Z	 G d d          Z
ddZedk    r7 ed           ddlZd	Zd
ez  Z ej                    Zedz   Z	  eed          Z eed          Ze                    e                    d                     e                    d            ed eddeee                     e                                  ed edej        z  ej        edz                       e                                 eefD ]Z	  ej        e           # e$ r Y w xY wdS # eefD ]Z	  ej        e           # e$ r Y w xY ww xY wdS )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 <jbd@alum.mit.edu>
    Nc                     |                      d          \  }}}t          j        |||t          j        t          j                  S )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	LogonUserwin32conLOGON32_LOGON_INTERACTIVELOGON32_PROVIDER_DEFAULT)loginStringdomainuserpasswds       C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\win32/Demos/winprocess.py	logonUserr      sH     ',,T22FD&"*)      c                   F    e Zd ZdZ	 	 	 	 	 	 	 	 d
dZddZddZd Zd	 ZdS )Processz
    A Windows process.
    N   c
           	      T   t          j                    }
t          j        t          j        z  |
_        |$t          j        t          j                  |
_	        n||
_	        |$t          j        t          j
                  |
_        n||
_        |$t          j        t          j                  |
_        n||
_        ||
_        |)|\  |
_        |
_        |
xj        t          j        z  c_        |)|\  |
_        |
_        |
xj        t          j        z  c_        |	|	|
_        d|dddt           j        dd|
f	}|It/          |          }t1          j        |           t          j        |g|R  }t1          j                     nt          j        | }|\  | _        | _        | _        | _         dS )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STARTUPINFOr   STARTF_USESTDHANDLESSTARTF_USESHOWWINDOWdwFlagswin32apiGetStdHandleSTD_INPUT_HANDLE	hStdInputSTD_OUTPUT_HANDLE
hStdOutputSTD_ERROR_HANDLE	hStdErrorwShowWindowdwXdwYSTARTF_USEPOSITIONdwXSizedwYSizeSTARTF_USESIZE	lpDesktopCREATE_NEW_CONSOLEr   r   ImpersonateLoggedOnUserCreateProcessAsUserRevertToSelfCreateProcesshProcesshThreadPIdTId)selfcmdloginhStdinhStdouthStderrshowxyxySizedesktopsiprocArgshUserprocHandless                 r   __init__zProcess.__init__2   s   F %''2X5RR
>#01JKKBLL!BL?$1(2LMMBMM#BM?#01JKKBLL"BL>NBFBFJJ(55JJ%+"BJ
JJ(11JJ"BL+

 e$$E1%888&:5L8LLLK&((((&4h?K:E7t|TXtxxxr   c                 R    |t           j        }t          j        | j        |          S )zg
        Wait for process to finish or for specified number of
        milliseconds to elapse.
        )
win32eventINFINITEWaitForSingleObjectr0   )r4   mSecs     r   waitzProcess.wait   s&    
 <&D-dmTBBBr     c                     t          j        | j        d           |                     |          t          j        k    r0t          j        | j        d           t          j
        d           dS dS )z
        Kill process. Try for an orderly shutdown via WM_CLOSE.  If
        still running after gracePeriod (5 sec. default), terminate.
        r   d   N)win32guiEnumWindows	__close__rH   rD   WAIT_OBJECT_0r   TerminateProcessr0   r   Sleep)r4   gracePeriods     r   killzProcess.kill   sf    
 	T^Q///99[!!Z%===)$-;;;N3 >=r   c                     t          j        |          \  }}|| j        k    r#t          j        |t
          j        dd           dS dS )zd
        EnumWindows callback - sends WM_CLOSE to any window
        owned by this process.
        r   N)r   GetWindowThreadProcessIdr2   rL   PostMessager   WM_CLOSE)r4   hwnddummyr3   r2   s        r   rN   zProcess.__close__   sJ    
  8>>S$(?? x'8!Q????? ?r   c                 4    t          j        | j                  S )z+
        Return process exit code.
        )r   GetExitCodeProcessr0   )r4   s    r   exitCodezProcess.exitCode   s     .t}===r   )NNNNr   NNN)N)rI   )	__name__
__module____qualname____doc__rB   rH   rS   rN   r\    r   r   r   r   -   s          LF LF LF LF\C C C C       @ @ @> > > > >r   r   c                    |)t          j        |                                          |d<   |)t          j        |                                          |d<   |)t          j        |                                          |d<   t          | fi |}|                    |          t
          j        k    r#|                                 t          d          |	                                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
    Nr7   r8   r9   zprocess timeout exceeded)
msvcrtget_osfhandlefilenor   rH   rD   rO   rS   OSErrorr\   )r5   rG   stdinstdoutstderrkwchilds          r   runrl      s     +ELLNN;;8,V]]__==9,V]]__==9C2Ezz$:333

0111>>r   __main__zTesting 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.txtzw+bmbcszCMD.EXE exit code:zcmd.exe)r:   rg   rh   ri   zNOTEPAD exit code:znotepad.exe %si  )r:   rG   )NNNN) r`   rc   osr   r   rD   rL   r   r   r   r   rl   r]   printtempfiletimeoutSeconds	cmdStringmktempcmd_nameout_nameopenr5   outwriteencodeseekclosenameSW_MAXIMIZEnunlinkrf   ra   r   r   <module>r      s      				                 "s> s> s> s> s> s> s> s>l   . z	E
$%%%OOON	 	  x  H& Hd8U##d8U##		)""6**+++ C	SEEE	
 	
 	
 			 C 38+)#d*  	
 	
 	
 			H% 	 	A	(####   	 	(H% 	 	A	(####   	Q sC   )B?E /E  EEE2E&%E2&E.	+E2-E.	.E2