C#STARTUPINFO标志显示从XP中的服务启动的进程的UI

时间:2011-08-26 16:37:48

标签: c#

我正在从XP中的Windows服务启动一个进程,我只是启动该进程而不是尝试与它进行交互。该过程开始但UI未显示。我相信我需要在STARTUPINFO中设置一些标志以使进程可见,并希望有人可以显示如何设置标记和设置标记。

    sPath = @"C:\Windows\notepad.exe";

    string Message = string.Empty;

    // Variables
    PROCESS_INFORMATION processInfo = new PROCESS_INFORMATION();
    STARTUPINFO startInfo = new STARTUPINFO();

    Boolean bResult = false;
    IntPtr hToken = IntPtr.Zero;

    try
    {
        // Logon user
        bResult = LogonUser(
            "Test",
            "VirtualXP-23639",
            "test",
            LogonType.LOGON32_LOGON_INTERACTIVE,
            LogonProvider.LOGON32_PROVIDER_DEFAULT,
            out hToken
        );
        if (!bResult) { throw new Exception("Logon error #" + Marshal.GetLastWin32Error()); }

        // Create process
        startInfo.cb = Marshal.SizeOf(startInfo);
        startInfo.lpDesktop = "winsta0\\default";

        bResult = CreateProcessAsUser(
            hToken,
            null,
            sPath,
            IntPtr.Zero,
            IntPtr.Zero,
            false,
            0,
            IntPtr.Zero,
            null,
            ref startInfo,
            out processInfo
        );

        if (!bResult)
        {
            Message = "Failed to Create Process on Desktop/Console.  Code=" + Marshal.GetLastWin32Error().ToString();
            Logging.LogError(Ascension.CM.Common.Enums.ApplicationModuleEnums.Service, Message, "Ascension.CM.ServiceWorker.ProcessLauncher.XpLaunchDesktopProcess", null);
        }


    }
    finally
    {
        // Close all handles
        CloseHandle(hToken);
        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
    }
}

3 个答案:

答案 0 :(得分:2)

您至少需要允许服务与桌面交互,因此在services.msc中,单击您的服务,转到属性,然后登录并选择允许与桌面交互..

答案 1 :(得分:0)

我建议你在.net框架中使用Process类。

Process.Start("notepad.exe")

这应该会产生你想要的效果。

答案 2 :(得分:0)

谢谢大家,但我找到了解决方案。

我最终使用WTSQueryUserToken获取当前登录用户,然后使用DuplicateTokenEx获取我与CreateProcessAsUser一起使用的令牌以启动该过程。

对于XP,使用会话ID 0和win7使用WTSGetActiveConsoleSessionId获取当前会话ID。

这样可以正常使用“允许与桌面交互”属性。

由于