2009-09-22 39 views
1

我們最近被迫轉移到全球一半的新域名服務器。這可能看起來並不是什麼大的改變,但我們經常運行的一個流程突然間形成了一個2秒命令到一個5分鐘命令。複製像XCopy這樣的ACL信息

原因?我們正在根據「模板」目錄結構更新許多目錄的權限。

我們發現XCOPY可以在同一個老兩秒的窗口中更新大部分這些設置。剩下的設置當然會被關閉。

我想弄清楚的是,XCopy如何更快地實現.NET安全類本應該執行的操作?顯然我錯過了一些東西。

複製目錄的ACL信息而不ping(或最小程度地ping)域/ Active Directory服務器的最佳方法是什麼?

這是我有:

... 

    DirectorySecurity TemplateSecurity = new DirectorySecurity(TemplateDir, AccessControlSections.All); 

    ... 


    public static void UpdateSecurity(string destination, DirectorySecurity TemplateSecurity) 
    { 
     DirectorySecurity dSecurity = Directory.GetAccessControl(destination); 

     // Remove previous security settings. (We have all we need in the other TemplateSecurity setting!!) 
     AuthorizationRuleCollection acl_old = dSecurity.GetAccessRules(true, true, typeof(NTAccount)); 
     foreach (FileSystemAccessRule ace in acl_old) 
     { 
      // REMOVE IT IF YOU CAN... if you can't don't worry about it. 
      try 
      { 
       dSecurity.RemoveAccessRule(ace); 
      } 
      catch { } 
     } 

     // Remove the inheritance for the folders... 
     // Per the business unit, we must specify permissions per folder. 
     dSecurity.SetAccessRuleProtection(true, true); 

     // Copy the permissions from TemplateSecurity to Destination folder. 
     AuthorizationRuleCollection acl = TemplateSecurity.GetAccessRules(true, true, typeof(NTAccount)); 

     foreach (FileSystemAccessRule ace in acl) 
     { 
      // Set the existing security. 
      dSecurity.AddAccessRule(ace); 

      try 
      { 
       // Remove folder inheritance... 
       dSecurity.AddAccessRule(new FileSystemAccessRule(
        ace.IdentityReference, ace.FileSystemRights, 
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
        PropagationFlags.None, 
        ace.AccessControlType)); 
      } 
      catch { } 
     } 

     // Apply the new changes. 
     Directory.SetAccessControl(destination, dSecurity); 
    } 

回答

1

好吧...我有挖掘互聯網上一噸後一個工作原型。不用說,網上有很多關於ACL的錯誤信息。我不完全確定,如果這一點的信息將是一個天賜之物,或更多的錯誤信息。我將不得不離開你,用戶,決定。

我最終得到的是乾淨,光滑,非常非常快,因爲它沒有觸碰域服務器。我直接複製SDDL條目。等等,你說...你不能在目錄上這樣做,因爲你得到了可怕的SeSecurityPrivilege錯誤!

如果僅將副本限制爲訪問控制列表(ACL),則不適用。

下面的代碼:

public static void UpdateSecurity(string destination, DirectorySecurity templateSecurity) 
    { 
     DirectorySecurity dSecurity = Directory.GetAccessControl(destination); 

     string sddl = templateSecurity.GetSecurityDescriptorSddlForm(AccessControlSections.Access); 
     try 
     { 
      // TOTALLY REPLACE The existing access rights with the new ones. 
      dSecurity.SetSecurityDescriptorSddlForm(sddl, AccessControlSections.Access); 

      // Disable inheritance for this directory. 
      dSecurity.SetAccessRuleProtection(true, true); 


      // Apply these changes. 
      Directory.SetAccessControl(destination, dSecurity); 
     } 
     catch (Exception ex) 
     { 
      // Note the error on the console... we can formally log it later. 
      Console.WriteLine(pth1 + " : " + ex.Message); 
     } 


     // Do some other settings stuff here... 

    } 

注意AccessControlSections.Access標誌的SDDL方法。這是使這一切工作的魔法關鍵。