Скопируйте информацию ACL как XCopy - PullRequest
1 голос
/ 22 сентября 2009

Недавно мы были вынуждены перейти на новый сервер домена на полпути по всему миру. Это может показаться небольшим изменением, но один из часто используемых процессов неожиданно превратился из 2-секундной команды в 5-минутную команду.

причина? Мы обновляем разрешения для многих каталогов на основе структуры каталогов «шаблон».

Мы обнаружили, что XCOPY может обновить большинство этих настроек в том же старом двухсекундном окне. Остальные настройки, конечно же, обнуляются.

Я пытаюсь понять, как XCopy может быстрее выполнять то, что классы безопасности .NET должны делать изначально? Очевидно, я что-то упускаю.

Каков наилучший метод для копирования информации ACL каталога без проверки связи (или минимальной проверки) домена / сервера Active Directory?

Вот что у меня есть: </p> <pre><code> ... 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 Ответ

1 голос
/ 22 сентября 2009

Ладно ... У меня есть рабочий прототип после ТОННЫ РАБОТЫ в Интернете. Само собой разумеется, есть много неверной информации о ACL онлайн. Я не совсем уверен, будет ли эта часть информации находкой, или дополнительной ошибочной информацией. Я должен оставить это для вас, пользователь, чтобы решить.

То, что я в итоге получил, это чистый, гладкий и очень, очень быстрый, так как он никогда не трогает сервер домена. Я копирую записи SDDL напрямую. Подождите, вы говорите ... вы не можете сделать это в каталоге, потому что вы получаете страшную ошибку SeSecurityPrivilege!

Нет, если вы ограничиваете копию ТОЛЬКО списками контроля доступа (ACL).

Вот код:

</p> <pre><code> 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. Это был волшебный ключ, чтобы все это работало.

...