Windows 终端服务
嗨 我使用的是Delphi,我想做一个应用程序,可以做到以下几点 从终端服务(远程桌面)内启动时,如果另一个用户登录到另一个终端服务会话,他们应该能够看到应用程序在桌面托盘中运行。但是,如果坐在服务器旁的用户登录,那么他们不应该看到应用程序在桌面托盘中运行。如果每个人都能看到它在进程列表中运行,而不是在桌面托盘中运行,那就好了Windows 终端服务,windows,delphi,remote-desktop,terminal-services,Windows,Delphi,Remote Desktop,Terminal Services,嗨 我使用的是Delphi,我想做一个应用程序,可以做到以下几点 从终端服务(远程桌面)内启动时,如果另一个用户登录到另一个终端服务会话,他们应该能够看到应用程序在桌面托盘中运行。但是,如果坐在服务器旁的用户登录,那么他们不应该看到应用程序在桌面托盘中运行。如果每个人都能看到它在进程列表中运行,而不是在桌面托盘中运行,那就好了 我该怎么做?假设:您正在登录Windows服务器-两个人不能同时在桌面操作系统上进行RDP。我的经验是,您不应该看到应用程序以可视方式运行,即在桌面上、任务栏或任务栏图标
我该怎么做?假设:您正在登录Windows服务器-两个人不能同时在桌面操作系统上进行RDP。我的经验是,您不应该看到应用程序以可视方式运行,即在桌面上、任务栏或任务栏图标区域 如果您进入任务管理器并查看正在运行的进程,您可能会看到正在运行的进程。另外,如果您是管理员,那么您可能会“杀死”该进程,否则您将无能为力 这有用吗
请澄清你的问题 在每个用户启动时启动应用程序,然后使用此功能确定是否退出:
#include <windows.h>
#include <winternl.h>
BOOL IsRunningOnTerminalServerClient( void )
{
PWINSTATIONQUERYINFORMATIONW WinStationQueryInformationW;
WINSTATIONINFORMATIONW wsInfo;
HINSTANCE hInstWinSta;
ULONG ReturnLen;
hInstWinSta = LoadLibraryA( "winsta.dll" );
if( hInstWinSta )
{
WinStationQueryInformationW = (PWINSTATIONQUERYINFORMATIONW)
GetProcAddress( hInstWinSta, "WinStationQueryInformationW" );
if( WinStationQueryInformationW &&
WinStationQueryInformationW( SERVERNAME_CURRENT,
LOGONID_CURRENT,
WinStationInformation,
&wsInfo,
sizeof(wsInfo),
&ReturnLen ) &&
( wsInfo.LogonId != 0 ) )
{
FreeLibrary( hInstWinSta );
return( TRUE );
}
FreeLibrary( hInstWinSta );
}
return FALSE;
}
#包括
#包括
BOOL正在运行InterminalServerClient(无效)
{
pInstallationQueryInformationW WinStationQueryInformationW;
WINSTATIONINFORMATIONW wsInfo;
欣斯坦欣斯特温斯塔;
乌隆·瑞伦;
hInstWinSta=LoadLibraryA(“winsta.dll”);
如果(辛斯特温斯塔)
{
WinStationQueryInformationW=(pInstallationQueryInformationW)
GetProcAddress(hInstWinSta,“WinStationQueryInformationW”);
如果(WinStationQueryInformationW&&
WinStationQueryInformationW(服务器名称\u当前,
LOGONID_电流,
温斯顿信息,
&wsInfo,
sizeof(wsInfo),
&返回(LEN)&&
(wsInfo.LogonId!=0))
{
免费图书馆(hInstWinSta);
返回(真);
}
免费图书馆(hInstWinSta);
}
返回FALSE;
}
从中提取您能提供一个具有这种行为的现有应用程序的示例吗?没有“桌面托盘”(desktop tray)之类的东西。您指的是任务栏(通常显示打开的窗口的位置),或者您指的是任务栏/的通知区域,位于时钟旁边。请澄清。我的猜测是:应用程序应该在每个远程会话中都放置一个托盘通知图标,但在控制台会话中没有。嗨,对不起,是的,我指的是任务栏托盘区域。基本上,我想做的是:用户通过远程桌面(终端服务)登录到会话,启动任务栏托盘中的应用程序,然后注销。如果其他用户通过远程桌面登录,他们应该会看到应用程序正在任务栏托盘中运行。但是,在服务器上本地登录的用户不应看到它正在运行。