2009-05-13 13 views

Répondre

1

Il s'agit d'un détail d'implémentation interne susceptible de changer de version en version.

+2

... et vous devez utiliser un appel API pour obtenir la liste des fichiers PST montés, au lieu de creuser autour dans les mécanismes d'Outlook –

+0

Touche - Je suppose que c'est, et je devrais utiliser l'API. Je suppose que je vais résoudre mon problème en écrivant un outil qui répertorie les fichiers PST, les détache tous, déplace les fichiers vers un nouvel emplacement, puis attache les nouveaux fichiers. Merci pour la vérification de la réalité. – SqlRyan

-1

C'est dans le registre, soit dit en passant.

1

Ce code (issu d'un projet en cours) recherche et décode les noms et les chemins des fichiers Unicode & PST non Unicode.

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); 
      } 
     } 
    } 
} 

L'entrée de Registre est Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\<ProfileName>

001f301 est le nom de l'unicode PST