- ベストアンサー
ADSIでパスワード取得
WIN2000ドメイン環境で ADSIを使用してユーザのパスワードを取得する 方法はあるのでしょうか?IADsUserなんかを使うのだと思うのですが・・・。 パスワードを取得し、それを変更をしたいと考えています。 ちなみにユーザ一覧は取得することはできました。 ご存知の方いらっしゃいましたらご教授願えませんでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ADSIをはじめて使用したので、レスが遅くなってます。 >SetPassword そうですね。基本的に新規ユーザの登録ですが、おっしゃる通り操作する人の権限次第では強制的にパスワードをセットできるようです。 そしてユーザの強制削除もできるようです。 参考文献はMSDNです。会社で試したかったけど、サーバのユーザ情報を勝手に触るわけにはいかないので、現在自宅で実験中です。 一度、適当なパスワードに強制的にパスワードを変更したために、ログインできずに困っちゃいました(笑) ADSIなんてこんな便利なものがあるなんて知りませんでした。 感謝です。
その他の回答 (3)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
調査しました。 ところで、パスワードの変更部分はできてるのですよね? 一応念のため 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でもパスワードの取得は無理だと思います。 以上が調査結果です。
お礼
TAGOSAKU7さん、かなりきちんと調査などしていただき、とても感激です。ADSIではやはりできないみたいですね。 それと・・・すみません。 ユーザのパスワードを変更するには、現在のパスワードを取得して、新規パスワードで登録しなければならないと思っていたのですが、管理者権限があるユーザなら(正式にはよくわからないですが)現在のパスワードがわからなくても、強引に新しいパスワードに変更してしまうことができるようですね。 最終的にやりたいことはユーザの一括変更・削除なのです。(これについては先に言っていればよかったですね。大変ご迷惑をおかけしました。)
補足
ちょっと今は試せる環境がないのですが、もしかすると既存ユーザのパスワード変更はChangePasswordではなく SetPasswordなんかでいいのでしょうか? SetPasswordは新規ユーザのときだと思っていたのですが・・・??
- TAGOSAKU7
- ベストアンサー率65% (276/422)
NetUserChangePassword のサンプルがありました
補足
すみません。 ADSIを使って実現したいのです。 既存ユーザを取得し、(例えば一人のユーザ) そのパスワードを変更する。 というようにです。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
NetUserGetInfo http://www.microsoft.com/JAPAN/developer/library/jpntwkpf/_win32_netusergetinfo.htm NetUserChangePassword http://www.microsoft.com/JAPAN/developer/library/jpntwkpf/_win32_netuserchangepassword.htm ここら辺が参考にならないですか? 今はテスト環境が無いので、サンプルは作成できません。
補足
すみません。 VB6とADSIを使って実現したいのです。 それと補足ですが、 パスワードの取得というより(無理そうなので) 既存ユーザのパスワード変更で結構でした。
お礼
なんとか、できました。 これだけみると、すごい簡単ですね。 Dim objUser As IADsUser Set objUser = GetObject("LDAP://" & "CN="TESTUSER," & "CN=Users," & "DC=dom," & "DC=co," & "DC=jp") objUser.SetPassword("password") objUser.SetInfo てな具合です。 ありがとうございました。