|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
| Visual Basic Registry Routines RegEnumKeyEx: POP3, SMTP, NNTP and LDAP Account Info (Outlook Express) |
||
| Posted: | Sunday July 07, 2002 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows XP | |
| OS restrictions: | None | |
| Author: | VBnet - Randy Birch | |
|
Related: |
RegQueryValueEx: Retrieve Email Account Info (Outlook) RegEnumKeyEx: POP3, SMTP, NNTP and LDAP Account Info (Outlook Express) Retrieving the User's Default Email Address (Outlook Express) RegQueryValueEx: Determine the User's Default Mail Client |
|
| Prerequisites |
| None. |
|
|
Under
the registry key HKEY_CURRENT_USER\Software\Microsoft\Internet Account
Manager resides all account information for all configured internet
accounts for the current user of Outlook Express. This includes POP3 and
SMTP (email) accounts, as well as NNTP (newsgroup) accounts. Following enumeration of the account
names specifics of each account can be extracted.
Because some accounts have both POP3 and SMTP components, the code below attempts to retrieve both sets of information from each account. In addition, as shown as the first three items in the illustration, the code also retrieves the mail, news and LDAP default accounts, with the values returned representing the account names. There can be considerably more information provided for a given account. In addition, not all accounts have the same information, even when the same account type. This is reflective of both the information requested when the account is created, and the extent of the information entered by the user. If you're targeting systems using Outlook the registry info is stored in a different area and using a different syntax. Please see RegQueryValueEx: Retrieve Email Account Info (Outlook) for an Outlook-specific method that was developed and tested with Outlook 2003. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| Add a single command button (Command1) and a listbox (List1) to a form, along with the following code: |
|
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const HKEY_CURRENT_USER = &H80000001
Private Const REG_SZ As Long = 1
Private Const ERROR_MORE_DATA = 234
Private Const ERROR_SUCCESS As Long = 0
Private Const LB_SETTABSTOPS As Long = &H192
Private Const STANDARD_RIGHTS_READ As Long = &H20000
Private Const KEY_QUERY_VALUE As Long = &H1
Private Const KEY_ENUMERATE_SUB_KEYS As Long = &H8
Private Const KEY_NOTIFY As Long = &H10
Private Const SYNCHRONIZE As Long = &H100000
Private Const KEY_READ As Long = ((STANDARD_RIGHTS_READ Or _
KEY_QUERY_VALUE Or _
KEY_ENUMERATE_SUB_KEYS Or _
KEY_NOTIFY) And _
(Not SYNCHRONIZE))
'type holding data queried
Private Type REG_INET_INFO
RegistryName As String
NNTPDefAccount As String
DefaultNewsAcct As String
DefaultMailAcct As String
DefaultLDAPAcct As String
NNTPSignature As String
NNTPServer As String
NNTPAccountName As String
NNTPUserName As String
NNTPEmail As String
NNTPReplyEmail As String
SMTPSignature As String
SMTPServer As String
SMTPAccountName As String
SMTPEmail As String
SMTPUserName As String
SMTPReplyEmail As String
POP3Server As String
POP3AccountName As String
POP3UserName As String
POP3Email As String
POP3ReplyEmail As String
LDAPServer As String
LDAPAccountName As String
LDAPUrl As String
End Type
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
Alias "RegOpenKeyExA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
phkResult As Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" _
Alias "RegEnumKeyExA" _
(ByVal hKey As Long, _
ByVal dwIndex As Long, _
ByVal lpName As String, _
lpcbName As Long, _
ByVal lpReserved As Long, _
ByVal lpClass As String, _
lpcbClass As Long, _
lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
Alias "RegQueryValueExA" _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Any, _
lpcbData As Long) As Long
Private Declare Function RegQueryInfoKey Lib "advapi32.dll" _
Alias "RegQueryInfoKeyA" _
(ByVal hKey As Long, _
ByVal lpClass As String, _
lpcbClass As Long, _
ByVal lpReserved As Long, _
lpcSubKeys As Long, _
lpcbMaxSubKeyLen As Long, _
lpcbMaxClassLen As Long, _
lpcValues As Long, _
lpcbMaxValueNameLen As Long, _
lpcbMaxValueLen As Long, _
lpcbSecurityDescriptor As Long, _
lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function lstrlenW Lib "kernel32" _
(ByVal lpString As Long) As Long
Private Sub Form_Load()
'Setup tabstops in the listbox by first
'clearing existing tabs, then setting the
'new tabstop value.
ReDim TabArray(0 To 0) As Long
TabArray(0) = 100
Call SendMessage(List1.hwnd, LB_SETTABSTOPS, 0&, ByVal 0&)
Call SendMessage(List1.hwnd, LB_SETTABSTOPS, 1&, TabArray(0))
List1.Refresh
Command1.Caption = "Get Account Info"
End Sub
Private Sub Form_Resize()
If Me.WindowState <> vbMinimized Then
If List1.Width > 100 Then
List1.Move List1.Left, List1.Top, Me.ScaleWidth - (List1.Left * 2)
End If
End If
End Sub
Private Sub Command1_Click()
Dim ft As FILETIME
Dim dwIndex As Long
Dim success As Long
Dim sKey As String
Dim hKey As Long
Dim sName As String
Dim cbName As Long
Dim dwSubKeys As Long
Dim dwMaxSubKeyLen As Long
Dim acct As REG_INET_INFO
'Call a helper function to obtain the user's
'default account keys, returning the data in
'the REG_INET_INFO 'acct' UDT
sKey = "Software\Microsoft\Internet Account Manager"
hKey = OpenRegKey(HKEY_CURRENT_USER, sKey)
'if valid
If hKey <> 0 Then
'get default user data and close that
'key as its no longer needed
acct = GetInetDefaultAccountInfo(hKey)
Call RegCloseKey(hKey)
'show the default account data
List1.AddItem "Default Mail account" & vbTab & acct.DefaultMailAcct
List1.AddItem "Default News account" & vbTab & acct.DefaultNewsAcct
List1.AddItem "Default LDAP account" & vbTab & acct.DefaultLDAPAcct
List1.AddItem ""
'-----------------
'GET DATA FROM ALL INTERNET ACCOUNTS
'now obtain a handle to the \Accounts
'key under the key above
sKey = "Software\Microsoft\Internet Account Manager\Accounts"
hKey = OpenRegKey(HKEY_CURRENT_USER, sKey)
'if valid
If hKey <> 0 Then
'query registry for the number of
'entries under that key
If RegQueryInfoKey(hKey, _
0&, _
0&, _
0, _
dwSubKeys, _
dwMaxSubKeyLen&, _
0&, _
0&, _
0&, _
0&, _
0&, _
ft) = ERROR_SUCCESS Then
'enumerate each item, pass it
'to a helper function to retrieve
'data for that key, and add to
'the list
For dwIndex = 0 To dwSubKeys - 1
sName = Space$(dwMaxSubKeyLen + 1)
cbName = Len(sName)
success = RegEnumKeyEx(hKey, _
dwIndex, _
sName, _
cbName, _
0, _
0, _
0, _
ft)
If success = ERROR_SUCCESS Or _
success = ERROR_MORE_DATA Then
'call a helper function to
'retrieve the data under each
'account, returning results to
'the UDT.
acct = GetInetAccountKeyInfo(sKey, TrimNull(sName))
'show the data
With List1
.AddItem "Account " & acct.RegistryName
If Len(acct.NNTPServer) > 0 Then
'it's a news server
.AddItem "NNTP Type" & vbTab & acct.NNTPSignature
.AddItem "NNTP Name" & vbTab & acct.NNTPAccountName
.AddItem "NNTP User" & vbTab & acct.NNTPUserName
.AddItem "NNTP Server" & vbTab & acct.NNTPServer
.AddItem "NNTP Email" & vbTab & acct.NNTPEmail
.AddItem "NNTP ReplyTo" & vbTab & acct.NNTPReplyEmail
ElseIf Len(acct.LDAPServer) <> 0 Then
'it's a LDAP server
.AddItem "Name" & vbTab & acct.NNTPAccountName
.AddItem "LDAP Server" & vbTab & acct.LDAPServer
.AddItem "LDAP Url" & vbTab & acct.LDAPUrl
Else
'it's an email server
.AddItem "SMTP Type" & vbTab & acct.SMTPSignature
.AddItem "SMTP Name" & vbTab & acct.SMTPAccountName
.AddItem "SMTP Server" & vbTab & acct.SMTPServer
.AddItem "SMTP User" & vbTab & acct.SMTPUserName
.AddItem "SMTP Email" & vbTab & acct.SMTPEmail
.AddItem "SMTP ReplyTo" & vbTab & acct.SMTPReplyEmail
.AddItem "POP3 Name" & vbTab & acct.POP3AccountName
.AddItem "POP3 Server" & vbTab & acct.POP3Server
.AddItem "POP3 User" & vbTab & acct.POP3UserName
.AddItem "POP3 Email" & vbTab & acct.POP3Email
.AddItem "POP3 ReplyTo" & vbTab & acct.POP3ReplyEmail
End If
'just a blank entry to separate
.AddItem ""
End With 'List1
End If 'success
Next 'dwIndex
End If 'RegQueryInfoKey
Call RegCloseKey(hKey)
End If 'hKey <> 0
End If 'hKey <> 0
End Sub
Private Function GetInetDefaultAccountInfo(hKey As Long) As REG_INET_INFO
If hKey <> 0 Then
With GetInetDefaultAccountInfo
.DefaultLDAPAcct = GetRegValue(hKey, "Default LDAP Account")
.DefaultMailAcct = GetRegValue(hKey, "Default Mail Account")
.DefaultNewsAcct = GetRegValue(hKey, "Default News Account")
End With
End If
End Function
Private Function GetInetAccountKeyInfo(ByVal sKey As String, _
ByVal lpValueName As String) As REG_INET_INFO
'retrieve the available data
'from a particular set of account keys
Dim hSubKey As Long 'handle of the open subkey
hSubKey = OpenRegKey(HKEY_CURRENT_USER, sKey & "\" & lpValueName)
If hSubKey <> 0 Then
With GetInetAccountKeyInfo
.RegistryName = lpValueName
.NNTPAccountName = GetRegValue(hSubKey, "Account Name")
.NNTPSignature = GetRegValue(hSubKey, "NNTP Signature")
.NNTPServer = GetRegValue(hSubKey, "NNTP Server")
.NNTPEmail = GetRegValue(hSubKey, "NNTP Email Address")
.NNTPUserName = GetRegValue(hSubKey, "NNTP User Name")
.SMTPSignature = GetRegValue(hSubKey, "SMTP Signature")
.SMTPServer = GetRegValue(hSubKey, "SMTP Server")
.SMTPAccountName = GetRegValue(hSubKey, "Account Name")
.SMTPUserName = GetRegValue(hSubKey, "SMTP User Name")
.SMTPEmail = GetRegValue(hSubKey, "SMTP Email Address")
.SMTPReplyEmail = GetRegValue(hSubKey, "SMTP Reply To Email Address")
.POP3Server = GetRegValue(hSubKey, "POP3 Server")
.POP3AccountName = GetRegValue(hSubKey, "Account Name")
.POP3UserName = GetRegValue(hSubKey, "POP3 User Name")
.POP3Email = GetRegValue(hSubKey, "POP3 Email Address")
.POP3ReplyEmail = GetRegValue(hSubKey, "POP3 Reply To Email Address")
.LDAPServer = GetRegValue(hSubKey, "LDAP Server")
.LDAPAccountName = GetRegValue(hSubKey, "Account Name")
.LDAPUrl = GetRegValue(hSubKey, "LDAP URL")
End With
Call RegCloseKey(hSubKey)
End If
End Function
Private Function OpenRegKey(ByVal hKey As Long, _
ByVal lpSubKey As String) As Long
Dim hSubKey As Long
If RegOpenKeyEx(hKey, _
lpSubKey, _
0, _
KEY_READ, _
hSubKey) = ERROR_SUCCESS Then
OpenRegKey = hSubKey
End If
End Function
Private Function GetRegValue(hSubKey As Long, sKeyName As String) As String
Dim lpValue As String 'name of the value to retrieve
Dim lpcbData As Long 'length of the retrieved value
Dim result As Long
'if valid
If hSubKey <> 0 Then
lpValue = Space$(260)
lpcbData = Len(lpValue)
'find the passed value if present
If RegQueryValueEx(hSubKey, _
sKeyName, _
0&, _
0&, _
ByVal lpValue, _
lpcbData) = ERROR_SUCCESS Then
GetRegValue = TrimNull(lpValue)
End If
End If
End Function
Private Function TrimNull(startstr As String) As String
TrimNull = Left$(startstr, lstrlenW(StrPtr(startstr)))
End Function |
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |