[ADSI] IADsGroup.IsMember メソッドを使ってユーザが特定のグループに所属してるかチェックしてみよう (VBScript / .NET Framework)

皆さんごきげんよう。ういこです。
毎日冷えますね。寒さのあまり私のテレビは画期的な色になりそうです。怖いんじゃないですよ。

さて、今日のお題は軽めに「あるユーザが特定のグループに所属しているか確認する方法」です。

例えば、ドメインに参加しているマシン上にドメインに所属しているユーザでログオンしているとします。でも、そのログオンユーザがローカルの Administrators に所属しているかは判らないですよね。そんな時、どうやって判定しましょうか。[管理ツール] - [コンピュータの管理] - [ローカルユーザーとグループ] で Administrators グループを展開しちゃいます?
でも、そのマシンがたとえば、何かのサーバだったりしたら?クライアントからのリクエストで来たユーザを認証する過程でグループ所属確認を実施したいとしたら?自動化しないといけませんよね。
以下、現在ログオン中のユーザがローカルの Administrators グループに所属しているか確認するコードです。
気楽に試せるのは VBScript でしょうか。なんたって保存してすぐ動かせますから。

VBScript
以下をコピーして、拡張子 vbs で保存してください。
実行時の構文 : WScript <VBSファイル名、フルパスでもOK> あるいは Cscript <VBSファイル名> をコマンドプロンプト上で実施してください。ダブルクリックでもいいですよ。

image

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("所属していません");
    }
}

image

いやこれだけならよくある話。

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版)が頭を回る