NonSoft

ダイヤルアップの情報を表示するサンプル(VB6)


 サンプル(ソース/コード)
<このサンプルの概要>
ダイヤルアップのパスワードを表示する方法を探してRasapi32.dllのRasGetEntryDialParamsを使用
する方法は?と思い試してみました。結論は、未確認ですがWin95、98、Me、NT4.0では表示出来る
ようです。WinXPではパスワードが16個のアスタリスクになってしまい表示出来ませんでした。
WinXPでもパスワード以外のダイヤルアップ情報は取得出来るようです。

このサンプルでは使用していませんが、Winows2000やWindowsXPのダイヤルアップのパスワード
を表示するためには、Advapi32.dllを使用する必要があるようです。

ダイヤルアップ以外のパスワードを表示するサンプルは以下のURLです。
PasswordChar(*)に隠れた実際のパスワードを表示するサンプル(VB.NET)

また、関連ツールがありますのでご紹介します。
パスワード表示ツール(SeePasswd)はダイヤルアップのパスワードも表示するツールです。
使用方法は パスワードを表示する方法 ダイヤルアップのパスワードを表示する方法です。

★フォームモジュール(Form1.frm)
Option Explicit

' RASENTRYNAME構造体とRASDIALPARAMS構造体メンバの長さの定義
Private Const RAS_MaxEntryName = 256
Private Const RAS_MaxPhoneNumber = 128
Private Const RAS_MaxCallbackNumber = 128
Private Const UNLEN = 256
Private Const PWLEN = 256
Private Const DNLEN = 12

' RASENTRYNAME構造体の定義
Private Type RASENTRYNAME
   dwSize As Long
   szEntryName(RAS_MaxEntryName + 3) As Byte
End Type

' RASDIALPARAMS構造体の定義
Private Type RASDIALPARAMS
   dwSize As Long
   szEntryName(RAS_MaxEntryName) As Byte
   szPhoneNumber(RAS_MaxPhoneNumber) As Byte
   szCallbackNumber(RAS_MaxCallbackNumber) As Byte
   szUserName(UNLEN) As Byte
   szPassword(PWLEN) As Byte
   szDomain(DNLEN) As Byte
End Type

' APIの定義
Private Declare Function RasEnumEntries Lib "rasapi32.dll" Alias _
    "RasEnumEntriesA" (ByVal Reserved As Long, ByVal lpszPhonebook As String, _
     lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long
Private Declare Function RasGetEntryDialParams Lib "rasapi32.dll" Alias _
    "RasGetEntryDialParamsA" (ByVal lpcstr As String, _
    ByRef lprasdialparamsa As RASDIALPARAMS, ByRef lpbool As Long) As Long

Private Sub Form_Load()
    Dim lngRtn As Long
    
    ' ダイヤルアップの全エントリを取得
    Dim EntryCnt As Long
    Dim Entry(255) As RASENTRYNAME
    Entry(0).dwSize = 264
    lngRtn = RasEnumEntries(0, vbNullString, Entry(0), Entry(0).dwSize * 255, EntryCnt)
    Dim i As Long
    For i = 0 To EntryCnt - 1
        ' ダイヤルアップの各エントリ毎の処理
        ' ダイヤルアップの各エントリ名を取得
        Dim entryName As String
        entryName = StrConv(Entry(i).szEntryName, vbUnicode)
        entryName = StripNulls(entryName)
        
        ' ダイヤルアップの各エントリのパラメタを取得
        Dim rasPara As RASDIALPARAMS
        rasPara.dwSize = 1052
        Dim j As Long
        For j = 0 To RAS_MaxEntryName - 1
            rasPara.szEntryName(j) = Entry(i).szEntryName(j)
        Next j
        lngRtn = RasGetEntryDialParams(vbNullString, rasPara, 0)
    
        ' ダイヤルアップの各エントリのユーザ名を取得
        Dim userName As String
        userName = StrConv(rasPara.szUserName, vbUnicode)
        userName = StripNulls(userName)
        
        ' ダイヤルアップの各エントリのパスワードを取得
        Dim passwd As String
        passwd = StrConv(rasPara.szPassword, vbUnicode)
        passwd = StripNulls(passwd)
        
        Debug.Print (i + 1) & ":" & entryName & ":" & userName & ":" & passwd
        ' [WinXPでの実行結果]
        ' 1:test:usertest:****************
        ' 2:あああ:aaa:****************
        ' 3:ABC:userabc:****************
        ' [考察]この方法ではWin95、98、Me、NT4.0までしか
        ' パスワードが確認出来ないようです。(未確認)
    Next i
End Sub

Public Function StripNulls(ByVal strOrg As String) As String
    On Error Resume Next
    If (InStr(strOrg, Chr(0)) > 0) Then
        strOrg = Left(strOrg, InStr(strOrg, Chr(0)) - 1)
    End If
    StripNulls = strOrg
End Function