Programmaticaly阻止Vista桌面搜索(WDS)索引放置在映射网络驱动器上的pst文件

经过几天多次尝试,我没有找到任何100%的解决方案来解决这个问题。 我的搜索和调查范围:

  1. 直接访问注册表:HKLM \ SOFTWARE \ Microsoft \ Windows Search \ CrawlScopeManager \ Windows \ SystemIndex \ WorkingSetRules HKCU \ Software \ Microsoft \ Windows Search \ Gather \ Windows \ SystemIndex \ Protocols \ Mapi HKLM \ SOFTWARE \ Microsoft \ Windows Search \ Gather \ Windows \ SystemIndex \ Sites \和其他键…
  2. Windows搜索3.X接口,如使用Microsoft.Search.Interop的ISearchManager
  3. Microsoft.Office.Interop.Outlook类:NameSpace,Store
  4. 广告政策(没用,没有效果:(

首选技术:VB.NET,C#。 此解决方案必须部署在大型组织中(大约5000个wokstations)。

有任何想法吗? 提前致谢。

using Microsoft.Search.Interop; using Microsoft.Office.Interop.Outlook; using Microsoft.Win32; using System; using System.IO; using System.Text; using System.Net; using System.Security.Principal; namespace PstIndexingDisabler { class Program { static void Main(string[] args) { Application objApp = null; ISearchManager objManager = null; ISearchCatalogManager objCatalog = null; ISearchCrawlScopeManager objScope = null; string strSID = null; try { Console.WriteLine("Creating search management objects..."); objManager = new CSearchManagerClass(); objCatalog = objManager.GetCatalog("SystemIndex"); objScope = objCatalog.GetCrawlScopeManager(); Console.WriteLine("Obtaining currently logged user's SID..."); strSID = String.Concat("{", WindowsIdentity.GetCurrent().User.Value.ToString().ToLower(), "}"); Console.WriteLine(" The SID is: {0}", strSID); Console.WriteLine("Starting Outlook application..."); objApp = new Application(); Console.WriteLine("Enumerating PST files..."); foreach (Store objStore in objApp.GetNamespace("MAPI").Stores) { Console.WriteLine("Analysing file: {0}...", objStore.FilePath); if (objStore.ExchangeStoreType != OlExchangeStoreType.olNotExchange || objStore.IsCachedExchange != true) Console.WriteLine(" Rejected. This file is not cached exchange store."); else if (Path.GetPathRoot(objStore.FilePath).StartsWith("C", StringComparison.OrdinalIgnoreCase)) Console.WriteLine(" Rejected. This file is located on the C: drive."); else if (objStore.IsInstantSearchEnabled != true) Console.WriteLine(" Rejected. Instant search was already disabled for this file."); else { Console.WriteLine(" Accepted. Indexing of this file will be disabled."); Console.WriteLine(" Computing store hash..."); string strHash = ComputeHash(objStore.StoreID); Console.WriteLine(" The hash is: {0}.", strHash); string strUrl = String.Format("mapi://{0}/{1}(${2})/", strSID, objStore.DisplayName, strHash); Console.WriteLine(" Disabling indexing..."); Console.WriteLine(" The rule url is: {0}.", strUrl); objScope.AddUserScopeRule(strUrl, 0, 1, 0); objScope.SaveAll(); Console.WriteLine(" Operation successfull!"); } } } catch (System.Exception e) { Console.WriteLine(); Console.WriteLine("An error occured!"); Console.WriteLine(e.ToString()); } Console.WriteLine(); Console.WriteLine("Press return to exit."); Console.ReadLine(); } private static string ComputeHash(string storeEID) { int idx = 0; // Index in buffer uint hash = 0; // The hash int lengthStoreEID = storeEID.Length / 2; // Length of store EID -- divide by 2 because 2 text characters here represents 1 byte // --- Pass 1: Main block (multiple of dword, ie 4 bytes) --- int cdw = lengthStoreEID / sizeof(uint); // cdw = Count Double Words (ie number of double words in the buffer) for (int i = 0; i < cdw; i++, idx += 8) { int dword = int.Parse(storeEID.Substring(idx, 8), System.Globalization.NumberStyles.HexNumber); hash = (hash << 5) + hash + (uint)IPAddress.HostToNetworkOrder(dword); } // --- Pass 2: Remainder of the block --- int cb = lengthStoreEID % sizeof(uint); // cb = Count Bytes (ie number of bytes left in the buffer after pass 1) for (int j = 0; j < cb; idx++, j++) { hash = (hash << 5) + hash + byte.Parse(storeEID.Substring(idx, 2), System.Globalization.NumberStyles.HexNumber); } return hash.ToString("x"); } private static string EncodeEID(string EID) { StringBuilder result = new StringBuilder(EID.Length); for (int i = 0; i < EID.Length; i += 2) result.Append((char)(byte.Parse(EID.Substring(i, 2), System.Globalization.NumberStyles.HexNumber) + 0xAC00)); return result.ToString(); } } }