получить количество зарегистрированных пользователей в системе из службы - PullRequest
1 голос
/ 03 октября 2010

Я хочу узнать из службы Windows (учетной записи локальной системы) количество зарегистрированных пользователей в системе. Я реализовал этот метод в своей службе Windows:

  protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        base.OnSessionChange(changeDescription);
        switch (changeDescription.Reason)
        {
            case SessionChangeReason.SessionLogon:
                userCount += 1;
                break;

            case SessionChangeReason.SessionLogoff:
                userCount -= 1;
                break;
            case SessionChangeReason.RemoteConnect:
                userCount += 1;
                break;

            case SessionChangeReason.RemoteDisconnect:
                userCount -= 1;
                break;

            default:
                break;
        }
    }

Проблема в том, что если я запускаю эту службу вручную из сеанса пользователя, а не при запуске системы, переменная userCount = 0, а когда я запускал службу, вошел ли пользователь? Как я могу получить номер вошедшего в систему пользователя в данный момент? Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 09 июля 2013

Это старая тема, но я хотел опубликовать ее, если кому-то понадобится дополнительная информация.Я нашел эту статью, которая показывает, как использовать LsaEnumerateLogonSessions, а также мой код с помощью System.Management.

Для LsaEnumerateLogonSessions:
http://www.codeproject.com/Articles/18179/Using-the-Local-Security-Authority-to-Enumerate-Us

Для System.Management:

    System.Management.ConnectionOptions connOptions = new System.Management.ConnectionOptions();
    System.Collections.Generic.List<string> sessionIDs = new System.Collections.Generic.List<string>();

    connOptions.Impersonation = System.Management.ImpersonationLevel.Impersonate;
    connOptions.EnablePrivileges = true;

    try
    {

        //Use "." for the local computer, or a computer name or IP address for a remote computer.
        string compName = ".";
        System.Management.ManagementScope manScope =
            new System.Management.ManagementScope(
                String.Format(@"\\{0}\ROOT\CIMV2", compName), connOptions);
        manScope.Connect();

        System.Management.SelectQuery selectQuery = new System.Management.SelectQuery("Select SessionId from Win32_Process");

        using (System.Management.ManagementObjectSearcher searcher =
        new System.Management.ManagementObjectSearcher(manScope, selectQuery))
        {
            foreach (System.Management.ManagementObject proc in searcher.Get())
            {
                string id = proc["SessionId"].ToString();
                //Skip session 0, which is the system session.
                if (id != "0")
                {
                    sessionIDs.Add(id);
                }
            }
        }

        //remove the dups.
        sessionIDs = sessionIDs.Distinct().ToList();

        foreach (string id in sessionIDs)
        {
            System.Diagnostics.Debug.Print(id);
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.Print(ex.Message);
    }
1 голос
/ 03 октября 2010

Вы можете p / invoke LsaEnumerateLogonSessions ():

[DllImport("Secur32.dll", SetLastError = false)]
private static extern uint LsaEnumerateLogonSessions(out UInt64 logonSessionCount, out IntPtr logonSessionList);
[DllImport("secur32.dll", SetLastError = false)]
private static extern uint LsaFreeReturnBuffer(IntPtr buffer);

Первый параметр будет содержать количество зарегистрированных пользователей, если функция завершится успешно.Вы должны немедленно освободить массив LUID, возвращенный во втором параметре, используя LsaFreeReturnBuffer (), чтобы избежать утечек.

EDIT: LsaEnumerateLogonSessions () также возвращает неинтерактивные сеансы, поэтому вам необходимовызовите LsaGetLogonSessionData () для каждого LUID, чтобы проверить, является ли он интерактивным.Так что лучше использовать WMI, как предложил Unmesh, поскольку вам не придется перебирать IntPtr.Алгоритм остается тем не менее.

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