DOBON.NET DOBON.NETプログラミング掲示板過去ログ

「ユーザーアカウントの管理」で一覧表示されるユーザーアカウントリストの取得

環境/言語:[c#, .net3.5]
分類:[.NET]

いつもお世話になっております。

「コントロール パネル\ユーザー アカウント\ユーザー アカウント」の「ユーザー アカウントの管理」で表示される、ローカルアカウント+ドメインアカウントのリストを、c#から取得できないでしょうか?
ローカルアカウントのみでしたら簡単なのですが、添付画像のようにドメインアカウントまで含めて取得したいのです。

試したコードは以下です。

string query = String.Format("Select * from Win32_UserAccount where domain='{0}'", Environment.MachineName);
ManagementObjectSearcher mos = new ManagementObjectSearcher(query);
foreach (ManagementObject Scn in mos.Get())
{
string a = Scn["Name"].ToString();
string b = Scn["SID"].ToString();
}

これだとローカルアカウントしか取得できません。クエリ部分を「where domain='DC00'」や、where句を無しにすると、ADの全アカウントが取得できてしまいます。
あくまで、「ユーザーアカウントの管理」ダイアログで表示される、現在のPC上のアカウントのリストが欲しいのです。(現在のPC上でユーザープロファイルの作られているユーザーということでしょうか?)

行いたいことは、以下になります。
1.PC上の共有スペース(%ProgramData%)に置いてあるデータを、特定のユーザーのみがPermissionを持つフォルダに振り分けたい
2.振り分け先ユーザーの登録、並びにフォルダへのPermission付与を管理者権限アプリで行いたい

この2で振り分けユーザーを選ぶために、現在のPC上のアカウントリストが欲しいというわけです。
ちなみに1の共有データ管理やアクセス方法は、システムの都合上DBなど使えないため、ツッコミはご容赦ください…。なお、アカウントは存在確認して消されていた場合は再設定するつもりです。

アカウントが特定できればいいため、例えばEditSecurityで表示される「ユーザー の選択」ダイアログ(IAzObjectPicker::GetPrincipals、またはIDSObjectPicker?)を.netから呼べないかなども調査しましたが、あまりにドキュメントが無く、断念しました。
こちらについても、もし参考URLなどあるようでしたらご教示いただければ幸いです。

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


無題.jpg
添付ファイル: 1411659894.jpg (86 KB)
参考になるかどうか分かりませんが、Win32_UserProfileを試してみてはどうでしょうか。

http://www.wmifun.net/library/win32_userprofile.html


自分の投稿の中にヒントがあったんですね…^^;

単にWin32_UserProfileだけだとBUILTINの物や無効の物も取れてしまうので、
Win32_UserAccountと合わせて以下のようにしてみました。

HashSet<NTAccount> UserAccounts = new HashSet<NTAccount>();
string query = String.Format("select * from Win32_UserAccount where domain='{0}'", Environment.MachineName);
ManagementObjectSearcher mos = new ManagementObjectSearcher(query);
foreach (ManagementObject mo in mos.Get())
{
if (Convert.ToBoolean(mo["disabled"]))
continue;

SecurityIdentifier sid = new SecurityIdentifier(mo["sid"].ToString());
NTAccount account = (NTAccount)sid.Translate(typeof(NTAccount));
UserAccounts.Add(account);
}

query = "select * from Win32_UserProfile";
mos = new ManagementObjectSearcher(query);
foreach (ManagementObject mo in mos.Get())
{
SecurityIdentifier sid = new SecurityIdentifier(mo["sid"].ToString());
if (sid.AccountDomainSid == null)
continue;

NTAccount account = (NTAccount)sid.Translate(typeof(NTAccount));
UserAccounts.Add(account);
}

これで「ユーザー アカウントの管理」ダイアログとまったく同じアカウントリストを提供できそうです。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板