Examples.
For the sake of simplicity no variables are dimmed.
'Enumerate and print the names
of all services in all profiles
set Profiles=CreateObject("ProfMan.Profiles")
for i = 1 to Profiles.Count
set Profile = Profiles.Item(i)
set Services = Profile.Services
Debug.Print "------ " & Profile.Name & " ------"
for j = 1 to Services.Count
Debug.Print Services.Item(j).ServiceName
next
next
'Print the path to all the
PST files in all profiles
PR_PST_PATH = &H6700001E
set Profiles=CreateObject("ProfMan.Profiles")
for i = 1 to Profiles.Count
set Profile = Profiles.Item(i)
set Services = Profile.Services
Debug.Print "------ Profile: " & Profile.Name & " ------"
for j = 1 to Services.Count
set Service = Services.Item(j)
If (Service.ServiceName = "MSPST MS") or (Service.ServiceName = "MSUPST MS")
Then
'there should be only one provider for this
service
'but we should really loop through all the providers
Debug.Print Service.Providers.Item(1).ProfSect.Item(PR_PST_PATH)
End If
next
next
'Enumerate and print the
names of all services and providers in all profiles
set Profiles=CreateObject("ProfMan.Profiles")
for i = 1 to Profiles.Count
set Profile = Profiles.Item(i)
set Services = Profile.Services
Debug.Print "------ " & Profile.Name
for j = 1 to Services.Count
set Service = Services.Item(j)
Debug.Print " ------ " & Service.ServiceName
for k = 1 to Service.Providers.Count
set Provider = Service.Providers.Item(k)
Debug.Print " ------ " & Provider.DisplayName
next
next
next
'Create (or reuse) a
profile and add a PST file if it is not already there
PR_PST_PATH = &H6700001E
PR_DISPLAY_NAME = &H3001001E
ProfileName = "Test PST Profile"
PSTPath = "c:\MyNewPST.pst"
set Profiles=CreateObject("ProfMan.Profiles")
on Error Resume Next
Err.Clear
set Profiles=CreateObject("ProfMan.Profiles")
set NewProfile = Profiles.Item(ProfileName)
if Err.Number <> 0 Then
set NewProfile = Profiles.Add(ProfileName, false, false)
End If
set Services = NewProfile.Services
bPSTFound = false
for i = 1 to Services.Count
set Service = Services.Item(i)
for j = 1 to Service.Providers.Count
set Provider = Service.Providers.Item(j)
if Provider.ProfSect.Item(PR_PST_PATH) = PSTPath Then
bPSTFound = true
End If
next
next
If not bPSTFound Then
set PstService = NewProfile.Services.Add("MSPST MS", "Personal Folders", false)
set Properties = CreateObject("ProfMan.PropertyBag")
Properties.Add PR_PST_PATH, PSTPath
Properties.Add PR_DISPLAY_NAME, "The greatest PST file ever"
PstService.Configure 0, , Properties
End If
'Create new profile, add
an Exchange server to it, configure
'and make it default
ProfileName = "Exchange Server Profile"
PR_PROFILE_UNRESOLVED_NAME = &H6607001E
PR_PROFILE_UNRESOLVED_SERVER = &H6608001E
On Error Resume Next
set Profiles=CreateObject("ProfMan.Profiles")
'does that profile already exist?
set NewProfile = Profiles.Item(ProfileName)
if Err.Number <> 0 Then
'No, we must create the profile. Do so without
adding the default
'services and without showing any UI
set NewProfile = Profiles.Add(ProfileName,
false, false)
End If
'make the profile default
NewProfile.Default = true
'Add Exchange service
set ExchService = NewProfile.Services.Add("MSEMS",
"Microsoft Exchange", false)
'create "ProfMan.PropertyBag" object to be used
later
'in a call to ExchService.Configure
set Properties = CreateObject("ProfMan.PropertyBag")
'add the properties required to silently
'configure the Exchange provider
Properties.Add PR_PROFILE_UNRESOLVED_NAME,
"username" 'real value must used, e.g. "dmitry"
Properties.Add PR_PROFILE_UNRESOLVED_SERVER, "AddressOfTheServer"
'real value must used, e.g. "MyMailServer"
'Silently configure the Exchange provider
'ShowUI: 0 - never, 1 - if necessary, 2 - always
'Note: domain logon dialog will always be shown
'if you are not currently logged in to the same domain
ExchService.Configure 0, , Properties
add an extra Exchange mailbox to a given profile. This sample uses CDO to
retrieve the properties of the mailbox to be added
'see Q171636 for details
'todo: replace the name of the profile!!!
strProfileName = "Dmitry Streblechenko"
PR_STORE_PROVIDERS = &H3D000102
PR_PROVIDER_UID = &H300C0102
PR_DISPLAY_NAME = &H3001001E
PR_PROFILE_MAILBOX = &H660B001E
PR_PROFILE_SERVER = &H660C001E
PR_PROFILE_SERVER_DN = &H6614001E
PR_EMAIL_ADDRESS = &H3003001E
Sub AddMailBox(strProfile, strDisplayName, strMailboxDN, strServer, strServerDN)
set Profiles=CreateObject("ProfMan.Profiles")
if strProfile = "" Then
set Profile = Profiles.DefaultProfile
Else
set Profile = Profiles.Item(strProfile)
End If
'find the Exchange service
set Services = Profile.Services
for i = 1 to Services.Count
set Service = Services.Item(i)
if Service.ServiceName = "MSEMS" Then
'Add "EMSDelegate" provider
set Properties = CreateObject("ProfMan.PropertyBag")
Properties.Add PR_DISPLAY_NAME, strDisplayName
Properties.Add PR_PROFILE_MAILBOX, strMailboxDN
Properties.Add PR_PROFILE_SERVER, strServer
Properties.Add PR_PROFILE_SERVER_DN, strServerDN
set Provider = Service.Providers.Add("EMSDelegate", Properties)
'update the old value of PR_STORE_PROVIDERS so
that Outlook
'will show the mailbox in the list in Tools | Services
set GlobalProfSect = Profile.GlobalProfSect
OldProviders = GlobalProfSect.Item(PR_STORE_PROVIDERS)
strUID = Provider.UID
GlobalProfSect.Item(PR_STORE_PROVIDERS) = OldProviders & strUID
End If
Next
End Sub
'get PR_PROFILE_SERVER and PR_PROFILE_SERVER_DN
'It is assumed that the mailbox to add is on the
same server as the current user's mailbox
MAPI_STORE_PROVIDER = 33
set Profiles=CreateObject("ProfMan.Profiles")
set Profile = Profiles.Item(strProfileName)
set Services = Profile.Services
for i = 1 to Services.Count
set Service = Services.Item(i)
if Service.ServiceName = "MSEMS" Then
set Providers = Service.Providers
for j = 1 to Providers.Count
set Provider = Providers.Item(j)
if Provider.ResourceType = MAPI_STORE_PROVIDER Then
set ProfSect = Provider.ProfSect
strProfileServer = ProfSect.Item(PR_PROFILE_SERVER)
strProfileServerDN = ProfSect.Item(PR_PROFILE_SERVER_DN)
End If
Next
End If
Next
'Add the first GAL entry's mailbox to the default
profile
set AddrEntry = CDOSession.AddressLists.Item("Global
Address List").AddressEntries.Item(1)
AddMailBox strProfileName, _
"Mailbox - " & AddrEntry.Fields(PR_DISPLAY_NAME).Value, _
AddrEntry.Fields(PR_EMAIL_ADDRESS).Value, _
strProfileServer, _
strProfileServerDN
'display the path to the
archive PST file (if available) for a given profile
'replace the profile name with the name of the actual profile
set Profiles=CreateObject("ProfMan.Profiles")
'set Profile = Profiles.DefaultProfile
set Profile = Profiles.Item("dimastr.com")
set ProfSect = Profile.OpenProfileSection("{00020D0A-0000-0000-C000-000000000046}")
MsgBox ProfSect.Item(&H0324001E)
Create and configure a new profile that uses ROH (RPC-over-HTTP) to connect to an Office 365 mailbox.
ProfileName = "ROH 1"
strProfileUserName = "test@AdvancedMessagingSystemsLLC.onmicrosoft.com"
'the data below must be retrieved
from the autodiscover XML. The comments indicate the XML element names
strProxyPrincipalName = "msstd:outlook.com" ' EXPR\CertPrincipalName
strSSL = "On" ' EXPR\SSL
strAuthPackage = "Basic" ' 'EXPR\AuthPackage - Basic or Ntlm
strProxyServerName = "outlook.office365.com" ' EXPR\Server
strProfileServerName =
"74a4d8f2-178a-4fa0-9735-61e9bb0f51d9@advancedmessagingsystemsllc.onmicrosoft.com"
'proxy server from EXCH\Server
strProfileAuthPackage = "Anonymous" 'EXCH\AuthPackage
strServerDN = "/o=ExchangeLabs/ou=Exchange Administrative Group
(FYDIBOHF23SPDLT)/cn=Configuration/cn=Servers/cn=74a4d8f2-178a-4fa0-9735-61e9bb0f51d9@advancedmessagingsystemsllc.onmicrosoft.com"
'EXCH\ServerDN
PR_PROFILE_UNRESOLVED_NAME_W = &H6607001F
PR_PROFILE_UNRESOLVED_SERVER_W = &H6608001F
PR_PROFILE_AUTH_PACKAGE = &H66190003
PR_ROH_PROXY_AUTH_SCHEME = &H66270003
PR_ROH_FLAGS = &H66230003
PR_ROH_PROXY_SERVER_W = &H6622001F
PR_ROH_PROXY_PRINCIPAL_NAME_W =
&H6625001F
ROHAUTH_BASIC = 1
ROHAUTH_NTLM = 2
RPC_C_AUTHN_NONE = 0
RPC_C_AUTHN_GSS_NEGOTIATE = 9
RPC_C_HTTP_AUTHN_SCHEME_NTLM = 2
RPC_C_HTTP_AUTHN_SCHEME_BASIC = 1
ROHFLAGS_USE_ROH = 1
ROHFLAGS_SSL_ONLY = 2
ROHFLAGS_MUTUAL_AUTH = 4
ROHFLAGS_HTTP_FIRST_ON_FAST = 8
ROHFLAGS_HTTP_FIRST_ON_SLOW = 32
set Profiles=CreateObject("ProfMan.Profiles")
set Profile = Profiles.Add(ProfileName, false, false)
'Add Exchange service
set ExchService = Profile.Services.Add("MSEMS", "Microsoft Exchange", false)
set GlobalProfSect = Profile.GlobalProfSect
If strAuthPackage = "Ntlm" Then
intAuthScheme = ROHAUTH_NTLM
Else
intAuthScheme = ROHAUTH_BASIC
End If
'cache username/domain in the global section
'this way Outlook will know what to put in the credentials prompt dialog
GlobalProfSect.Item(&H3D16001F) = strProfileUserName
GlobalProfSect.Item(&H3D17001F)= "" 'Domain name in case of NTLM credentials
domain\user
GlobalProfSect.Item(PR_PROFILE_UNRESOLVED_SERVER_W) = strProfileServerName
GlobalProfSect.Item(PR_PROFILE_UNRESOLVED_NAME_W) = strProfileUserName
GlobalProfSect.Item(PR_ROH_PROXY_PRINCIPAL_NAME_W)
= strProxyPrincipalName
if strProfileAuthPackage = "Anonymous" Then
GlobalProfSect.Item(PR_PROFILE_AUTH_PACKAGE)=
RPC_C_AUTHN_NONE
Else
GlobalProfSect.Item(PR_PROFILE_AUTH_PACKAGE)=
RPC_C_AUTHN_GSS_NEGOTIATE
End If
dwRohFlags = ROHFLAGS_USE_ROH or ROHFLAGS_HTTP_FIRST_ON_FAST or
ROHFLAGS_HTTP_FIRST_ON_SLOW
if strSsl = "On" Then
dwRohFlags = dwRohFlags or ROHFLAGS_SSL_ONLY
end If
if strAuthPackage = "Ntlm" Then
GlobalProfSect.Item(PR_ROH_PROXY_AUTH_SCHEME) =
RPC_C_HTTP_AUTHN_SCHEME_NTLM
dwRohFlags = dwRohFlags or ROHFLAGS_MUTUAL_AUTH or
ROHFLAGS_SSL_ONLY
Else
GlobalProfSect.Item(PR_ROH_PROXY_AUTH_SCHEME) =
RPC_C_HTTP_AUTHN_SCHEME_BASIC
End If
GlobalProfSect.Item(PR_ROH_FLAGS) = dwRohFlags
GlobalProfSect.Item(PR_ROH_PROXY_SERVER_W) = strProxyServerName
strUserEmailAdddress = "user@domain.demo"
strDisplayName = "Joe The User"
PROFILE_NAME = "Outlook2016Profile"
PR_DISPLAY_NAME_W = &H3001001F
PR_PROFILE_USER_SMTP_EMAIL_ADDRESS_W = &H6641001F
PR_EMSMDB_SECTION_UID = &H3D150102
PR_STORE_PROVIDERS = &H3D000102
' ---------- create profile
set Profiles = CreateObject("ProfMan.Profiles")
set NewProfile = Profiles.Add(PROFILE_NAME, false, false)
NewProfile.Default = True
' ---------- add MSEMS service
set ExchService = NewProfile.Services.Add("MSEMS","Microsoft Exchange", false)
' ---------- get GUID in MSEMS service
vProfileGuid = ExchService.ProfSect.Item(PR_EMSMDB_SECTION_UID)
' ---------- get matching provider in MSEMS service
for k = 1 to ExchService.Providers.Count
set ExProvider = ExchService.Providers.Item(k)
ProviderUid = ExProvider.UID
if ProviderUid = vProfileGuid then
' ---------- get ProfSect in provider
set ProviderProfSect = ExProvider.ProfSect
' ---------- get email address to provider ProfSect
ProviderProfSect.Item(PR_PROFILE_USER_SMTP_EMAIL_ADDRESS_W) =
strUserEmailAdddress
' ---------- get Store Provider Uid
ProviderStoreUid = ExchService.ProfSect.Item(PR_STORE_PROVIDERS)
end if
next
for k = 1 to ExchService.Providers.Count
set ExProvider = ExchService.Providers.Item(k)
ProviderUid = ExProvider.UID
if ProviderUid = ProviderStoreUid then
' ---------- get store ProfSect in provider
set StoreProviderProfSect = ExProvider.ProfSect
' ---------- get email address to store provider ProfSect
StoreProviderProfSect.Item(PR_PROFILE_USER_SMTP_EMAIL_ADDRESS_W) =
strUserEmailAdddress
end if
next
|