この問題のデバッグに助けが必要です。オンラインとstackoverflowを検索してみましたが、これに対する解決策が見つかりませんでした。私はWindows APIにかなり慣れていないので、私の無知を許してください。
基本的に、特定のユーザーを使用して Python から stdout および stderr に出力する C++ アプリケーションを実行しようとしています。この目的のために、LogonUser API と CreateProcessAsUser API を使用してバイナリを呼び出し、パイプを使用して出力とエラー ストリームをキャプチャします。ほとんどのコードは、python win32 モジュールのデモ コードからピックアップしました。ただし、何らかの理由でプロセスがエラー ストリームにダンプされると、WriteFile でハングします。クラッシュ ダンプを調べると、ファイル ハンドルが 2 (stderr) であることがわかります。誰かが私の問題を手伝ってくれますか?
前もって感謝します
これがコードスニペットです -
userToken = win32security.LogonUser(user, domain, password,
win32con.LOGON32_LOGON_BATCH,
win32con.LOGON32_PROVIDER_DEFAULT)
secAttrs = win32security.SECURITY_ATTRIBUTES()
secAttrs.bInheritHandle = 1
stdout_r, stdout_w = win32pipe.CreatePipe(secAttrs, 0)
stderr_r, stderr_w = win32pipe.CreatePipe(secAttrs, 0)
startupInfo = win32process.STARTUPINFO()
startupInfo.dwFlags = win32con.STARTF_USESTDHANDLES
startupInfo.hStdOutput = stdout_w
startupInfo.hStdError = stderr_w
ppid = win32api.GetCurrentProcess()
tmp = win32api.DuplicateHandle(ppid, stdout_r, ppid, 0, 0,
win32con.DUPLICATE_SAME_ACCESS)
win32file.CloseHandle(stdout_r)
stdout_r = tmp
procArgs = (None, # appName
cmd_line, # commandLine
None, # processAttributes
None, # threadAttributes
1, # bInheritHandles
win32process.CREATE_NEW_CONSOLE, # dwCreationFlags
None, # newEnvironment
None, # currentDirectory
startupInfo)
procHandles = win32process.CreateProcessAsUser(userToken, *procArgs)
win32file.CloseHandle(stderr_w)
win32file.CloseHandle(stdout_w)
win32security.RevertToSelf()
# Wait for process to complete
hProcess, hThread, pid, tid = procHandles
stdout_buf = os.fdopen(msvcrt.open_osfhandle(stdout_r, 0), "rb")
stdout = stdout_buf.read()
stderr_buf = os.fdopen(msvcrt.open_osfhandle(stderr_r, 0), "rb")
stderr = stderr_buf.read()
win32event.WaitForSingleObject(hProcess, 3600*1000)
rc = win32process.GetExitCodeProcess(hProcess)