У меня есть простой сценарий входа в систему на моем 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;
}