Запрос пользовательских сессий в Windows

1

Существует встроенный инструмент: 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, требующие контекста пользователя, не будут работать для нас.

  • 0
    Не уверен, что есть .NET API для получения информации, но один из способов - вызвать query.exe через объект Process и прочитать / проанализировать вывод.
  • 0
    Я действительно делаю это прямо сейчас. Но некоторые люди обеспокоены тем, что выходные данные Query могут изменяться со временем и что вместо этого следует использовать прямой вызов API (если он найден).
Показать ещё 6 комментариев
Теги:

3 ответа

2

Вы можете просто получить последнее время входа в систему с помощью 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);
            }
        }
    }
}
  • 0
    Разрешения для доступа к root\\CIMV2 WMI root\\CIMV2 ?
2

Ну, что я нашел, и я думаю, что это может быть полезно для вас - проект 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.

Надеюсь, что это поможет вам.

1

Похоже, вы хотите NetWkstaUserEnum. Я не мог найти родную версию.NET, но это похоже на довольно легкий вызов interop.

  • 0
    Это выглядит многообещающе, я посмотрю и посмотрю, что из этого получится.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню