Jaa


[ADSI] 祝 80 Posts 記念 : OpenDSObject を User 名とパスワードなしで VBScript でつかったら80072020 が返ってきちゃうのはなぜ?

皆様ごきげんよう。ういこです。

 

今日は帰り際外に出た瞬間、ぼた雪がだばだば降ってきてびっくらしました。地元の駅について降ってたらチャリンコどうしようとひやひやしましたが、幸いそのまえに帰ってこられました。

私のリアルママによれば、雨が神様の涙なら、雪は神様のフケだそうです。そう思うとものすごく嫌ですね。

ちなみに先ほど気づいたんですが、この原稿でなんとトータル 80 Posts 達成できました!

おめでとう僕たち。去年の 8 月から、あんまり RSS ビューも伸びずやっているのはただの壮大なひとりヨガリータじゃないかと不安になりつつここまでこれました。

皆様ありがとうございます。

では早速今日の御題。今日は、RSS 一番人気の "ADSI / VBScript" ネタです。

【今日の御題】

LDAP プロバイダで OpenDSObject() を使用してみました。AD にバインドするときにパスワードとユーザ名を NULL にしてみました。DC が Windows 2000 だとうまく行くのに、Windows Server 2003 だと 80072020 が帰ってきちゃいます!!大変!!

これを実行したら、Windows Server 2003 のドメインコントローラ様から、エラー 80072020 が帰ってきてしまいました。ふっと考えると、ユーザ名もパスワードもないんだから、さもありなん、なんかまあそうなるかな~とは思うんだけど、なんとこれがまた、Windows 2000 Server のドメイン コントローラ様の場合はなんとうまくいっちゃうんですよ。

では早速コードをいやらしく見てみましょう。コードはこちら!

◆サンプルコード

        ' コードここから

        Const ADS_SECURE_AUTHENTICATION = &H1

        strLDAP = "LDAP://tokyo.contoso.com/DC=tokyo, DC=contoso,DC=com"

        Set objLDAP = GetObject("LDAP:")

        Set objDomain = objLDAP.OpenDSObject(strLDAP, "", "", ADS_SECURE_AUTHENTICATION)

        ' コードここまで

OpenDSObject は実際は IADsOpenDSObject::OpenDSObject です。MSDN の説明を見てみましょう。

IADsOpenDSObject::OpenDSObject

https://msdn.microsoft.com/en-us/library/aa706065(VS.85).aspx

HRESULT OpenDSObject(

  [in] BSTR lpszDNName,

  [in] BSTR lpszUserName,

  [in] BSTR lpszPassword,

  [in] LONG lnReserved,

  [out] IDispatch **ppOleDsObj

);

IADsOpenDSObject は、第二引数 "lpszUserName" 要はユーザ名と、第三引数 "lpszPassword" 要はパスワードが null の場合、既定の資格情報を使います

既定の資格情報でパスするには、ユーザ名とパスワードが NULL である必要があります。それに加え、バインドの対応は ADS_SECURE_AUTHENTICATION である必要があります。

つまり、既定の資格情報で挑みたい場合はユーザ名もパスワードもいらないと。驚きです。

 

ふむふむ、そうだとすると、この指定には何にも問題はないように見えますよね。

Set objDomain = objLDAP.OpenDSObject(strLDAP, "", "", ADS_SECURE_AUTHENTICATION)

ところが、ここに落とし穴が。

VBScript では、"" は NULL ではなくて、空の文字列なのです。要は NULL じゃないわけです。なんとまあ。残念です!!

VBScript で NULL を指定したい場合は、"vbNullString" を指定してあげればよいです。

というわけでこんな風に直して再実行してみてください。

        ' コードここから

        Const ADS_SECURE_AUTHENTICATION = &H1

strLDAP = "LDAP://tokyo.contoso.com/DC=tokyo, DC=contoso,DC=com"

        objLDAP = GetObject("LDAP:")

        objDomain = objLDAP.OpenDSObject(strLDAP, vbNullString, vbNullString, 1)

        ' コードここまで

これでうまく行くはずです。

 

でもなんで、2000 Server だとうまく行くのかな?今度デバッグしてみようと思います。

~ ういこう@巨大なねむねむさんが来たので寝るです ~