OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ADSIでパスワード取得

  • 困ってます
  • 質問No.167329
  • 閲覧数1271
  • ありがとう数2
  • 気になる数1
  • 回答数4
  • コメント数0

お礼率 59% (26/44)

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

ご存知の方いらっしゃいましたらご教授願えませんでしょうか?
通報する
  • 回答数4
  • 気になる1
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル12

ベストアンサー率 65% (276/422)

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

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

ADSIなんてこんな便利なものがあるなんて知りませんでした。
感謝です。
お礼コメント
yamasa

お礼率 59% (26/44)

なんとか、できました。
これだけみると、すごい簡単ですね。
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:56
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル12

ベストアンサー率 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_netuserchange ...続きを読む
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

お礼率 59% (26/44)

すみません。
VB6とADSIを使って実現したいのです。
それと補足ですが、
パスワードの取得というより(無理そうなので)
既存ユーザのパスワード変更で結構でした。
投稿日時 - 2001-11-12 16:25:00
  • 回答No.2
レベル12

ベストアンサー率 65% (276/422)

NetUserChangePassword のサンプルがありました ...続きを読む
NetUserChangePassword
のサンプルがありました
補足コメント
yamasa

お礼率 59% (26/44)

すみません。
ADSIを使って実現したいのです。
既存ユーザを取得し、(例えば一人のユーザ)
そのパスワードを変更する。
というようにです。
投稿日時 - 2001-11-12 16:26:56
  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

調査しました。 ところで、パスワードの変更部分はできてるのですよね? 一応念のため Sub Main()   Call PasswordChanger("DOMAIN_NAME", "MACHIN_NAME", "TAGOSAKU7", "123456789", "987654321") ...続きを読む
調査しました。


ところで、パスワードの変更部分はできてるのですよね?
一応念のため
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

お礼率 59% (26/44)

ちょっと今は試せる環境がないのですが、もしかすると既存ユーザのパスワード変更はChangePasswordではなく
SetPasswordなんかでいいのでしょうか?
SetPasswordは新規ユーザのときだと思っていたのですが・・・??
投稿日時 - 2001-11-13 00:33:48
お礼コメント
yamasa

お礼率 59% (26/44)

TAGOSAKU7さん、かなりきちんと調査などしていただき、とても感激です。ADSIではやはりできないみたいですね。
それと・・・すみません。
ユーザのパスワードを変更するには、現在のパスワードを取得して、新規パスワードで登録しなければならないと思っていたのですが、管理者権限があるユーザなら(正式にはよくわからないですが)現在のパスワードがわからなくても、強引に新しいパスワードに変更してしまうことができるようですね。
最終的にやりたいことはユーザの一括変更・削除なのです。(これについては先に言っていればよかったですね。大変ご迷惑をおかけしました。)
投稿日時 - 2001-11-13 00:33:31
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ