プロが教えるわが家の防犯対策術!

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

ご存知の方いらっしゃいましたらご教授願えませんでしょうか?

A 回答 (4件)

ADSIをはじめて使用したので、レスが遅くなってます。


>SetPassword
そうですね。基本的に新規ユーザの登録ですが、おっしゃる通り操作する人の権限次第では強制的にパスワードをセットできるようです。
そしてユーザの強制削除もできるようです。

参考文献はMSDNです。会社で試したかったけど、サーバのユーザ情報を勝手に触るわけにはいかないので、現在自宅で実験中です。
一度、適当なパスワードに強制的にパスワードを変更したために、ログインできずに困っちゃいました(笑)

ADSIなんてこんな便利なものがあるなんて知りませんでした。
感謝です。
    • good
    • 0
この回答へのお礼

なんとか、できました。
これだけみると、すごい簡単ですね。
Dim objUser As IADsUser

Set objUser = GetObject("LDAP://" & "CN="TESTUSER," & "CN=Users," & "DC=dom," & "DC=co," & "DC=jp")

objUser.SetPassword("password")
objUser.SetInfo

てな具合です。 ありがとうございました。

お礼日時:2001/11/13 23:01

調査しました。




ところで、パスワードの変更部分はできてるのですよね?
一応念のため
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でもパスワードの取得は無理だと思います。

以上が調査結果です。

この回答への補足

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

補足日時:2001/11/13 00:33
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/13 00:33

NetUserChangePassword


のサンプルがありました

参考URL:http://www.vbvbvb.com/jp/gtips/0251/gNetUserChan …

この回答への補足

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

補足日時:2001/11/12 16:26
    • good
    • 0

NetUserGetInfo


http://www.microsoft.com/JAPAN/developer/library …

NetUserChangePassword
http://www.microsoft.com/JAPAN/developer/library …

ここら辺が参考にならないですか?

今はテスト環境が無いので、サンプルは作成できません。

この回答への補足

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

補足日時:2001/11/12 16:25
    • good
    • 0

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