none
イベントログに表示されるログオンIDの取得について RRS feed

  • 質問

  • 現在、アプリケーションで独自のログを作成しようとしています。
    そのログで、WindowsのログオンIDを出力させたいと思っています。

    ここでの、ログオンIDはAdministratorのようなユーザ名ではなく、
    セキュリティポリシーの監査ポリシーを有効にした場合に記録されるイベントの情報に出力されているものです。
    以下の例の(0x0,0x230A20)になります。

    ---------------------------------------------
    説明:
    ログオンの成功:
      ユーザー名: Administrator
      ドメイン:  Server01
      ログオン ID:  (0x0,0x230A20) 
    ---------------------------------------------

    WMI Code Creatorをダウンロードして調査したところ、
    以下のコードで現在、ログオンしているユーザのログオンID一覧を取得できることがわかりました。
    Administratorsグループ以外のユーザの場合、自分のログオンID以外取得できないのですが、
    Administratorsのユーザの場合、他のユーザのログオンIDも取得できるため、
    自分のログオンIDが何であるかを知ることができません。
    自分のログオンIDのみを取得するよい方法はないでしょうか?

    ----------------------------------------
    using System;
    using System.Management;
    using System.Windows.Forms;

    namespace WMISample
    {
        public class MyWMIQuery
        {
            public static void Main()
            {
                try
                {
                    ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher("root\\CIMV2",
                        "SELECT * FROM Win32_LogonSession");

                    foreach (ManagementObject queryObj in searcher.Get())
                    {
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine("Win32_LogonSession instance");
                        Console.WriteLine("-----------------------------------");
                        Console.WriteLine("LogonId: {0}", queryObj["LogonId"]);
                    }
                }
                catch (ManagementException e)
                {
                    MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
                }
            }
        }
    }

    ---------------------------------------------

    以上、よろしくお願いします。

    2008年10月25日 12:47

回答

  • Code Snippet

    RelatedObjectQuery relatedQuery = new RelatedObjectQuery("associators of {Win32_LogonSession.LogonId='" + queryObj["LogonId"] + "'}");
    relatedQuery.RelationshipClass = "win32_LoggedonUser";
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", relatedQuery);

     

    var mob = searcher.Get().OfType<ManagementObject>()
         .SingleOrDefault<ManagementObject>(_ => _["Name"].ToString() == Environment.UserName);

     

     

    として、mobが取得できれば自分のログオンIDでいいかなぁ?

    2008年10月26日 3:54
    モデレータ

すべての返信

  • Code Snippet

    RelatedObjectQuery relatedQuery = new RelatedObjectQuery("associators of {Win32_LogonSession.LogonId='" + queryObj["LogonId"] + "'}");
    relatedQuery.RelationshipClass = "win32_LoggedonUser";
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", relatedQuery);

     

    var mob = searcher.Get().OfType<ManagementObject>()
         .SingleOrDefault<ManagementObject>(_ => _["Name"].ToString() == Environment.UserName);

     

     

    として、mobが取得できれば自分のログオンIDでいいかなぁ?

    2008年10月26日 3:54
    モデレータ
  • ありがとうございます!

     

    win32_LoggedonUserというのがあるんですね。

    今、実機がないので試せませんが、

    いただいた、コードの場合、AdministratorがConsole、RDPから同時にログオンしてる場合も対応できるかが気になるところです。

     

    自分でももう少し調べてみます。

    ありがとうございました。

     

    2008年10月27日 12:41
  • こんにちは!
    フォーラム オペレーターの田中 麻記子です。
    trapemiyaさん、ご回答ありがとうございます、
    it74dさん、フォーラムのご利用ありがとうございます。

    trapemiyaさんの回答が参考になったようですので私の方で回答済みチェックを付けさせていただきました。
    もしよろしければ、この件のその後などを教えていただけましたら大変有り難いです。
    また、何かございましたら是非フォーラムをご利用ください。
    では!

     

    2008年11月6日 5:00