2

私がやろうとしているのは、現在ロックされているユーザーのWindows GUIでサービスからアプリケーションを起動できる小さなラッパーを書くことです。ラッパーは次のように呼び出されます: "wrapper.exe mspaint arg1 arg2 < some-piped-input"。パイプ以外はすべて正常に動作します。現時点では、3 つのパイプ (stdin、stdout、stderr 用) を作成しています。これにより、ラッパー (例では some-piped-input) にパイプされた入力が GUI アプリケーションのプロセスにリダイレクトされます。ラッパーの stdout/stderr への出力/エラー。

エラーは発生しません。機能しません。

次のコードでは、これらのパイプはどれも機能しません:

pi = new PROCESS_INFORMATION();
sa = new SECURITY_ATTRIBUTES();
saProcess = new SECURITY_ATTRIBUTES();
saThread = new SECURITY_ATTRIBUTES();
si = new STARTUPINFO();

sa.nLength = (uint)Marshal.SizeOf(sa);
sa.lpSecurityDescriptor = IntPtr.Zero;
sa.bInheritHandle = true;

saProcess.nLength = (uint)Marshal.SizeOf(saProcess);
saThread.nLength = (uint)Marshal.SizeOf(saThread);

si.cb = (uint)Marshal.SizeOf(si);

// Create in/out/err pipes
subprocessStdIn = new IntPtr();
subprocessStdOut = new IntPtr();
subprocessStdErr = new IntPtr();

// Get main processes in/out/err pipes
mainProcessStdIn = GetStdHandle(StdHandle.Stdin);
mainProcessStdOut = GetStdHandle(StdHandle.Stdout);
mainProcessStdErr = GetStdHandle(StdHandle.Stderr);

//                 this ---------------> subprocess
if (CreatePipe(ref subprocessStdIn, ref mainProcessStdIn, ref sa, 0x0001))
{
    Console.WriteLine("Pipe stdIn   --> pIn created.");
    si.hStdInput = subprocessStdIn;
}


//                 this <--------------- subprocess
if (CreatePipe(ref mainProcessStdOut, ref subprocessStdOut, ref sa, 0x0001))
{
    Console.WriteLine("Pipe stdOut <--  pOut created.");
    si.hStdOutput = subprocessStdOut;
}

//                 this <--------------- subprocess
if (CreatePipe(ref mainProcessStdErr, ref subprocessStdErr, ref sa, 0x0001))
{
    Console.WriteLine("Pipe stdErr <--  pErr created.");
    si.hStdError = subprocessStdErr;
}

si.lpDesktop = @"WinSta0\Default"; //Modify as needed 
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEONFEEDBACK | STARTF_USESTDHANDLES;
si.wShowWindow = SW_SHOW;

CreateProcessAsUser(token, null, cmdLine, ref saProcess, ref saThread, false, CREATE_UNICODE_ENVIRONMENT, envBlock, null, ref si, out pi);
4

0 に答える 0