Существует встроенный инструмент: query.exe
который позволяет просматривать всех активных пользователей и сеансы в Windows.
Вывод выглядит следующим образом:
PS C:\> query.exe user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>testusr console 1 Active none 12/16/2014 9:29 AM
Прямо сейчас у меня есть код, который просто анализирует вывод query.exe
, но некоторые из нас обеспокоены тем, что будущие обновления ОС могут изменить вывод запроса, поэтому мы ищем вызов API, который можно использовать вместо него.
Есть в любом случае.Net способ собрать ту же информацию?
Для альтернатив нам не нужны все поля, но нам нужны: имя пользователя, состояние и время входа в систему. Нам также нужно запустить этот код из контекста системы, поэтому любые классы кода или WMI, требующие контекста пользователя, не будут работать для нас.
Вы можете просто получить последнее время входа в систему с помощью WMI:
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_LogonSession");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_LogonSession instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("Last Logon: {0}", queryObj["StartTime"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}
}
root\\CIMV2
WMI root\\CIMV2
?
Ну, что я нашел, и я думаю, что это может быть полезно для вас - проект Cassia.
На главной странице почти готов:
ITerminalServicesManager manager = new TerminalServicesManager();
using (ITerminalServer server = manager.GetLocalServer())
{
server.Open();
foreach (ITerminalServicesSession session in server.GetSessions())
{
Console.WriteLine("Hi there, " + session.UserAccount + " on session " + session.SessionId);
Console.WriteLine("It looks like you logged on at " + session.LoginTime +
" and are now " + session.ConnectionState);
}
}
Как вы можете видеть, когда вы получаете TerminalServicesSession, вы найдете UserName, LoginTime и ConnectionState.
Надеюсь, что это поможет вам.
Похоже, вы хотите NetWkstaUserEnum
. Я не мог найти родную версию.NET, но это похоже на довольно легкий вызов interop.