I'd like to programmatically add a PST file to a person's Outlook profile. I found some code here:
http://www.eggheadcafe.com/community/aspnet/65/10030171/try-this-code.aspx
While that does the trick, it still leaves the question - "Where does outlook keep this list of mounted PST files?" Is it in the registry? A config file somewhere? Anybody?
That's an internal implementation detail subject to change from version to version.
This code (from a current project) searches for and decodes the names and paths of both Unicode & Non-Unicode PST files.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Outlook = Microsoft.Office.Interop.Outlook;
using Microsoft.Win32;
namespace PSTRemoval_v2
{
class PSTRReg
{
public RegistryKey regOPs, regPR, regCU, regCP, regCC;
public Dictionary<string, string> OpenPSTs = new Dictionary<string, string>();
public Dictionary<string, string> ClosedPSTs = new Dictionary<string, string>();
public Dictionary<string, string> PurgedPSTs = new Dictionary<string, string>();
public void ValidRegEntries(Outlook.Application olApp)
{
string prf = olApp.Session.CurrentProfileName; // retrieve current Outlook profile name. Needed in case user has multiple profiles
regCU = Registry.CurrentUser;
regOPs = regCU.CreateSubKey(String.Format(@"Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\{0}",prf));
regPR = regCU.CreateSubKey(String.Format(@"Software\WRT\OutlookAddins\PSTRemoval\{0}", prf)); // create a subkey in the registry for this profile
regCC = regPR.CreateSubKey(@"ClosedPSTs");
regCP = regPR.CreateSubKey(@"PurgedPSTs");
}
public void OpenPSTs_REG_Read()
{
PSTRNet regnet = new PSTRNet();
regnet.EnumerateNetworkDrives();
string[] sk = regOPs.GetSubKeyNames();
foreach (string subkey in sk)
{
RegistryKey rk2 = regOPs.OpenSubKey(subkey);
if (rk2.ValueCount > 0)
{
string[] vn = rk2.GetValueNames();
Array.Sort(vn);
int bs = Array.BinarySearch(vn, "001f3001"); // search for the PST Name
int bs1 = Array.BinarySearch(vn, "001f3006"); // PST Name alternative
if ((bs > -1) || (bs1 > -1))
{
int bs2 = Array.BinarySearch(vn, "001f6700"); // search for the PST Path
if (bs2 > -1)
{
// decode the Name & Path to text strings
string PSTName;
try { PSTName = decode(vn[bs], rk2); }
catch { PSTName = decode(vn[bs1], rk2); }
string PSTPath = decode(vn[bs2], rk2);
if (regnet.PSTOnNet(PSTPath)) // add the PST to the list if it is on a network drive
{
try
{
OpenPSTs.Add(PSTPath, PSTName);
}
catch { }
regOPs.DeleteSubKey(subkey); // then delete the entry from the main part of the registry
}
}
}
}
}
}
public void PSTs_REG_Read(RegistryKey regkey, Dictionary<string, string> entries)
{
string[] RK = regkey.GetValueNames();
if (RK.Length > 0)
foreach (string ValueName in RK)
try { entries.Add(ValueName, regkey.GetValue(ValueName).ToString()); }
catch { }
}
public void PSTs_Reg_write(RegistryKey regKey, Dictionary<string, string> entries)
{
string[] RK_Delete = regKey.GetValueNames();
if (RK_Delete.Length > 0)
foreach (string ValueName in RK_Delete)
regKey.DeleteValue(ValueName);
foreach (KeyValuePair<string, string> kvp in entries)
regKey.SetValue(kvp.Key, kvp.Value);
}
private string decode(string value, RegistryKey rk) // decode registry entries from Unicode to plain text
{
byte[] b = (byte[])rk.GetValue(value);
return Encoding.Unicode.GetString(b);
}
}
}
}
The registry entry is Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\<ProfileName>
001f301 is the name of the unicode PST
It's in the registry, by the way.