gpt4 book ai didi

c++ - 从服务以交互方式启动 .Net winforms 应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:33 26 4
gpt4 key购买 nike

环境 - VS2008、Vista SP1。

我编写了一个进程管理服务,它可以在 session 0 或交互式控制台(通常为 1)中启动应用程序。请注意,这不是正常的操作模式,它仅用于内部调试目的。在现场,这些进程将安全地隐藏在 session 0 中。安全问题不适用。

显然人们不会阅读此内容:安全问题不适用。我们有许多这样编写的现有服务器应用程序(不是服务)。我们不打算完全改造这些应用程序,我们只需要在内部运行发布版本时能够访问它们的内置调试对话框。我已经知道所有关于规范解决方案和管道等的信息。如果可以接受将远程接口(interface)添加到所有这些应用程序中,那么我们就会这样做。

我使用以下代码来执行此操作:

ZeroMemory (&sui, sizeof(STARTUPINFO));
sui.cb = sizeof (STARTUPINFO);
sui.wShowWindow = pTask->GetWinStartState() ;
sui.dwFlags = STARTF_USESHOWWINDOW ;
ZeroMemory (&pi,sizeof(pi));

if (bInteractive)
{
HANDLE hToken = NULL;
DWORD dwSessionId = WTSGetActiveConsoleSessionId();
WTSQueryUserToken (dwSessionId, &hToken);
sui.lpDesktop = TEXT("winsta0\\default");
LPVOID pEnv = NULL;
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
HMODULE hModu = LoadLibrary(TEXT("Userenv.dll"));

if (hModu )
{
if (CreateEnvironmentBlock (&pEnv, hToken, FALSE))
dwCreationFlag |= CREATE_UNICODE_ENVIRONMENT;
else
pEnv = NULL;
}

bCreatedOk = CreateProcessAsUser (hToken,
NULL,
(LPTSTR)(pTask->GetExeName()),
NULL,
NULL,
FALSE,
dwCreationFlag,
pEnv,
NULL,
&sui,
&pi);
}
else
{
bCreatedOk = CreateProcess (NULL, ... blah...);
}

一切正常,我可以在 Vista 服务 session 和控制台中运行和监视 native 进程。伟大的。为每个人准备的蛋糕和啤酒。

所以问题来了。如果我尝试像这样以交互方式运行 winforms (C#) 应用程序,它似乎在运行,在 Process Explorer 中显示为在 session 1 中运行,但在桌面上...... nada。根本没有窗口出现。该过程运行起来并关闭一切正常,但没有出现任何窗口。从资源管理器运行的完全相同的 winform exe 也出现在 session 1 中,但这次出现在桌面上就好了。

有什么想法吗?

最佳答案

尽管明显歇斯底里,但只要使用与交互式用户相同或更低的权限,将应用程序从服务启动到交互式 session 就没有错。由于您是作为交互式用户启动的,因此无法提升权限。

您所做的确实有效。我怀疑这个问题与您的 STARTUPINFO 结构有关。你似乎在堆栈上创建你的 sui,但你没有显示你在用它做什么。您是否将其初始化为全 0,否则您可能会从堆栈中获取一些垃圾,导致窗口不显示或在屏幕外的某些坐标处显示。

关于c++ - 从服务以交互方式启动 .Net winforms 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/564829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com