dポイントプレゼントキャンペーン実施中!

VBAなのですがよろしくお願いします。
下記のようなActiveDirectoryにアクセスしてユーザーを検索しユーザーオブジェクトの”FullName”プロパティを表示させるスクリプトを実行させた時、FullNameプロパティが設定されているユーザーは問題なく表示されるのですが、Administratorなどのシステムに初めから登録されているユーザーの場合FullNameプロパティが登録されていないようで『Active Directoryプロパティがキャッシュに見つかりません』とエラーで止まってしまいます。
そこで、FullNameプロパティの有無を判別してif等で処理を分けたいのですが、プロパティの有無を確認する関数がわかりません。そういった関数はあるのでしょうか? 無い場合は何か他に回避策は考えられるでしょうか?
※administratorにFullNameプロパティを登録する等、ActiveDirectory側はあまりいじりたくありません。

--------- 検索するVBA -------------
Sub ADユーザー検索()
Dim SearchStr
SearchUser = "検索するユーザー" 'administratorだとエラーになる

Const ADS_SCOPE_SUBTREE = 2
Dim objConnection
Dim objCommand
Dim objRecordSet

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

objCommand.CommandText = _
"SELECT AdsPath FROM 'LDAP://dc=my,dc=domain' WHERE objectCategory='user' And (sAMAccountName='*" + SearchUser + "*' Or Name='*" + SearchUser + "*')"
Set objRecordSet = objCommand.Execute

Dim objUser
If objRecordSet.EOF = False Then
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Set objUser = GetObject(objRecordSet.Fields("AdsPath").Value)
Debug.Print objUser.FullName 'administratorだとここでエラーになる
objRecordSet.MoveNext
Loop
End If
End Sub
----------------------------
長くなりましたがよろしくお願いします。

A 回答 (1件)

> FullNameプロパティの有無を判別してif等で処理を分けたいのですが、


> プロパティの有無を確認する関数がわかりません。

Active Directory は良く知りませんが、取得できないならできないで
一般的なエラートラップを組み込めば良いのでは?

Do Until objRecordSet.EOF
  Set objUser = GetObject(objRecordSet.Fields("AdsPath").Value)
  If objUser Is Nothing Then
    Debug.Print "例外処理"
  Else
    Debug.Print objUser.FullName
  End If
  objRecordSet.MoveNext
Loop

とか、On Error ステートメントで

Do Until objRecordSet.EOF
  On Error Resume Next
  Set objUser = GetObject(objRecordSet.Fields("AdsPath").Value)
  If Err Then
    Debug.Print "例外処理"
  Else
    Debug.Print objUser.FullName
  End If
  On Error Goto 0
  objRecordSet.MoveNext
Loop

とか。コードの内容まではみてませんが...
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
とりあえずエラートラップでやってみようと思います。

お礼日時:2007/04/16 10:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!