2016-07-08 32 views
0

私はこれでどこでもグーグルで遊んでいません。Win32_LogonSessionが間違った値を返します

ユーザーがコンソールまたはRDP経由でPCにログオンしているかどうかを確認する次のコードがあります。

これは正常に実行されますが、ユーザーがログオフした後でもWMI(またはどこかのどこか)がログオンしていると考えていて、この場合はfalseを返すときにtrueを返します。

PCを再起動すると、ログインするまで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"など)と、WMIクエリの "where"句に含まれているタイプの残りの一意のユーザIDは、あなたにいくつか考えてください。確かに、誰かがユーザーアカウントで実行するサービスをセットアップしている可能性があり、それはあなたのためにそれを上回るかもしれませんし、IISや特別なユーザーアカウントを作成する他のアプリケーションを実行しているサーバーでは、

上記以外のWMIクエリの逆数を含めると、非対話型セッションのリストと、それらに関連付けられているすべてのユーザーアイデンティティがすべて除外されることを知る必要があります。また、対話型セッション(「dwm.exe」や「explorer.exe」など)でのみ使用されていることがわかっているプロセスを探すこともできます。

関連する問題