トップ回答者
PCに登録されているユーザー名を取得する方法?

質問
-
或る管理者権限でしか動作しないアプリケーションが有りまして、そのアプリケーション用ランチャーを作成しています。
ランチャーにて、ユーザーが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
回答
-
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);
}
} -
こういうページがある以上は取得できるのだと思いますが、どのように記述すればいいかまでは分かりませんでした。
http://msdn2.microsoft.com/ja-jp/library/ms180906(VS.80).aspx
すべての返信
-
こういうページがある以上は取得できるのだと思いますが、どのように記述すればいいかまでは分かりませんでした。
http://msdn2.microsoft.com/ja-jp/library/ms180906(VS.80).aspx
-
私もMSDN内を探し回ったのですが、LDAPでの事例は色々と見つかりますが、WINNTプロバイダについての記述がほとんど有りません。
グループ階層Administratorsの下にAdmin所属のユーザー情報がぶら下がっているなら、
DirectoryEntry.Children.Find("hogehoge","Adiministrators");
で、Admin権限の有るhogehogeとマッチングするか?と期待しましたがXのような感じです。
---
余談ですが、process.start()でユーザーアカウント指定してのEXE実行は、runas同様にパスワード無しのユーザーアカウントでは例外が発生して実行されませんが、スキャンされてパスワードが当てられればTheEndですね。
---
という事で、ログオンアカウント以外の権限は検出できないようになっているのでしょうか?しかし、runasはちゃんとAdminアカウントだけ抜き出して表示してくれるのだが。
私のプログラミング経験レベルではもうお手上げです.... トホホ
-
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);
}
}