WIndows服务在远程桌面中运行桌面程序

发布于 2024-11-06 07:06:22 字数 467 浏览 0 评论 0原文

我需要在远程桌面中启动程序,该程序打开一个窗口并需要用户交互,但我的应用程序是一个Windows服务。

我使用的是Windows 2008。 我成功创建了一个应用程序,但启动程序仅与鼠标、键盘会话连接,但我需要在 RDP 中启动。

现在我正在使用这些功能。

WTSEnumerateSessions (enum all sessions, here I know if RDP)
WTSQueryUserToken (Get user token)
DuplicateTokenEx ( make a primary token)
CreateProcessAsUser (run application with SI.lpDesktop = _T("winsta0\\default"))

但这仅适用于在连接到键盘、鼠标、显示器的控制台中运行应用程序,而不是 RDP。

无论如何可以帮助我吗? 谢谢。

I need launch program in remote desktop, this program open a window and need user interact, but my application is a windows service.

I'm using windows 2008.
I'm created an application with success but launch program only session connect with mouse, keyboard, but I need launch in RDP.

Now I'm using these functions.

WTSEnumerateSessions (enum all sessions, here I know if RDP)
WTSQueryUserToken (Get user token)
DuplicateTokenEx ( make a primary token)
CreateProcessAsUser (run application with SI.lpDesktop = _T("winsta0\\default"))

But this only work success for run application in console connect to keyboard, mouse, monitor, not RDP.

Anyway can help me ?
thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倾城月光淡如水﹏ 2024-11-13 07:06:22

您是否正在尝试在计算机上的特定 RDP 会话中启动 GUI 应用程序?你的想法或多或少是正确的,尽管你可能会遗漏一些部分。查看源代码中的 ProcessHelper 类,用于 Cassia 库 的自动化测试。您可以删除许多托管垃圾以在 C++ 中使用。如果您不需要以提升的权限运行该进程,您还可以省略 GetTokenInformation( ...TokenInformationClass.TokenLinkedToken... ) 废话。此代码已在自 Windows XP 以来的每个 Windows 版本上进行了测试。

另请注意,调用 WTSQueryUserToken 需要 SE_TCB_NAME 权限(默认情况下 LocalSystem 帐户具有该权限)。

So you're trying to launch a GUI application in a particular RDP session on the machine? You have the right idea, more or less, though you may be missing a few pieces. Take a look at the ProcessHelper class in the source for automated tests of the Cassia library. You can remove a lot of the managed cruft for use in C++. You can also omit the GetTokenInformation( ...TokenInformationClass.TokenLinkedToken... ) nonsense if you don't need to run the process with elevated permissions. This code has been tested on every version of Windows since Windows XP.

Note also that calling WTSQueryUserToken requires the SE_TCB_NAME privilege (which the LocalSystem account has by default).

幸福%小乖 2024-11-13 07:06:22

好的,谢谢丹·波特斯,

它解决了我的问题。

问题是权限。
我配置了这三个权限。

SetPrivilege(hpToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
SetPrivilege(hpToken, SE_INCREASE_QUOTA_NAME, TRUE);
SetPrivilege(hpToken, SE_TCB_NAME, TRUE);

注意:SetPrivilege 函数是我创建的。

而且工作也很好。
再次感谢。

Ok, thanks Dan Ports

That solved my problem.

The problem is permissions.
I configure these three permissions.

SetPrivilege(hpToken, SE_ASSIGNPRIMARYTOKEN_NAME, TRUE);
SetPrivilege(hpToken, SE_INCREASE_QUOTA_NAME, TRUE);
SetPrivilege(hpToken, SE_TCB_NAME, TRUE);

Note: SetPrivilege function I created.

And work's fine.
Thanks again.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文