none
PCに登録されているユーザー名を取得する方法? RRS feed

  • 質問

  • 或る管理者権限でしか動作しないアプリケーションが有りまして、そのアプリケーション用ランチャーを作成しています。

     

    ランチャーにて、ユーザーがAdminstratorグループに所属していない場合はダイアログを表示して、管理者権限を持っているユーザー名とパスワードを入力してもらって、その別ユーザーでアプリケーションを起動(process.start)します。

    と、ここまでは作れたのですが、使い勝手を良くする為、runasのようにPC内に登録されているAdministratorグループ所属のユーザー名を探し出して、リストBOXに表示したいのですが、

     

    ---

    本日、若干進展しました。

    次のようにする事でグループ名がリストboxに列記できました。

     

                    DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName);

                    foreach (DirectoryEntry childAD in AD.Children)
                    {
                        if (childAD.SchemaClassName == "Group")
                        {
                            userlist.Items.Add(childAD.Name);
                        }
                    }

     

    更に、上記において、 childAD.SchemaClassName == "User"  とする事でユーザー名も得る事ができました。

    しかし、ActiveDirectoryに触れるのが初めて&よく理解できていないようで、Administratorグループ所属のユーザー名を得る手段が不明です。 アドバイス等、宜しくお願いいたします。

     

    環境

     VS2005Express C#

     .NetFramework2.0

     WindowsXP-SP2

    2008年3月9日 11:38

回答

  • Azuleanさんから教えていただいたリンクの内容を頼りに、試行錯誤の結果

    本当に正しいのか?落とし穴は無いのか?といった自信は無いものの、一応Adminユーザーの抽出はできました

     

                    DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName);
                    DirectoryEntry groupAD = AD.Children.Find("Administrators", "Group");

                    foreach (DirectoryEntry childAD in AD.Children)
                    {
                        if (childAD.SchemaClassName == "User")
                        {
                            if( (bool)groupAD.Invoke("IsMember",new object[]{childAD.Path.ToString()}))
                                userlist.Items.Add(childAD.Name);
                        }
                    }

    2008年3月12日 16:11
  • こういうページがある以上は取得できるのだと思いますが、どのように記述すればいいかまでは分かりませんでした。

    http://msdn2.microsoft.com/ja-jp/library/ms180906(VS.80).aspx

     

    2008年3月11日 14:57
    モデレータ

すべての返信

  • よくは知らないですが、Window Principalクラスぐらいで行けるかなと思ったんですが。

     

    無理ぽいです。(簡単(PG)で誰がどのグループに所属しているかはセキュリティ上できないのでは)

     

    で、netコマンドを起動させて出力を取得する方法なら確実です。(不細工ですが)

     

    >net user account

     

    (OSが代わらない限りフォーマットは変わらないと思います)

    2008年3月11日 10:55
  • こういうページがある以上は取得できるのだと思いますが、どのように記述すればいいかまでは分かりませんでした。

    http://msdn2.microsoft.com/ja-jp/library/ms180906(VS.80).aspx

     

    2008年3月11日 14:57
    モデレータ
  • 検索したのですが
    DirectoryEntry.Children.Findで出来そうですね。(失礼しました)

    (セキュリティ上、良いのかよて感じですが)

    2008年3月12日 3:00
  • 私もMSDN内を探し回ったのですが、LDAPでの事例は色々と見つかりますが、WINNTプロバイダについての記述がほとんど有りません。

     

    グループ階層Administratorsの下にAdmin所属のユーザー情報がぶら下がっているなら、

    DirectoryEntry.Children.Find("hogehoge","Adiministrators");

    で、Admin権限の有るhogehogeとマッチングするか?と期待しましたがXのような感じです。

    ---

    余談ですが、process.start()でユーザーアカウント指定してのEXE実行は、runas同様にパスワード無しのユーザーアカウントでは例外が発生して実行されませんが、スキャンされてパスワードが当てられればTheEndですね。

    ---

    という事で、ログオンアカウント以外の権限は検出できないようになっているのでしょうか?しかし、runasはちゃんとAdminアカウントだけ抜き出して表示してくれるのだが。

     

    私のプログラミング経験レベルではもうお手上げです.... トホホ

    2008年3月12日 13:48
  • Azuleanさんから教えていただいたリンクの内容を頼りに、試行錯誤の結果

    本当に正しいのか?落とし穴は無いのか?といった自信は無いものの、一応Adminユーザーの抽出はできました

     

                    DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName);
                    DirectoryEntry groupAD = AD.Children.Find("Administrators", "Group");

                    foreach (DirectoryEntry childAD in AD.Children)
                    {
                        if (childAD.SchemaClassName == "User")
                        {
                            if( (bool)groupAD.Invoke("IsMember",new object[]{childAD.Path.ToString()}))
                                userlist.Items.Add(childAD.Name);
                        }
                    }

    2008年3月12日 16:11