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

时间:2013-02-17 23:09:58

标签: c# windows-7 cmd wmi

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

  • 涉及会话的WMI查询会导致所有活动会话,但不会导致交互会话。
  • 如果用户通过远程桌面连接,则ComputerSystem(WMI)中的UserName将返回null异常,这种情况很常见,因此无法使用此方法。
  • PsLoggedOn用于我的目的需要太长时间(是的,300毫秒太长)并且100%的时间出乎意料地不准确
  • WTSGetActiveConsoleSessionIDLsaEnumerateLogonSessions使用p / invoke过于复杂,容易出现内存泄漏(从我读过的内容)
  • tasklist /S <computername>将返回XP系统的信息,但由于可爱的UAC,Windows 7将不会令人满意。
  • 由于权限限制,HKCU(win注册表)无法远程访问,HKU可访问,但Volatile Environment似乎没有“active”标记

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

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

我已经对谷歌进行过很多研究,但我在想,也许我正在寻找错误的地方。

任何参赛者?

2 个答案:

答案 0 :(得分:0)

您可以通过浏览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"]);
    }

答案 1 :(得分:-1)

我想最好的方法是使用System.Environment.UserInteractive