Не удается скопировать файл с соответствующими разрешениями с помощью FileIOPermission

StackOverflow https://stackoverflow.com/questions/159598

  •  03-07-2019
  •  | 
  •  

Вопрос

Этот фрагмент работает хорошо, если я пытаюсь выполнить запись в каталоге пользователя, но как только я пытаюсь выполнить запись в Program Files, он просто выполняется беззвучно, и файл не был скопирован (без исключения).Если я попытаюсь скопировать файл в C: \ или в C:\Windows, я поймаю исключение UnauthorizedAccessException.

Знаете ли вы другой способ получить разрешения на запись в этот каталог или заставить его работать по-другому?

Любая помощь очень ценится!Спасибо

using(FileStream fs=File.Open(source, FileMode.Open)){ }  
try  
{  
    FileIOPermission fp = new FileIOPermission(FileIOPermissionAccess.Write,   
                          AccessControlActions.Change, "C:\\Program Files\\MyPath");  
    fp.Demand();  //<-- no exception but file is not copied
    File.Copy("C:\\Users\\teebot\\Documents\\File.xml","C:\\Program Files\\MyPath\\File.xml",true);  
}  
catch(SecurityExceptions)  
{  
    throw(s);  
} 
catch(UnauthorizedAccessException unauthroizedException)
{
    throw unauthroizedException;
}
Это было полезно?

Решение

Если вы работаете под управлением Vista, то система просто перенаправляет записи в папку program files, это делается для того, чтобы старые программы, сохраняющие свою конфигурацию в каталоге Program, продолжали работать, когда пользователь не является администратором (или включен UAC).

Все, что вам нужно сделать, это добавить в вашу программу манифест, в котором указывается требуемый уровень доступа, затем система предположит, что ваша программа поддерживает Vista, и отключит все эти исправления совместимости.

Вы можете увидеть пример файла манифеста в моем блоге по адресу:

http://www.nbdtech.com/blog/archive/2008/06/16/The-Application-Manifest-Needed-for-XP-and-Vista-Style-File.aspx

(основное внимание в этом сообщении уделяется получению правильной версии общих элементов управления, но объявления безопасности Vista также присутствуют)

Другие советы

Не записывайте в папку Program Files.

Это большой запрет, и он особенно вызовет проблемы, когда наступит день, когда ваш код будет запущен в Vista или на компьютере в компании, где пользователи получают только стандартную защиту, а не права администратора.Вместо этого используйте папку данных приложения.

Вы работаете под управлением Vista?Если это так, то, возможно, вы столкнулись с виртуализацией файловой системы.Это функция 32-разрядных версий Vista, которая позволяет обычному пользователю выполнять запись в защищенные части файловой системы.Это прокладка, введенная для уменьшения проблем с функциями LUA Vista.

Короткая версия заключается в том, что операционная система создаст виртуальную файловую систему для определенных защищенных корневых файлов (таких как программные файлы).Когда пользователь, не являющийся администратором, попытается выполнить запись в него, вместо оригинала будет создана отредактированная копия.Когда ваша учетная запись пользователя попытается просмотреть файл, она увидит правку. Другие учетные записи пользователей увидят только оригинал.

Более Длинная версия: http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx

Code access security предоставляет или отклоняет разрешения для вашего код.Его нельзя использовать для переопределения разрешений, которые предоставлены / отклонены текущему пользователю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top