1

クラスを使用System.Diagnostic.Processして、.Net WCF Web サービスを使用してサーバー pc でプロセスを開始します。それらはスムーズに起動し、タスクマネージャーから実行されているのを見ることができますが、ウィンドウは表示されません。どうすればこの問題を克服できると思いますか?

4

3 に答える 3

3

GUI を表示し、ユーザーがそれを操作できるようにする場合は、対話型プロセスを開始する必要があります。現在、Web サービスにはおそらく当てはまりません。

Windows サービスを開始して cmd を起動するを参照してください

于 2012-07-06T12:13:09.453 に答える
1

あなたはこれをするべきではありませんが...

現在のセッションでユーザーとしてプログラムを起動できます

IntPtr UserTokenHandle = IntPtr.Zero;
WTSQueryUserToken ( WTSGetActiveConsoleSessionId(), ref UserTokenHandle);

PROCESS_INFORMATION ProcInfo = new PROCESS_INFORMATION();
STARTUPINFOW StartInfo = new STARTUPINFOW();
StartInfo.cb = Convert.ToUInt32(System.Runtime.InteropServices.Marshal.SizeOf(StartInfo));


CreateProcessAsUser ( UserTokenHandle, @"C:\dir\MyApp.exe",
    IntPtr.Zero,
    IntPtr.Zero,
    IntPtr.Zero,
    false,
    0,
    IntPtr.Zero,
    null,
    ref StartInfo,
    ref ProcInfo);

if (!(UserTokenHandle == IntPtr.Zero))
{
    CloseHandle ( UserTokenHandle);
}

必要なインポートと構造体:

[DllImport("kernel32.dll", EntryPoint = "WTSGetActiveConsoleSessionId", SetLastError = true)]
public static extern uint WTSGetActiveConsoleSessionId ();

[DllImport("Wtsapi32.dll", EntryPoint = "WTSQueryUserToken", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSQueryUserToken ( uint SessionId, ref IntPtr phToken );

[DllImport("kernel32.dll", EntryPoint = "CloseHandle", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseHandle ( [InAttribute()]
    IntPtr hObject );

[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUserW", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CreateProcessAsUser (
    [InAttribute()]
    IntPtr hToken,
    [InAttribute(), MarshalAs(UnmanagedType.LPWStr)]
    string lpApplicationName, System.IntPtr lpCommandLine,
    [InAttribute()]
    IntPtr lpProcessAttributes,
    [InAttribute()]
    IntPtr lpThreadAttributes,
    [MarshalAs(UnmanagedType.Bool)]
    bool bInheritHandles, uint dwCreationFlags,
    [InAttribute()]
    IntPtr lpEnvironment,
    [InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)]
    string lpCurrentDirectory,

ref STARTUPINFOW lpStartupInfo,

ref PROCESS_INFORMATION lpProcessInformation );

[StructLayout(LayoutKind.Sequential)]
public struct SECURITY_ATTRIBUTES
{
    public uint nLength;
    public IntPtr lpSecurityDescriptor;
    [MarshalAs(UnmanagedType.Bool)]
    public bool bInheritHandle;
}

[StructLayout(LayoutKind.Sequential)]
public struct STARTUPINFOW
{
    public uint cb;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpReserved;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpDesktop;
    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpTitle;
    public uint dwX;
    public uint dwY;
    public uint dwXSize;
    public uint dwYSize;
    public uint dwXCountChars;
    public uint dwYCountChars;
    public uint dwFillAttribute;
    public uint dwFlags;
    public ushort wShowWindow;
    public ushort cbReserved2;
    public IntPtr lpReserved2;
    public IntPtr hStdInput;
    public IntPtr hStdOutput;
    public IntPtr hStdError;
}

[StructLayout(LayoutKind.Sequential)]
public struct PROCESS_INFORMATION
{
    public IntPtr hProcess;
    public IntPtr hThread;
    public uint dwProcessId;
    public uint dwThreadId;
}
于 2012-07-06T12:21:10.937 に答える
0

あなたはWebサービスについて話しているので、おそらくWindowsサービスとしても実行されていますか? その場合、プロセスを開始できますが、フォームはまったく表示されません。

Windows サービスは、ユーザーがログインしていないときでもコンピューター上で実行されるように設計されています。

「デスクトップとの対話を許可する」(または同様のもの) という設定をいじることができますが、サービスはそのように使用することを意図していません。

于 2012-07-06T12:07:54.503 に答える