我正在从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);
}
}
答案 0 :(得分:2)
您至少需要允许服务与桌面交互,因此在services.msc中,单击您的服务,转到属性,然后登录并选择允许与桌面交互..
答案 1 :(得分:0)
我建议你在.net框架中使用Process类。
Process.Start("notepad.exe")
这应该会产生你想要的效果。
答案 2 :(得分:0)
谢谢大家,但我找到了解决方案。
我最终使用WTSQueryUserToken获取当前登录用户,然后使用DuplicateTokenEx获取我与CreateProcessAsUser一起使用的令牌以启动该过程。
对于XP,使用会话ID 0和win7使用WTSGetActiveConsoleSessionId获取当前会话ID。
这样可以正常使用“允许与桌面交互”属性。
由于