Dieser Code (aus einem aktuellen Projekt) sucht nach und dekodiert die Namen und Pfade von beiden Unicode & Nicht-Unicode-PST-Dateien.
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);
}
}
}
}
Der Registrierungseintrag ist Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\<ProfileName>
001f301 der Name des Unicode-PST
... und Sie sollten einen API-Aufruf verwenden, um die Liste der montierten PST-Dateien zu erhalten, anstatt um zu graben in Outlook-Mechanismen –
Touche - ich nehme an, es ist, und ich sollte die API verwenden. Ich nehme an, dass ich mein Problem lösen werde, indem ich ein Tool schreibe, das die PST-Dateien auflistet, sie alle löscht, die Dateien an einen neuen Ort verschiebt und dann die neuen Dateien anhängt. Danke für die Realitätsprüfung. – SqlRyan