0

他の誰かが、現在ログオンしているユーザーがWindows 7環境でリモートにいるのかを判断する必要がありましたか?.NET 4.0とC#を使用しています。環境はXPと7が混在しています。

  • セッションを含むWMIクエリでは、すべてのアクティブなセッションが生成されますが、インタラクティブなセッションは生成されません。
  • ComputerSystem(WMI)のUserNameは、ユーザーがリモートデスクトップ経由で接続している場合、null例外を返します。これは、このメソッドを使用できないほど一般的です。
  • PsLoggedOn私の目的には時間がかかりすぎて(はい、300ミリ秒は長すぎます)、驚くべきことに100%正確ではありません
  • p / invokeを使用するWTSGetActiveConsoleSessionIDか、LsaEnumerateLogonSessions複雑すぎてメモリリークが発生しやすい(私が読んだものから)
  • tasklist /S <computername>XPシステムの情報を返しますが、その素敵なUACのおかげでWindows7は満足のいくものではありません。
  • パーミッションの制限により、HKCU(winレジストリ)にリモートでアクセスできません。HKUにはアクセスできますが、VolatileEnvironmentには「アクティブ」のタグがないようです。

これまでのところ、最も信頼できる方法は、コマンドラインからPsExecリモートで実行qwinstaし、出力をテキストにリモートでトラバースすることです。これは面倒で時間がかかります(以上PsLoggedOn)が、信頼性のためにここでアイデアが不足しています。速度よりも信頼性がありますが、コストメリットの観点から速度は非常に重要です。

サードパーティのツールはオプションではなく、スクリプト、できればWMIとC#である必要があります。プリンシパルオブジェクトを使用してDCをヒットすることを掘り下げましたが、もっと混乱したのではないかと思います。また、すべてのユーザーアカウントは管理者です。

私はグーグルでたくさんの研究をしました、しかし私は多分私が間違った場所を見ていると思っています。

テイカーはいますか?

4

1 に答える 1

0

これは、 Win32_ComputerSystemクラスのUserNamePropertyを参照することで実現できます。

   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 に答える