2010-11-03 55 views
1

我使用C#里面WMI获得“登录”当前的用户列表给机器的会议期间访问的共享:WMI报告用户注销后登录,如果

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();           
         } 
        } 

        ... 

这个伟大的工程,但似乎在某些情况下,即使在用户注销后,WMI仍会将其报告为已登录。一种特殊情况是该用户在会话期间访问网络共享。

反正有这个吗?也许是测试会话以查看它是作为共享创建还是活动的方式?

任何提示将不胜感激。

回答

1

即使用户已经注销,因为您远程访问了另一台计算机的文件,连接仍然保持打开一段时间。

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

查找下运行> CMD> netstat的-a。在通过Windows资源管理器建立到另一台计算机的连接后,应该会看到名为microsoft-ds的连接。除此之外,这是Microsoft用于文件传输的服务。如果您看到TIME_WAIT或CLOSE_WAIT,即使您用于访问文件的窗口关闭,连接仍处于打开状态。

您可以通过使用“handle.exe”程序来检查此问题,这是微软提供的一个工具,它是Sysinternals的一部分,可以提供有关哪个部分仍处于活动状态的信息。这应该包括注册表键,端口,作品。

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

WMI可报告说,用户仍然登录,因为一个端口或连接尚未关闭,是由用户发起的。这种类型的事情引起了我们一些头痛的问题,所以我们使用handle.exe来转储任何保持为用户打开的配置单元,然后在我们执行任何配置文件维护(作为自动化)之前系统地终止/关闭所有配置。

当然,重新启动电脑总是有效。 =)