2009-05-13 3 views

Antwort

1

Dies ist ein internes Implementierungsdetail, das von Version zu Version geändert werden kann.

+2

... und Sie sollten einen API-Aufruf verwenden, um die Liste der montierten PST-Dateien zu erhalten, anstatt um zu graben in Outlook-Mechanismen –

+0

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

-1

Es ist übrigens in der Registrierung.

1

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