• ベストアンサー

ADSIでパスワード取得

WIN2000ドメイン環境で ADSIを使用してユーザのパスワードを取得する 方法はあるのでしょうか?IADsUserなんかを使うのだと思うのですが・・・。 パスワードを取得し、それを変更をしたいと考えています。 ちなみにユーザ一覧は取得することはできました。 ご存知の方いらっしゃいましたらご教授願えませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

ADSIをはじめて使用したので、レスが遅くなってます。 >SetPassword そうですね。基本的に新規ユーザの登録ですが、おっしゃる通り操作する人の権限次第では強制的にパスワードをセットできるようです。 そしてユーザの強制削除もできるようです。 参考文献はMSDNです。会社で試したかったけど、サーバのユーザ情報を勝手に触るわけにはいかないので、現在自宅で実験中です。 一度、適当なパスワードに強制的にパスワードを変更したために、ログインできずに困っちゃいました(笑) ADSIなんてこんな便利なものがあるなんて知りませんでした。 感謝です。

yamasa
質問者

お礼

なんとか、できました。 これだけみると、すごい簡単ですね。 Dim objUser As IADsUser Set objUser = GetObject("LDAP://" & "CN="TESTUSER," & "CN=Users," & "DC=dom," & "DC=co," & "DC=jp") objUser.SetPassword("password") objUser.SetInfo てな具合です。 ありがとうございました。

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

調査しました。 ところで、パスワードの変更部分はできてるのですよね? 一応念のため Sub Main()   Call PasswordChanger("DOMAIN_NAME", "MACHIN_NAME", "TAGOSAKU7", "123456789", "987654321") End Sub Public Sub PasswordChanger(inDomainName As String, inServerName As String, inUserName As String, inOldPass As String, InNewPass As String)   Dim objDomain  As IADsContainer   Dim objUser   As IADsUser      Set objDomain = GetObject("WinNT://" & inDomainName & "/" & inServerName)   Set objUser = objDomain.GetObject("User", inUserName)      objUser.ChangePassword inOldPass, InNewPass PGMEND:   Set objUser = Nothing   Set objDomain = Nothing End Sub それで本題のパスワードの取得ですが・・・ IADsUser構造体に無いですよね。 それで以下の関数を作成してみました。 Private Const NERR_Success = 0 Private Declare Function NetUserGetInfo Lib "netapi32.dll" (ByVal strServer As String, ByVal strUserName As String, ByVal bufptr As Long, lpBuffer As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Declare Function lstrlenW Lib "kernel32" (ByVal Ptr As Long) As Long Private Declare Sub lstrcpyW Lib "kernel32" (lpszString1 As Any, lpszString2 As Long) Sub Main()   Debug.Print getPassword("MACHIN_NAME", "TAGOSAKU7") End Sub Function getPassword(inServerName As String, inUserID As String) As String   Dim buf3  As USER_INFO_3   Dim lngBuf As Long   Dim lngSts As Long   'ユーザ情報の取得   lngSts = NetUserGetInfo(StrConv(inServerName, vbUnicode), StrConv(inUserID, vbUnicode), 3, lngBuf)   If NERR_Success <> lngSts Then     MsgBox "情報取得失敗"     GoTo PGMEND   End If   'ポインタを構造体へコピー   Call CopyMemory(ByVal VarPtr(buf3), ByVal lngBuf, Len(buf3))   getPassword = PointerToString(buf3.Password) PGMEND: End Function 'ポインタから文字列を取得 Public Function PointerToString(ByRef inIn As Long) As String   Dim wkLen    As Long   Dim bytBuffer() As Byte   '文字列の長さを得る   wkLen = lstrlenW(inIn) * 2   If wkLen > 0 Then     ReDim p_abytBuffer(0 To (wkLen - 1)) As Byte     Call lstrcpyW(p_abytBuffer(0), ByVal inIn)     PointerToString = p_abytBuffer   End If End Function するとパスワードが取得できませんでした。 なぜかなと思ったら、セキュリティ上の問題でUSER_INFO_3.PasswordにはNullポインタが返されるようです。これはMSDNに書いてありました。でADSIですが、内部でこれらのAPI関数を使用しているだけのライブラリだと思うので、ADSIでもパスワードの取得は無理だと思います。 以上が調査結果です。

yamasa
質問者

お礼

TAGOSAKU7さん、かなりきちんと調査などしていただき、とても感激です。ADSIではやはりできないみたいですね。 それと・・・すみません。 ユーザのパスワードを変更するには、現在のパスワードを取得して、新規パスワードで登録しなければならないと思っていたのですが、管理者権限があるユーザなら(正式にはよくわからないですが)現在のパスワードがわからなくても、強引に新しいパスワードに変更してしまうことができるようですね。 最終的にやりたいことはユーザの一括変更・削除なのです。(これについては先に言っていればよかったですね。大変ご迷惑をおかけしました。)

yamasa
質問者

補足

ちょっと今は試せる環境がないのですが、もしかすると既存ユーザのパスワード変更はChangePasswordではなく SetPasswordなんかでいいのでしょうか? SetPasswordは新規ユーザのときだと思っていたのですが・・・??

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

NetUserChangePassword のサンプルがありました

参考URL:
http://www.vbvbvb.com/jp/gtips/0251/gNetUserChangePassword.html
yamasa
質問者

補足

すみません。 ADSIを使って実現したいのです。 既存ユーザを取得し、(例えば一人のユーザ) そのパスワードを変更する。 というようにです。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

NetUserGetInfo http://www.microsoft.com/JAPAN/developer/library/jpntwkpf/_win32_netusergetinfo.htm NetUserChangePassword http://www.microsoft.com/JAPAN/developer/library/jpntwkpf/_win32_netuserchangepassword.htm ここら辺が参考にならないですか? 今はテスト環境が無いので、サンプルは作成できません。

yamasa
質問者

補足

すみません。 VB6とADSIを使って実現したいのです。 それと補足ですが、 パスワードの取得というより(無理そうなので) 既存ユーザのパスワード変更で結構でした。

関連するQ&A