• ベストアンサー

ADSIでパスワード取得

TAGOSAKU7の回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答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でもパスワードの取得は無理だと思います。 以上が調査結果です。

yamasa
質問者

お礼

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

yamasa
質問者

補足

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

関連するQ&A

  • 他のユーザのログインパスワード取得/変更について

    いつもお世話になっております。 今回ご質問させていただく内容は、[他のユーザのログインパスワード取得/変更]について実現可能かご教授いただきたいと思います。 実現可能な場合、参考HPや使用するWin32API等ご教授いただけたら幸いです。 ※実際に作成できても絶対に悪用しない事を誓います。  また、この質問に回答下さった方を裏切らない為に閲覧した方も悪用しないで頂きたいと思います。 環境:VB6.0 WindowsXP Professional 【 実現方法(手順) 】 (1):ログインするユーザ名:tarou パスワード:hanako (2):パスワード取得/変更を変更したいユーザ名:ichirou パスワード:jirou (3):(1)(2)共に管理者権限を保有しています。 (4):ユーザ名:tarouでWindowsXP Professionalへログインします。 (5):VB6.0で作成したプログラムを実行し、ユーザ名:ichirouの現在設定されているパスワードを取得します。 (6):ユーザ名:ichirouのパスワードを変更(saburou)し新たに設定します。 上記のようなパスワード取得/変更がセキュリティーの厳しいWindowsXP Professionalに対し、VB6.0で実現可能かご教授願います。 また、VB以外での実装方法を知っている方が居ましたら合わせてご教授願います。 宜しくお願い致します。

  • Windows2000のパスワード 忘れ

    OSはWindows2000を使用しているものです。 あるドメインのユーザパスワードを忘れてしまい、入れない状況です。administratorのパスはわかっているので入れます。しかしadministratorで「ユーザとパスワード」の設定のところで今回忘れてしまった他のドメインのユーザのパスワードを変えようと試みましたがパスワード変更のボタンが消されていて押せない状況になっています。 こまったことにドメインの管理者からもらったパスワードを自分なりのパスワードに変えてしまったので管理者に頼めない状況です。 パスワードを新たに発行できる設定方法、またパスがわかる方法はございませんでしょうか?そのユーザには大切なデータが入っています。 よろしくお願いします。

  • ドメインパスワードの有効期限

    こんにちわ、よろしくお願いします。 NTドメイン環境下での、アカウントのパスワードの有効期限についての質問です。 例えば、ドメインアカウントの原則でパスワードの有効期限を設定してあり、アカウントをロックアウトする、という設定にしてあったとします。 このようなドメイン環境下で、パスワードの有効期限が無期限になっていないユーザーが、期限内にパスワードの変更をしないで、有効期限が切れた後、ログオンしようとすると、どういう動作になるのでしょうか? 今までのパスワードでログオンし、パスワードの変更を要求されるだけなのでしょうか? それとも、もうそのパスワードは使えずにロックされてしまうのでしょうか? ご存知の方、教えてください。

  • オグイン時のパスワードを設定したい。

    会社のパソコンですが、私のIDでドメイン参加しています。 で、パスワード自体設定されていないので、 パスワードを設定しようと、 コントロールパネルのユーザーとパスワードからパスワードを変更しようとしました。 ところが同じWIN2000を使用している自宅のPCでは 「このユーザー名を使用するには、ユーザー名とパスワードを入力する必要があります」 というメッセージがでるのに、会社のPCではでません。 それからパスワードを設定しようとしても、 パスワードの設定自体ができません。 どうしてでしょうか? 御教授の程宜しくお願いします。

  • ドメインユーザのパスワードを自動に変更する方法?

    ・NTドメインに登録されているユーザ数が1000人で、その1000人のパスワード を全て変更したいと考えております。 (変更したいパスワードの一覧は、Excelファイルにございます。) そこで、手動にてユーザ一人ずつのパスワードを変更すると大変手間がかかってしまうので、自動的にパスワードを変更するような方法(モジュール等)はありますでしょうか?

  • 同じユーザーの2台のクライアントPCのパスワード

    同じユーザーが2台のクライアントPC(WindowsXP)を使用しています ドメインにログオンするときは同じユーザーなのでパスワードは同じなのですが パスワードの更新期限があと7日後にせまっています。 片方だけパスワードを変更するとドメインへのパスワードは変更されると思います。 もう一方のPCのローカルのパスワードとドメインへのパスワードが不一致になってしまうと思うのですが 回避する方法はあるのでしょうか サーバはWindows系です

  • プリンタ一覧の取得

    お世話になります。 ネットワーク上の他クライアントのプリンタ一覧を取得する方法を探しています。 環境はWin2000です。 クライアントAから、クライアントBにログオンしているユーザー2のプリンタ一覧を取得する方法はあるのでしょうか。 strComputer ="クライアントB" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set PrtSet = objWMIService.ExecQuery("Select * From Win32_Printer") For Each Prt In PrtSet MsgBox Prt.Caption Next 上記、クライアントAにログオンしているユーザー1で実行したところクライアントBのユーザー1プロファイルのプリンタ一覧を取得してしまい、ユーザー2のプリンタ一覧を取得してくれません。 なにか情報、方法ありましたらご教授ください。 よろしくお願いします。

  • 【ユーザー名およびパスワードの保存】の追加ボタンが消えた

    別ドメインのファイルサーバーへの接続をパスワードなしでできるようにするため、【ユーザー名およびパスワードの保存】にて、ユーザ名とパスワードを登録しようと思ったのですが、追加ボタンが消えていました。 特に変わったことは行っていないのですが、再度追加ボタンが表示されるようにしたいのですが、何か方法がないでしょうか? ご存知の方がいらっしゃいましたら、ご教授いただきたいと思います。 <環境> OS:WindowsXP Windows2000Server内のドメインに参加しています。 ※PCのAdministrators権限は、持っています。

  • LDIFDE・CSVDEでパスワード設定できる?

    LDIFDEとCSVDEによって多くのユーザ属性(性、名、メールアドレス等)を登録できることはわかったのですが、パスワードの設定ができるのかがわかりません。LDIFDE・CSVDEともにパスワードのエクスポートはできないようですが、インポートのときには設定できたりするんじゃないかと思ったのです。 ご存知の方いらっしゃいましたら、情報をいただけませんでしょうか? ちなみに Windows2000Serverでデフォルトの機能を使ってユーザの一括登録を行いたいと思います。(ADSIを使ってのPGはしない)

  • ドメインアカウントの原則のパスワードの有効期限設定

    こんにちわ、よろしくお願いします。 NTドメイン環境下でのアカウントのパスワードの有効期限についての質問です。 現在パスワードの有効期限設定無しで運用中のNTドメイン環境下で、 パスワードの有効期限を設定すると、既存ユーザーについては即時変更要求がかかるのでしょうか。 それとも設定した日から、有効期限日数経過後、変更要求がかかるのでしょうか。 ご存知の方、教えてください。