Недавно мы были вынуждены перейти на новый сервер домена на полпути по всему миру. Это может показаться небольшим изменением, но один из часто используемых процессов неожиданно превратился из 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);
}