皆さんごきげんよう。ういこです。 毎日冷えますね。寒さのあまり私のテレビは画期的な色になりそうです。怖いんじゃないですよ。
さて、今日のお題は軽めに「あるユーザが特定のグループに所属しているか確認する方法」です。
例えば、ドメインに参加しているマシン上にドメインに所属しているユーザでログオンしているとします。でも、そのログオンユーザがローカルの 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
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 の場合)
(1) ドメインに所属しているコンピュータの場合 WinNT://ドメインの NetBIOS 名/コンピュータ名/ユーザ名 例 : WinNT://uikoudomain/machine1/uikouadmin (ドメイン名 uikoudomain、マシン名 machine1、ユーザ名 uikouadmin の場合)
(2) ワークグループに所属しているコンピュータの場合 WinNT://ワークグループ名/コンピュータ名/ユーザ名 例 : WinNT://WORKGROUP/machine1/uikouadmin (ワークグループ名 WORKGROUP、マシン名 machine1、ユーザ名 uikouadmin の場合)
IsMember メソッドの場合のみ、扱うユーザ アカウントの表記はドメイン アカウントとローカル アカウントで表記が異なるです。ドメイン ユーザの場合、WinNT AdsPath の表記で構いませんが、ローカルアカウントの場合は上記のようにコンピュータが所属するドメインもしくはワークグループ名をつけてあげる必要があります。 案外、はまりがちではないでしょうか。
- 参考情報 WinNT ADsPath http://msdn.microsoft.com/en-us/library/aa746534(VS.85).aspx
IADsGroup::IsMember http://msdn.microsoft.com/en-us/library/aa706023(VS.85).aspx
ではみなさんごきげんよう。
ういこう@なぜか最近テクノトリス(x68000版)が頭を回る