Как проверить, что ни один пользователь не вошел в систему с помощью C # в Windows 7? - PullRequest
0 голосов
/ 13 сентября 2010

Я использую C # Windows Forms.Есть ли простой способ проверить, не вошли ли пользователи в систему?

Ниже приведен код, который я использовал для XP, который, похоже, не работает в Windows 7, когда пользователь вышел из системы.

    private bool LoggedInUser()
    {
        bool loggedIn = true;
        Process[] aProc = Process.GetProcessesByName("explorer");
        if (aProc.Length <= 0)
        {
            loggedIn = false;
        }
        return loggedIn;
    }

Спасибо:)

[править]: Программа выполняется планировщиком задач, а не пользователем.

Ответы [ 4 ]

1 голос
/ 13 сентября 2010

Вы можете использовать библиотеку Cassia для просмотра активных сеансов входа в систему.

0 голосов
/ 13 сентября 2010

Перечисление для explorer.exe всегда было некорректным, не только в Windows 7. Для пользовательского сеанса необязательно требуется, чтобы explorer.exe был оболочкой по умолчанию, поэтому процесс с именем explorer вполне может не выполняться. И перечисляющие процессы требуют привилегий, которые обычные C # приложения Windows не хранят.

Правильный способ найти сеанс пользователя - перечислить его через LsaEnumerateLogonSessions. Другой альтернативой является использование WMI и соединение класса Win32_LogonSession.

0 голосов
/ 13 сентября 2010

Теоретически вы не можете запустить такую ​​программу, потому что она запущена и активирована, когда пользователь вошел в систему!

Подумайте о старом процессе ведения журнала Windows 2000 / XP, который использует GINA (Графическая идентификация и аутентификация), при которой при проверке учетных данных для входа в систему он запускает проводник процессов, который, в свою очередь, активирует приложения запуска и однократного выполнения при входе в систему.

Процесс входа в систему теперь обновляется и обновляется.Единственный способ узнать о текущих сеансах - это неуправляемый код, процесс, который запускается до диалогового окна учетных данных для входа в систему ....

0 голосов
/ 13 сентября 2010

Вы можете запустить / вызвать Win32 API WTSEnumerateSessions / WTSEnumerateSessionsEx , чтобы получить список всех текущих сеансов. Я думаю, что у вас был бы сеанс 0, только если нет зарегистрированных пользователей в Vista и Win7. Лучший способ проверить это с помощью этого метода - проверить параметр имени пользователя pUserName из варианта Ex.

В качестве альтернативы (и, возможно, более просто) вы можете использовать WTSGetActiveConsoleSessionId и проверить результат возврата или 0xFFFFFFFF.

//Supported for XP and up
[DllImport("kernel32.dll")]
private static extern uint WTSGetActiveConsoleSessionId();

public static bool HasLoggedInUsers()
{
   uint result = WTSGetActiveConsoleSessionId();
   return result != 0xFFFFFFFF;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...