2010-11-03 7 views
1

J'utilise WMI intérieur C# pour obtenir une liste des utilisateurs « connectés » à une machine:rapports WMI utilisateur connecté après la fermeture de session si une action a été consulté au cours de la session

ManagementScope ms = new ManagementScope(ManagementPath.DefaultPath); 

    var q = new SelectQuery("Win32_LoggedOnUser"); 
    using (var query = new ManagementObjectSearcher(ms, q)) { 
     using (var results = query.Get()) { 
      foreach (var r in results) { 
       using (var o = new ManagementObject(r["Dependent"].ToString())) {      
        var logonType = o["LogonType"]; 

        if (logonType == "2") { 
         // Interactive user is logged in, retrieve the name 
         using (var userObj = new ManagementObject(r["Antecedent"].ToString())) { 
          name = userObj["Name"].ToString();           
         } 
        } 

        ... 

Cela fonctionne très bien , mais il semble que dans certains cas, même après la déconnexion de l'utilisateur, WMI signale toujours qu'il est connecté. Un cas particulier est lorsque cet utilisateur accède à un partage réseau au cours de la session.

Y a-t-il un endroit autour de ça? Peut-être un moyen de tester une session pour voir si elle a été créée en partage ou si elle est active?

Tous les conseils seraient grandement appréciés.

Répondre

1

Même si l'utilisateur s'est déconnecté, car vous avez accédé à distance aux fichiers d'un autre ordinateur, la connexion reste ouverte pendant un certain temps.

https://superuser.com/questions/173535/what-are-close-wait-and-time-wait-states

Rechercher sous Exécuter> cmd> netstat -a. Vous devriez voir une connexion appelée microsoft-ds après que vous avez établi une connexion via l'Explorateur Windows à un autre ordinateur. C'est le service que Microsoft utilise pour les transferts de fichiers, entre autres choses. Si vous voyez un TIME_WAIT ou un CLOSE_WAIT, la connexion est toujours ouverte même si la fenêtre que vous avez utilisée pour accéder aux fichiers est fermée.

Vous pouvez vérifier cela par programme en utilisant "handle.exe", un outil fourni par Microsoft qui fait partie de Sysinternals, qui sera en mesure de fournir des informations sur la partie de la ruche qui est toujours active. Cela devrait inclure les clés de registre, les ports, les travaux.

http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

WMI peut être rapporte que l'utilisateur est toujours connecté, car un port ou d'une connexion n'a pas été fermée initiée par l'utilisateur. Ce type de problème nous a causé quelques soucis, nous utilisons donc handle.exe pour vider tout ce qui maintient la ruche ouverte pour un utilisateur, puis la tuer/la fermer systématiquement avant de faire une maintenance de profil (en tant qu'automatisation).

Bien sûr, redémarrer l'ordinateur fonctionne toujours. =)

Questions connexes