Терминальные службы

HI,

Я использую Delphi, и я хочу создать приложение, которое может делать следующие

При запуске из служб терминалов (удаленный рабочий стол), если другой пользователь входит в другой сеанс служб терминалов, он должен иметь возможность видеть приложение, работающее на панели задач рабочего стола. Однако, если пользователь, сидящий за сервером, входит в систему, он не должен видеть запущенное приложение в области уведомлений рабочего стола. Это нормально, если все могут видеть его работающим в списке процессов, только не на панели задач рабочего стола.

Как я могу это сделать?


person There is no spoon    schedule 24.08.2010    source источник
comment
Можете ли вы привести пример существующего приложения с таким поведением?   -  person Paul-Jan    schedule 24.08.2010
comment
Не существует такой вещи, как панель рабочего стола (blogs. msdn.com/b/oldnewthing/archive/2003/09/10/54831.aspx). Либо вы имеете в виду панель задач (место, где обычно отображаются открытые окна), либо вы имеете в виду область уведомлений / на панели задач / рядом с часами. Просьба уточнить.   -  person Andreas Rejbrand    schedule 24.08.2010
comment
Мое предположение: приложение должно помещать значок уведомления в трее в каждый доступный удаленный сеанс, но не в сеансе консоли.   -  person ChristianWimmer    schedule 24.08.2010


Ответы (2)


Сделайте так, чтобы ваше приложение запускалось при запуске для каждого пользователя, а затем используйте эту функцию, чтобы определить, выходить или нет:

#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;
}

Получено с http://msdn.microsoft.com/en-us/library/aa383827(v=VS.85).aspx

person Ana Betts    schedule 24.08.2010

Предположение: вы входите в Windows Server - два человека не могут одновременно использовать RDP на настольных операционных системах. По моему опыту, вы не должны видеть приложения, работающие визуально, то есть на рабочем столе, на панели задач или в области значков в трее.

Если вы войдете в диспетчер задач и посмотрите на запущенные процессы - вы можете увидеть, что процесс запущен. Кроме того, если вы являетесь администратором, вы можете «убить» процесс, иначе вы ничего не сможете с этим поделать.

Это помогает?

Пожалуйста, поясните, о чем вы спрашиваете.

person MDV2000    schedule 24.08.2010
comment
Привет, извините, да, я имел в виду область лотка панели задач. В основном я хочу сделать следующее: пользователь входит в сеанс через удаленный рабочий стол (службы терминалов) и запускает приложение, которое находится на панели задач, а затем выходит из системы. Если другой пользователь входит в систему через удаленный рабочий стол, он должен увидеть запущенное приложение на панели задач. Однако пользователь, который вошел в систему локально на сервере, не должен видеть его работающим. - person There is no spoon; 25.08.2010