2013-10-01 6 views
0

Мне нужно заменить все файлы в одном каталоге резервными файлами в другом каталоге. ВСЕ свойства файла/разрешения/права собственности должны быть сохранены. File.Copy, как и проводник Windows, копирует файлы, очищает все разрешения и меняет владельца.Как скопировать файл и сохранить право собственности?

Я нашел пример на SO, которые должны сохранять свои первоначальные разрешения, но не делает: Copy a file with its original permissions

Код:

File.Copy(originFile, destinationFile); 
FileInfo originFileInfo = new FileInfo(originFile); 
FileInfo destinationFileInfo = new FileInfo(destinationFile); 
FileSecurity ac1 = originFileInfo.GetAccessControl(AccessControlSections.All); 
ac1.SetAccessRuleProtection(true, true); 
destinationFileInfo.SetAccessControl(ac1); 

я получаю PrivilegeNotHeldException:

The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation. 

Если я отключить UAC Я получаю эту ошибку вместо:

The security identifier is not allowed to be the owner of this object. 

Я получаю это исключение с AccessControlSections.All и AccessControlSections.Owner. Код работает, если я изменяю перечисление на AccessControlSections.Access, но сохраняются только разрешения, а не права собственности. Я местный администратор, и даже когда пункт назначения - это мой локальный компьютер, он не работает. И я запускаю Visual Studio 2010 в качестве администратора.

ответ

0

у меня не было разрешения на вызов GetAccessControl на любой файл, который не был на моей локальной машине (первая ошибка), и я не смог установить владельца любого файла, который я владел (вторая ошибка), Я мог только предоставить права «взять на себя». Запуск инструмента, поскольку администратор домена решил все.

0

Возможно, вам потребуется явно получить «SeSecurityPrivilege». Возможно, самый простой способ сделать это - использовать Process Privileges.

// Untested code, but it might look like this... 
// (Add exception handling as necessary) 
Process process = Process.GetCurrentProcess(); 

using (new PrivilegeEnabler(process, Privilege.Security)) 
{ 
    // Privilege is enabled within the using block. 
    File.Copy(originFile, destinationFile); 
    FileInfo originFileInfo = new FileInfo(originFile); 
    FileInfo destinationFileInfo = new FileInfo(destinationFile); 
    FileSecurity ac1 = originFileInfo.GetAccessControl(AccessControlSections.All); 
    ac1.SetAccessRuleProtection(true, true); 
    destinationFileInfo.SetAccessControl(ac1); 
} 
+0

Спасибо, что привело меня в правильном направлении. – MDave

Смежные вопросы