調査しました。
ところで、パスワードの変更部分はできてるのですよね?
一応念のため
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でもパスワードの取得は無理だと思います。
以上が調査結果です。
お礼
なんとか、できました。 これだけみると、すごい簡単ですね。 Dim objUser As IADsUser Set objUser = GetObject("LDAP://" & "CN="TESTUSER," & "CN=Users," & "DC=dom," & "DC=co," & "DC=jp") objUser.SetPassword("password") objUser.SetInfo てな具合です。 ありがとうございました。