WTS_INFO_CLASS WTSApplication Name возвращает пустую строку - PullRequest
0 голосов
/ 26 марта 2019

У меня есть простой сценарий входа в систему на моем Windows Server 2016, который записывает данные в базу данных при каждом подключении клиента.

На этом сервере я опубликовал приложение, скажем, например, Microsoft Paint.

После этого клиент может использовать это приложение удаленно, после того как он установил соединение в Панели управления -> Подключения к удаленному приложению и рабочему столу. Удаленное приложение, в нашем случае Microsoft Paint, появляется в меню «Пуск». Если он открыт, устанавливается обычное подключение к удаленному рабочему столу, и Microsoft Paint рисует удаленно.

Теперь мне нужно получить имя приложения, имя клиента, время открытия приложения и время закрытия приложения и записать все в базу данных.

wtsapi32 должен обеспечивать функциональность, необходимую для получения имени приложения . Внутри WTS_INFO_CLASS есть свойство WTSApplicationName.

К сожалению, он всегда возвращает пустую строку. Другие свойства, такие как WTSClientAdress, возвращают ожидаемые результаты.

Есть ли другой способ получения имени приложения?

Любая помощь будет принята с благодарностью! Заранее спасибо.

public static List<SessionInfo> GetServerActiveSessions(string serverName)
        {
            IntPtr server = IntPtr.Zero;
            List<SessionInfo> sessionInfos = new List<SessionInfo>();
            server = OpenServer(serverName);
            if (server != IntPtr.Zero)
            {
                try
                {
                    IntPtr ppSessionInfo = IntPtr.Zero;
                    Int32 count = 0;
                    if (WTSEnumerateSessions(server, 0, 1, ref ppSessionInfo, ref count))
                    {
                        Int32 dataSize = Marshal.SizeOf(typeof(WTS_SESSION_INFO));
                        Int32 current = (int)ppSessionInfo;
                        for (int i = 0; i < count; i++)
                        {

                            SessionInfo sessionInfo = new SessionInfo();
                            WTS_SESSION_INFO si = (WTS_SESSION_INFO)Marshal.PtrToStructure((System.IntPtr)current, typeof(WTS_SESSION_INFO));
                            current += dataSize;
                            sessionInfo.ApplicationName = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSApplicationName);
                            sessionInfo.ClientAddress = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientAddress);
                            sessionInfo.ClientBuildNumber = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientBuildNumber);
                            sessionInfo.ClientDirectory = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientDirectory);
                            sessionInfo.ClientDisplay = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientDisplay);
                            sessionInfo.ClientDirectory = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientDirectory);
                            sessionInfo.ClientHardwareId = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientHardwareId);
                            sessionInfo.ClientName = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientName);
                            sessionInfo.ClientProductId = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSClientProductId);
                            sessionInfo.ClientProtocolType = getProtocolType(QuerySessionInfo<short>(server, si.SessionID, WTS_INFO_CLASS.WTSClientProtocolType));
                            sessionInfo.ConnectState = QuerySessionInfo<WTS_CONNECTSTATE_CLASS>(server, si.SessionID, WTS_INFO_CLASS.WTSConnectState);
                            sessionInfo.DomainName = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSDomainName);
                            sessionInfo.InitialProgram = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSInitialProgram);
                            sessionInfo.OEMId = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSOEMId);
                            sessionInfo.SessionId = si.SessionID;
                            sessionInfo.UserName = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSUserName);
                            sessionInfo.WinStationName = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSWinStationName);
                            sessionInfo.WorkingDirectory = QuerySessionInfo(server, si.SessionID, WTS_INFO_CLASS.WTSWorkingDirectory);
                            sessionInfos.Add(sessionInfo);
                        }
                        WTSFreeMemory(ppSessionInfo);
                    }
                }
                finally
                {
                    CloseServer(server);
                }
            }
            return sessionInfos;
        }

...