在Windows 7计算机上远程确定交互式/活动用户

本文关键字:交互式 活动 用户 程确定 Windows 计算机 | 更新日期: 2023-09-27 18:00:04

在Windows7环境中,其他人必须确定当前登录的用户是谁?我使用的是.NET 4.0和C#。环境是XP和7。

  • 涉及会话的WMI查询会生成所有活动会话,但不会生成交互式会话
  • 如果用户是通过远程桌面连接的,则ComputerSystem(WMI)中的UserName返回null异常,这种情况很常见,无法使用此方法
  • PsLoggedOn对我来说太长了(是的,300毫秒太长了),而且令人惊讶的是,它在100%的时间内都不准确
  • WTSGetActiveConsoleSessionIDLsaEnumerateLogonSessions使用p/invoke过于复杂,并且容易发生内存泄漏(根据我所读到的内容)
  • tasklist /S <computername>将返回XP系统的信息,但由于有了可爱的UAC,Windows7将不受欢迎
  • 由于权限限制,HKCU(winregistry)无法远程访问,HKU可以访问,但挥发性环境似乎没有"活动"标签

到目前为止,最可靠的方法是使用PsExec从命令行远程执行qwinsta,并远程遍历输出到文本。这很烦人,而且需要时间(比PsLoggedOn还多),但我在这里已经没有可靠性的想法了。可靠性先于速度,但速度在成本效益方面非常重要。

第三方工具不是一个选项,必须是一个脚本,最好是WMI和C#。我深入研究了使用Principal对象访问DC,但我担心我可能会更加困惑自己。此外,所有用户帐户都是管理员。

我对谷歌做了很多研究,但我想也许我找错地方了。

有人接电话吗?

在Windows 7计算机上远程确定交互式/活动用户

您可以通过浏览Win32_ComputerSystem类的UserName属性:来实现这一点

   ConnectionOptions con = new ConnectionOptions();
   con.Username = "Administrator";
   con.Password = "********";
   ManagementScope scope = new ManagementScope(@"''" + strIPAddress + @"'root'cimv2", con);
   scope.Connect();
//check for scope.IsConnected, then process
   ManagementObjectSearcher searcher =new ManagementObjectSearcher(@"''" + strIPAddress + @"'root'cimv2", "SELECT * FROM Win32_ComputerSystem"); 
   foreach (ManagementObject queryObj in searcher.Get())
    {
      Console.WriteLine("-----------------------------------");
      Console.WriteLine("Win32_ComputerSystem instance");
      Console.WriteLine("-----------------------------------");
      Console.WriteLine("UserName: {0}", queryObj["UserName"]);
    }