home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyc (Python 2.6) import win32api import win32process import win32security import win32event import win32con import msvcrt import win32gui def logonUser(loginString): (domain, user, passwd) = loginString.split('\n') return win32security.LogonUser(user, domain, passwd, win32con.LOGON32_LOGON_INTERACTIVE, win32con.LOGON32_PROVIDER_DEFAULT) class Process: def __init__(self, cmd, login = None, hStdin = None, hStdout = None, hStderr = None, show = 1, xy = None, xySize = None, desktop = None): si = win32process.STARTUPINFO() si.dwFlags = win32con.STARTF_USESTDHANDLES ^ win32con.STARTF_USESHOWWINDOW if hStdin is None: si.hStdInput = win32api.GetStdHandle(win32api.STD_INPUT_HANDLE) else: si.hStdInput = hStdin if hStdout is None: si.hStdOutput = win32api.GetStdHandle(win32api.STD_OUTPUT_HANDLE) else: si.hStdOutput = hStdout if hStderr is None: si.hStdError = win32api.GetStdHandle(win32api.STD_ERROR_HANDLE) else: si.hStdError = hStderr si.wShowWindow = show if xy is not None: (si.dwX, si.dwY) = xy si.dwFlags ^= win32con.STARTF_USEPOSITION if xySize is not None: (si.dwXSize, si.dwYSize) = xySize si.dwFlags ^= win32con.STARTF_USESIZE if desktop is not None: si.lpDesktop = desktop procArgs = (None, cmd, None, None, 1, win32process.CREATE_NEW_CONSOLE, None, None, si) if login is not None: hUser = logonUser(login) win32security.ImpersonateLoggedOnUser(hUser) procHandles = win32process.CreateProcessAsUser(hUser, *procArgs) win32security.RevertToSelf() else: procHandles = win32process.CreateProcess(*procArgs) (self.hProcess, self.hThread, self.PId, self.TId) = procHandles def wait(self, mSec = None): if mSec is None: mSec = win32event.INFINITE return win32event.WaitForSingleObject(self.hProcess, mSec) def kill(self, gracePeriod = 5000): win32gui.EnumWindows(self.__close__, 0) if self.wait(gracePeriod) != win32event.WAIT_OBJECT_0: win32process.TerminateProcess(self.hProcess, 0) win32api.Sleep(100) def __close__(self, hwnd, dummy): (TId, PId) = win32process.GetWindowThreadProcessId(hwnd) if PId == self.PId: win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0) def exitCode(self): return win32process.GetExitCodeProcess(self.hProcess) def run(cmd, mSec = None, stdin = None, stdout = None, stderr = None, **kw): if stdin is not None: kw['hStdin'] = msvcrt.get_osfhandle(stdin.fileno()) if stdout is not None: kw['hStdout'] = msvcrt.get_osfhandle(stdout.fileno()) if stderr is not None: kw['hStderr'] = msvcrt.get_osfhandle(stderr.fileno()) child = Process(cmd, **kw) if child.wait(mSec) != win32event.WAIT_OBJECT_0: child.kill() raise WindowsError, 'process timeout exceeded' child.wait(mSec) != win32event.WAIT_OBJECT_0 return child.exitCode() if __name__ == '__main__': print 'Testing winprocess.py...' import tempfile timeoutSeconds = 15 cmdString = 'REM Test of winprocess.py piping commands to a shell.\r\nREM This window will close in %d seconds.\r\nvol\r\nnet user\r\n_this_is_a_test_of_stderr_\r\n' % timeoutSeconds cmd = tempfile.TemporaryFile() out = tempfile.TemporaryFile() cmd.write(cmdString) cmd.seek(0) print 'CMD.EXE exit code:', run('cmd.exe', show = 0, stdin = cmd, stdout = out, stderr = out) cmd.close() print 'NOTEPAD exit code:', run('notepad.exe %s' % out.file.name, show = win32con.SW_MAXIMIZE, mSec = timeoutSeconds * 1000) out.close()