Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 终端服务_Windows_Delphi_Remote Desktop_Terminal Services - Fatal编程技术网

Windows 终端服务

Windows 终端服务,windows,delphi,remote-desktop,terminal-services,Windows,Delphi,Remote Desktop,Terminal Services,嗨 我使用的是Delphi,我想做一个应用程序,可以做到以下几点 从终端服务(远程桌面)内启动时,如果另一个用户登录到另一个终端服务会话,他们应该能够看到应用程序在桌面托盘中运行。但是,如果坐在服务器旁的用户登录,那么他们不应该看到应用程序在桌面托盘中运行。如果每个人都能看到它在进程列表中运行,而不是在桌面托盘中运行,那就好了 我该怎么做?假设:您正在登录Windows服务器-两个人不能同时在桌面操作系统上进行RDP。我的经验是,您不应该看到应用程序以可视方式运行,即在桌面上、任务栏或任务栏图标

我使用的是Delphi,我想做一个应用程序,可以做到以下几点

从终端服务(远程桌面)内启动时,如果另一个用户登录到另一个终端服务会话,他们应该能够看到应用程序在桌面托盘中运行。但是,如果坐在服务器旁的用户登录,那么他们不应该看到应用程序在桌面托盘中运行。如果每个人都能看到它在进程列表中运行,而不是在桌面托盘中运行,那就好了


我该怎么做?

假设:您正在登录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)之类的东西。您指的是任务栏(通常显示打开的窗口的位置),或者您指的是任务栏/的通知区域,位于时钟旁边。请澄清。我的猜测是:应用程序应该在每个远程会话中都放置一个托盘通知图标,但在控制台会话中没有。嗨,对不起,是的,我指的是任务栏托盘区域。基本上,我想做的是:用户通过远程桌面(终端服务)登录到会话,启动任务栏托盘中的应用程序,然后注销。如果其他用户通过远程桌面登录,他们应该会看到应用程序正在任务栏托盘中运行。但是,在服务器上本地登录的用户不应看到它正在运行。