2016-07-08 3 views
0

Никакое количество googling не привлекло меня нигде с этим.Win32_LogonSession возвращает неправильное значение

У меня есть следующий код, который проверяет, вошли ли пользователи (пользователи) на ПК через консоль или RDP.

Он работает нормально, но проблема в том, что после выхода пользователя из системы WMI (или что-то еще) все еще думает, что они вошли в систему, и в этом случае возвращает true, когда он должен вернуть false.

Если я перезагружаю компьютер, он возвращается к 0, пока я не войду в систему.

Я согласен с тем, что это может быть ошибкой в ​​WMI, поэтому, если у кого-то есть лучшая альтернатива для достижения того же, я бы очень ценил совет.

public bool PCInUse(string Hostname) 
{ 
    ConnectionOptions connection = new ConnectionOptions(); 
    connection.Username = "username; 
    connection.Password = "password"; 

    ManagementScope scope = new ManagementScope("\\\\" + Hostname + "\\root\\CIMV2", connection); 
    try 
    { 
     scope.Connect(); 
     var Query = new SelectQuery("SELECT LogonId FROM Win32_LogonSession Where (LogonType= 10) or (LogonType= 2)"); 
     var Searcher = new ManagementObjectSearcher(scope, Query); 

     if (Searcher.Get().Count > 0) 
      return true; 
     else 
      return false; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+0

Что вы пытаетесь достичь именно? Вы хотите знать, зарегистрирован ли кто-нибудь? – Mark

ответ

0

Другой подход (предполагается, что ваш процесс работает как служба в локальной системе или какой-либо привилегированной учетной записи) будет получать все запущенные процессы, сделать список различных имен пользователей для этих процессов (за исключением всех системных учетных записей например «SYSTEM», «NETWORK SERVICE», «LOCAL SERVICE»), и любые оставшиеся уникальные пользовательские идентификаторы типов, включенных в ваше предложение «where» в запросе WMI, должны дать вам некоторую идею. Конечно, возможно, кто-то может настроить службу для запуска под учетной записью пользователя, и это может повредить вам, а на серверах, на которых запущено IIS или какое-то другое приложение, которое создает специальные учетные записи пользователей, вам, возможно, придется работать, исключая их.

Возможно, вам придется включить инверсию вашего запроса WMI выше, чтобы получить список неинтерактивных сессий и связанных с ними пользовательских идентификаторов, чтобы знать, что все исключить. Вы также можете просто искать те процессы, которые, как вы знаете, используются только в интерактивном сеансе (например, «dwm.exe» и «explorer.exe»).

Смежные вопросы