Where does Outlook store which PST files are mount

2019-08-03 21:26发布

问题:

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?

回答1:

That's an internal implementation detail subject to change from version to version.



回答2:

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



回答3:

It's in the registry, by the way.