С WindowsService, как я могу найти в настоящее время вошли в систему пользователя из C #? - PullRequest
2 голосов
/ 15 августа 2011

Я запускаю службу windows под учетной записью администратора и хотел бы узнать, кто в данный момент вошел в систему. Это будет отличаться от учетной записи, под которой в данный момент работает WindowService. Есть ли простой способ получить его из c #?

Это не: System.Security.Principal.WindowsIdentity.GetCurrent () ни System.Environment.UserName

спасибо

редактировать

Мне интересно, кто в данный момент вошел в систему с помощью консоли. спасибо jadarnel27

Меня не интересуют другие удаленные сеансы, поскольку это не мой сценарий.

Ответы [ 5 ]

6 голосов
/ 15 августа 2011

1) Cassia должна предоставить вам список зарегистрированных пользователей, включая RDC.

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions())
{
    // sess.SessionId
    // sess.UserName
}

2) WMI (SO answer )

Select * from Win32_LogonSession

3) PInvoke to WTSEnumerateSessions

4) Перечислить все экземпляры "explorer.exe" и получить владельца с помощью PInvoke ( OpenProcessHandle ).

Process[] processes = Process.GetProcessesByName("explorer");

Это немного глупо. WMI также может использоваться для этого.

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

2 голосов
/ 15 августа 2011

Возможно, вы захотите взглянуть на Кассию :

Cassia - это библиотека .NET для доступа к собственному API-интерфейсу Windows Terminal Services (теперь это API-интерфейс служб удаленных рабочих столов). Его можно использовать из C #, Visual Basic .NET или любого другого языка .NET.

и

Перечисление сеансов терминалов и информация о сеансах отчетов, включая состояние соединения, имя пользователя, имя клиента, детали отображения клиента ...

0 голосов
/ 15 августа 2011

Список пользователей, которые в настоящее время вошли в консольные сеансы, можно получить через WMI.Вам нужно будет добавить ссылку на System.Management.dll:

public static List<string> GetLoggedOnUsers(CacheLevel level)
{
    const int ConsoleSession = 2;

    string logonQuery = "SELECT * FROM Win32_LogonSession WHERE LogonType = " + ConsoleSession;

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(logonQuery);

    List<string> userNames = new List<string>();

    foreach (ManagementBaseObject logon in searcher.Get())
    {
        string logonId = logon.Properties["LogonId"].Value.ToString();

        string userQuery = "ASSOCIATORS OF {Win32_LogonSession.LogonId=" + logonId + "} "
                           + "WHERE AssocClass=Win32_LoggedOnUser Role=Dependent";

        ManagementObjectSearcher searcher2 = new ManagementObjectSearcher(userQuery);

        foreach (ManagementBaseObject user in searcher2.Get())
        {
            string name = user.Properties["FullName"].Value.ToString();

            userNames.Add(name);
        }
    }

    return userNames.Distinct().ToList();
}
0 голосов
/ 15 августа 2011

Использование локального центра безопасности для перечисления пользовательских сессий в .NET http://www.codeproject.com/KB/system/LSAEnumUserSessions.aspx

Функция WTSQuerySessionInformation http://msdn.microsoft.com/en-us/library/aa383838%28v=vs.85%29.aspx

0 голосов
/ 15 августа 2011

Попробуйте,

http://www.codeproject.com/KB/vb/Windows_Service.aspx

Довольно простая идея, просто просматривает активные процессы, чтобы найти «explorer.exe» и перечисляет пользователя, под которым он работает.Возможно, придется настроить, если у вас есть несколько пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...