- PR -

ユーザの所属するグループを取得するのに時間がかかる

1
投稿者投稿内容
スー3
会議室デビュー日: 2007/02/28
投稿数: 3
投稿日時: 2007-02-28 18:28
PCに存在するユーザ名と、ユーザが所属するグループ名を取得するスクリプトを作成したいと思っています。
結果、WMIのWin32_GroupUserクラスを使用して、グループ名の取得はできました。
しかし、実行にとても時間がかかります(1ユーザあたり約1分程)。
下記のようなスクリプトにて実行をしているのですが、実行時間を短縮するのに
何か良い方法はありますでしょうか。

開発環境: WinXP+VBSCRIPT(WMI)

コード:
----------------------------

'ユーザの所属するグループをWin32_GroupUserクラスから取得
Set objWMIService = GetObject("winmgmts:\\" & "." & "\root\CIMV2")
Query = "SELECT * FROM Win32_GroupUser WHERE ( PartComponent = '" & _
"\\\\<マシン名>\\root\\cimv2:Win32_UserAccount.Domain= & _
""<マシン名>"",Name=""" & <ユーザ名> & """')"
Set colItems = objWMIService.ExecQuery(Query,,48)

'グループ名の取得
For Each objItem In colItems
Set MemberPart = objWMIService.Get(objItem.PartComponent)
Set MemberGroup = objWMIService.Get(objItem.GroupComponent)
msgbox "ドメイン名=" & MemberPart.Domain & _
",ユーザ名=" & MemberPart.Name & _
",所属グループ=" & MemberGroup.Name
Next

----------------------------

調べてみると、上記のFor Each文の実行に時間がかかっています。
SWbemObjectSetコレクションからSWbemObjectオブジェクトを取得するところで
時間がかかっているかと思うのですが、何か解決策がありましたら
よろしくお願いします。


ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-02-28 21:32
WMI で account を扱うのは得策ではありません。
素直に ADSI 使いましょう。
# 数倍違うはずですよ。
スー3
会議室デビュー日: 2007/02/28
投稿数: 3
投稿日時: 2007-03-01 15:45
情報ありがとうございます。
ADSIについては調べていなかったので、調べてみようと思います。

また、ActiveDirectoryを導入していない環境でも使用することを考えているのですが、
ADSI以外で良い方法はありますでしょうか?
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-03-01 23:06
引用:

また、ActiveDirectoryを導入していない環境でも使用することを考えているのですが、
ADSI以外で良い方法はありますでしょうか?



WinNT provider を使えば、AD 以外の account も同様に扱えます。
また、AD 上の account を扱うのであれば、LDAP query を投げたほうが圧倒的に速いです。

WSH だと ADO ADSI provider を使うことで、LDAP query を投げられます。
_________________
スー3
会議室デビュー日: 2007/02/28
投稿数: 3
投稿日時: 2007-03-12 10:51
引用:

ちゃっぴさんの書き込み (2007-03-01 23:06) より:
引用:

また、ActiveDirectoryを導入していない環境でも使用することを考えているのですが、
ADSI以外で良い方法はありますでしょうか?



WinNT provider を使えば、AD 以外の account も同様に扱えます。
また、AD 上の account を扱うのであれば、LDAP query を投げたほうが圧倒的に速いです。

WSH だと ADO ADSI provider を使うことで、LDAP query を投げられます。




ちゃっぴ様ありがとうございました。
WinNT Providerを使用して瞬時にグループ名を取得できるようになりました。
(以下ユーザ名を指定して所属グループ名を取得するVBScript)
----
Dim usr,group,ComputerName,UserName,strADsPath

ComputerName = "MyPC" 'コンピュータ名
UserName = "Administrator" 'ユーザ名

strADsPath = "WinNT://" & ComputerName & "/" & UserName & ",user"

set usr = GetObject(strADsPath)

For Each grp In usr.Groups
wsh.echo "グループ名: " & grp.Name
Next
----

参考: MSND IADsUser
http://msdn2.microsoft.com/en-us/library/aa746342.aspx

大変助かりました。情報ありがとうございました。



1

スキルアップ/キャリアアップ(JOB@IT)