Не удается скопировать файл с соответствующими разрешениями, используя FileIOPermission - PullRequest
2 голосов
/ 02 октября 2008

Этот фрагмент хорошо работает, если я пытаюсь записать в каталог пользователя, но как только я пытаюсь записать в 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;
}

Ответы [ 4 ]

1 голос
/ 02 октября 2008

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

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

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

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

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

1 голос
/ 02 октября 2008

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

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

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

1 голос
/ 02 октября 2008

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

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

0 голосов
/ 02 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...