No.4ベストアンサー
- 回答日時:
ADSIをはじめて使用したので、レスが遅くなってます。
>SetPassword
そうですね。基本的に新規ユーザの登録ですが、おっしゃる通り操作する人の権限次第では強制的にパスワードをセットできるようです。
そしてユーザの強制削除もできるようです。
参考文献はMSDNです。会社で試したかったけど、サーバのユーザ情報を勝手に触るわけにはいかないので、現在自宅で実験中です。
一度、適当なパスワードに強制的にパスワードを変更したために、ログインできずに困っちゃいました(笑)
ADSIなんてこんな便利なものがあるなんて知りませんでした。
感謝です。
なんとか、できました。
これだけみると、すごい簡単ですね。
Dim objUser As IADsUser
Set objUser = GetObject("LDAP://" & "CN="TESTUSER," & "CN=Users," & "DC=dom," & "DC=co," & "DC=jp")
objUser.SetPassword("password")
objUser.SetInfo
てな具合です。 ありがとうございました。
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でもパスワードの取得は無理だと思います。
以上が調査結果です。
この回答への補足
ちょっと今は試せる環境がないのですが、もしかすると既存ユーザのパスワード変更はChangePasswordではなく
SetPasswordなんかでいいのでしょうか?
SetPasswordは新規ユーザのときだと思っていたのですが・・・??
TAGOSAKU7さん、かなりきちんと調査などしていただき、とても感激です。ADSIではやはりできないみたいですね。
それと・・・すみません。
ユーザのパスワードを変更するには、現在のパスワードを取得して、新規パスワードで登録しなければならないと思っていたのですが、管理者権限があるユーザなら(正式にはよくわからないですが)現在のパスワードがわからなくても、強引に新しいパスワードに変更してしまうことができるようですね。
最終的にやりたいことはユーザの一括変更・削除なのです。(これについては先に言っていればよかったですね。大変ご迷惑をおかけしました。)
No.2
- 回答日時:
この回答への補足
すみません。
ADSIを使って実現したいのです。
既存ユーザを取得し、(例えば一人のユーザ)
そのパスワードを変更する。
というようにです。
No.1
- 回答日時:
NetUserGetInfo
http://www.microsoft.com/JAPAN/developer/library …
NetUserChangePassword
http://www.microsoft.com/JAPAN/developer/library …
ここら辺が参考にならないですか?
今はテスト環境が無いので、サンプルは作成できません。
この回答への補足
すみません。
VB6とADSIを使って実現したいのです。
それと補足ですが、
パスワードの取得というより(無理そうなので)
既存ユーザのパスワード変更で結構でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript HTMLでJavaScriptを使用してプログラムを作ります。 入力されたパスワードを取得して、パス 2 2022/10/18 01:05
- その他(開発・運用・管理) ユーザ権限でソフトを起動すると必ず管理者パスワードをきかれてうまく利用できない 3 2022/05/10 00:07
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- ドメイン・サーバー・クラウドサービス さくらレンタルサーバーでホームページをUPしたい・・・・ 1 2023/06/04 11:50
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- その他(セキュリティ) アカウントの乗っ取りで質問です。長いです。 先月ツイッターの乗っ取りにあい、アカウントを全て新しくし 2 2022/03/25 20:47
- 予備校・塾・家庭教師 塾 オンライン授業について 通っている塾にもう1教科プラスする事になり オンライン授業を始める事にな 1 2023/08/08 21:56
- その他(メールソフト・メールサービス) 業務用メールアドレスをご提案ください! 2 2022/05/17 19:50
- FTTH・光回線 NTTからソフトバンク光への変更について 4 2023/02/27 15:14
- X(旧Twitter) Twitterアカウント継続使用について 1 2022/05/14 09:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
ListView 項目の選択/選択解除...
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
count(*)で取得した値をJAVAの...
-
データ数をカウントしたいのですが
-
JavaScriptでWindowsログオンID...
-
COMポート 名前を取得する方法
-
URIでのページの移動について
-
バージョンナンバーの取得
-
getParameter と getAttribut...
-
like演算子内に変数って使えな...
-
Excel VBA でログインしてい...
-
リクエストからArrayListのデー...
-
VB6.0のレジストリ情報取得方法
-
Flexgridで選択行の列の値を取...
-
利用者側のMACアドレスを取得し...
-
「Excel VBA」 Webクエリ マク...
-
VBA Shapesの座標からセル位置...
-
コンボボックス表示文字列を取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
VBAでActiveDirectoryのユーザ...
-
郵便番号検索APIにてget Elemen...
-
VBA:小数点以下の数字を取得で...
-
ListView 項目の選択/選択解除...
-
count(*)で取得した値をJAVAの...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
like演算子内に変数って使えな...
-
利用者側のMACアドレスを取得し...
-
Spreadの選択行の取得について
-
データ数をカウントしたいのですが
-
JavaScriptでWindowsログオンID...
-
VBA リストボックス内の値を複...
-
コンボボックス表示文字列を取...
-
COMポート 名前を取得する方法
-
EXCELのリストボックスを選択し...
-
IFRAME内のURLを取得したです。
-
「Excel VBA」 Webクエリ マク...
-
VBA リストボックス複数選択か...
おすすめ情報