[ADSI] IADsGroup.IsMember メソッドを使ってユーザが特定のグループに所属してるかチェックしてみよう (VBScript / .NET Framework)
皆さんごきげんよう。ういこです。
毎日冷えますね。寒さのあまり私のテレビは画期的な色になりそうです。怖いんじゃないですよ。
さて、今日のお題は軽めに「あるユーザが特定のグループに所属しているか確認する方法」です。
例えば、ドメインに参加しているマシン上にドメインに所属しているユーザでログオンしているとします。でも、そのログオンユーザがローカルの Administrators に所属しているかは判らないですよね。そんな時、どうやって判定しましょうか。[管理ツール] - [コンピュータの管理] - [ローカルユーザーとグループ] で Administrators グループを展開しちゃいます?
でも、そのマシンがたとえば、何かのサーバだったりしたら?クライアントからのリクエストで来たユーザを認証する過程でグループ所属確認を実施したいとしたら?自動化しないといけませんよね。
以下、現在ログオン中のユーザがローカルの Administrators グループに所属しているか確認するコードです。
気楽に試せるのは VBScript でしょうか。なんたって保存してすぐ動かせますから。
VBScript
以下をコピーして、拡張子 vbs で保存してください。
実行時の構文 : WScript <VBSファイル名、フルパスでもOK> あるいは Cscript <VBSファイル名> をコマンドプロンプト上で実施してください。ダブルクリックでもいいですよ。
Set comInfo = CreateObject("WinNTSystemInfo")
currentUser = comInfo.DomainName + "/" + comInfo.UserName
Set localgroup = GetObject("WinNT://" + comInfo.ComputerName + "/Administrators,group")
Set currentUser = GetObject("WinNT://" + currentUser + ",user")Wscript.Echo currentUser.AdsPath
If localgroup.IsMember(currentUser.ADsPath) Then
WScript.Echo "所属しています"
Else
WScript.Echo "所属していません"
End If
.NET Framework というか、C# の場合 ※注意 : 使用前に、ソリューションの参照設定に以下の手順で ActiveDS.tlb を追加してください。
1. ソリューション エクスプローラ上の "参照設定" を右クリックし、[参照の追加(R)..] を選択
2. "参照の追加" ダイアログが開いたら、[COM] タブをクリック
3. "Active DS Type Library" を選択し、[OK] を押す
4. using ディレクティブを使用し、ActiveDs 名前空間における型の使用許可を指定する(例 : using ActiveDs;)
private void myIsMember()
{
DirectoryEntry comInfo = new DirectoryEntry ("WinNT://" + System.Environment.MachineName);
DirectoryEntry theGroup = comInfo.Children.Find("Administrators", "group");
IADsGroup localgroup = (IADsGroup)theGroup.NativeObject;
MessageBox.Show(localgroup.Name.ToString());
string currentUser = "WinNT://" + System.Environment.UserDomainName + "/" + System.Environment.UserName;
if (localgroup.IsMember(currentUser))
{
MessageBox.Show("所属しています");
}
else
{
MessageBox.Show("所属していません");
}
}
いやこれだけならよくある話。
WinNT://<ドメインの NetBIOS 名>/<ドメイン ユーザ名>
これはドメイン所属ユーザの指定ですね。
さて、では、ドメインユーザではなくて、ローカルユーザだったらどう取りますか?
答えは、こうです。
ドメイン ユーザの場合 :
WinNT://<ドメインの NetBIOS 名>/<ユーザ名>
例 : WinNT://uikoudomain/uikouadmin
(ドメイン名 uikoudomain 、ユーザ名 uikoudomainの場合)
ローカル ユーザの場合 :
コンピュータが所属するドメインの NetBIOS 名もしくはワークグループ名を付加します。
(1) ドメインに所属しているコンピュータの場合
WinNT://ドメインの NetBIOS 名/コンピュータ名/ユーザ名
例 : WinNT://uikoudomain/machine1/uikouadmin
(ドメイン名 uikoudomain、マシン名 machine1、ユーザ名 uikouadmin の場合)(2) ワークグループに所属しているコンピュータの場合
WinNT://ワークグループ名/コンピュータ名/ユーザ名
例 : WinNT://WORKGROUP/machine1/uikouadmin
(ワークグループ名 WORKGROUP、マシン名 machine1、ユーザ名 uikouadmin の場合)
IsMember メソッドの場合のみ、扱うユーザ アカウントの表記はドメイン アカウントとローカル アカウントで表記が異なるです。ドメイン ユーザの場合、WinNT AdsPath の表記で構いませんが、ローカルアカウントの場合は上記のようにコンピュータが所属するドメインもしくはワークグループ名をつけてあげる必要があります。
案外、はまりがちではないでしょうか。
- 参考情報
WinNT ADsPath
https://msdn.microsoft.com/en-us/library/aa746534(VS.85).aspx
IADsGroup::IsMember
https://msdn.microsoft.com/en-us/library/aa706023(VS.85).aspx
ではみなさんごきげんよう。
ういこう@なぜか最近テクノトリス(x68000版)が頭を回る