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ランキング
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
VBAでActiveDirectoryのユーザ...
-
Excelで勤怠管理をしたいです。...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
VBA リストボックス複数選択か...
-
「Excel VBA」 Webクエリ マク...
-
like演算子内に変数って使えな...
-
コンボボックスの表示は最大何行?
-
現在時刻をミリ秒まで取得
-
getParameter と getAttribut...
-
データ数をカウントしたいのですが
-
DataGridView 複数選択で行番...
-
URIでのページの移動について
-
asp.netでtextboxの値を取得
-
VBA リストボックス内の値を複...
-
.NETで現在時刻を常に動作させ...
-
count(*)で取得した値をJAVAの...
-
MACアドレス関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
ListView 項目の選択/選択解除...
-
like演算子内に変数って使えな...
-
count(*)で取得した値をJAVAの...
-
利用者側のMACアドレスを取得し...
-
データ数をカウントしたいのですが
-
JavaScriptでWindowsログオンID...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
VBA リストボックス複数選択か...
-
getParameter と getAttribut...
-
Excel VBA でログインしてい...
-
VBScriptで数値にコンマを付け...
-
Spreadの選択行の取得について
-
コンボボックスの表示は最大何行?
-
コンボボックス表示文字列を取...
-
VB .netにて現在時刻+1時間後...
おすすめ情報