0

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

  • 涉及会话的 WMI 查询会导致所有活动会话,但不是交互式会话。
  • 如果用户通过远程桌面连接,则来自 ComputerSystem (WMI) 的 UserName 返回 null 异常,这很常见,无法使用此方法。
  • PsLoggedOn对我的目的来说太长了(是的,300 毫秒太长了)并且令人惊讶地不是 100% 的时间准确
  • 使用 p/invoke for WTSGetActiveConsoleSessionIDorLsaEnumerateLogonSessions太复杂并且容易出现内存泄漏(根据我的阅读)
  • tasklist /S <computername>将返回 XP 系统的信息,但由于那个可爱的 UAC,Windows 7 不会令人愉快。
  • 由于权限限制,无法远程访问 HKCU(win 注册表),可以访问 HKCU,但 Volatile Environment 似乎没有“活动”标签

到目前为止,最可靠的方法是使用从命令行PsExec远程执行并远程遍历输出到文本。qwinsta这很烦人并且需要时间(超过PsLoggedOn),但我在这里没有足够的想法来确保可靠性。可靠性先于速度,但就成本效益而言,速度非常重要。

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

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

有接盘侠吗?

4

1 回答 1

0

您可以通过浏览Win32_ComputerSystem类的UserNamePropperty 来实现:

   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"]);
    }
于 2013-02-18T07:08:32.683 回答