Как узнать, активен ли интерактивный сеанс из службы Windows? - PullRequest
0 голосов
/ 25 апреля 2019

Я кодирую службу Windows, и в одном месте мне нужно знать, существует ли активный интерактивный сеанс.

Я пытался использовать OnSessionChange () и сохранить в переменной последний SessionChangeReason.Когда я дохожу до упомянутой точки, я сравниваю, если она равна SessionChangeReason.SessionLogOn.Это работает с неудобством, что служба имеет отложенный запуск, поэтому, если пользователь входит в систему до запуска службы, эта информация теряется.

Я также видел свойство System.Environment.Interactive, но, как я понимаю, этоотносится к процессу текущего сервиса, который не является интерактивным, поэтому он не даст мне нужную информацию (хотя я могу неправильно это понять).

Есть ли способ получить эту информацию 'по запросу'без необходимости вести реестр SessionChangeReason?

Редактировать: Может быть, я не совсем понял об этом.Помимо того, что я знаю, что есть интерактивный сеанс, мне также нужно знать, что он не заблокирован.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

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

Если известно только, что существует активный сеансработает для вас, и вы не хотите использовать pInvoke, вы можете также:

a) Поиск процесса проводника

Process[] ps = Process.GetProcessesByName("explorer");
bool explorerActive = (ps.Length > 0);

b) Используйте следующий запрос WMI, чтобы получить имя пользователя дляактивный сеанс:

using System.Management;

ConnectionOptions oConn = new ConnectionOptions();
ManagementScope oMs = new ManagementScope("\\\\localhost", oConn);

ObjectQuery oQuery = new ObjectQuery("select * from Win32_ComputerSystem");
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
ManagementObjectCollection oReturnCollection = oSearcher.Get();


foreach (ManagementObject oReturn in oReturnCollection)
{
    if (oReturn["UserName"] == null)
    {
        // No active session
        Console.Write("UserName: null");
    }
    else
    {
        // Active session
        Console.Write("UserName: " + oReturn["UserName"].ToString());
    }                            
}

Если вы хотите использовать pInvoke, см. ответ Андерса.

0 голосов
/ 25 апреля 2019

P / Invoke WTSEnumerateSessions, чтобы увидеть, существуют ли дополнительные сеансы и каковы их подключенные состояния. Вы, очевидно, должны игнорировать сессию 0 на Vista +.

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

...