Я тестировал FileIOPermission
в Windows 7 в .NET 3.5. Я был пользователем Windows XP и получил это разрешение, так как я был администраторомНе удается скопировать файл, хотя FileIOPermission предоставлен в C#
Я написал следующий код, проверяя, могу ли я писать в C: \ Program Files \ Outlook ...
static void Main(string[] args)
{
Console.WriteLine("Am I an administrator? " + new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
// Try and open a file in C:\Program Files\Microsoft Office\Office14\BCSLaunch.dll
string path = @"C:\Program Files\Microsoft Office\Office14\BCSLaunch.dll";
try
{
FileIOPermission ioPerm = new FileIOPermission(FileIOPermissionAccess.Read, path);
ioPerm.Demand();
string backupPath = Path.ChangeExtension(path, ".bak");
FileIOPermission writeAccess = new FileIOPermission(FileIOPermissionAccess.AllAccess, backupPath);
writeAccess.Demand();
Console.WriteLine("Read access is permitted: {0} => {1}",path,SecurityManager.IsGranted(ioPerm));
Console.WriteLine("Write backup file is permitted: {0} => {1}", backupPath, SecurityManager.IsGranted(writeAccess));
File.Copy(path, backupPath);
Console.WriteLine("File copied! {0}",backupPath);
Console.WriteLine("Deleting file.....");
File.Delete(path);
}
catch (UnauthorizedAccessException uae)
{
Console.WriteLine(uae.ToString());
}
Console.ReadLine();
}
Так что программа вызывает UnauthorizedAccessException
(который я ожидал), но то, что я не понимаю, что Demand()
позволяет разрешение, SecurityManager
подтверждает, что разрешение дано, но при выполнении File.Copy()
я получаю исключение ,
Хотя я рад видеть, что .NET останавливает меня, почему он не уведомил меня ранее, когда я позвонил Demand()
?
я получаю следующий результат:
Am I an administrator? False Read access is permitted: C:\Program Files\Microsoft Office\Office14\BCSLaunch.dll => True Write backup file is permitted: C:\Program Files\Microsoft Office\Office14\BCSLaunch.bak => True System.UnauthorizedAccessException: Access to the path 'C:\Program Files\Microsoft Office\Office14\BCSLaunch.bak' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite) at System.IO.File.Copy(String sourceFileName, String destFileName) at TryAndGetUACPrompt.Program.Main(String[] args) in C:\Users\..............
Пожалуйста, может кто-то помочь мне понять, почему я получаю противоречивую информацию?
-
Обновление - 19:30 GMT
Я просмотрел списки ACL исходного файла, используя следующий код:
Console.WriteLine("ACL Permissions for Source....");
FileSecurity fileSecurityForOriginalPath = new FileSecurity(path, AccessControlSections.Access);
foreach (FileSystemAccessRule rule in fileSecurityForOriginalPath.GetAccessRules(true,true,typeof(NTAccount)))
{
Console.WriteLine("{0} => {1}", rule.FileSystemRights, rule.AccessControlType);
}
Выход следующим образом:
ACL Permissions for Source.... FullControl => Allow FullControl => Allow ReadAndExecute, Synchronize => Allow
Поэтому у меня есть доступ к нему. Тем не менее, я попытался использовать этот код для просмотра разрешений пути резервного копирования и , очевидно,, я получаю исключение, так как файл моей резервной копии (назначения) физически не существует, поэтому я не могу проверить разрешения на него.
Я попробую еще одно предложение переместить этот чек в другой метод.
Update - 19:45 GMT
Я переработан чтения/записи требования в другой метод:
private static FileIOPermission CheckWriteAccess(string backupPath)
{
FileIOPermission writeAccess = new FileIOPermission(FileIOPermissionAccess.AllAccess, backupPath);
writeAccess.Demand();
return writeAccess;
}
private static FileIOPermission CheckReadAccess(string path)
{
FileIOPermission ioPerm = new FileIOPermission(FileIOPermissionAccess.Read, path);
ioPerm.Demand();
return ioPerm;
}
Они оба возвращают штраф без исключения.
Поэтому, если .NET Security дополняет DACL, мне интересно, почему он считает, что это будет успешным, если на самом деле это не так.
-
Обновление 19:57 GMT
Хорошо, я проверил права доступа к директории, а не (файл назначения) BackupFile и получил это в качестве выходного сигнала (с использованием Еогеасп на AuthorizationRuleCollection с. GetAccessRules())
Checking write access in this directory.... FullControl => Allow 268435456 => Allow FullControl => Allow 268435456 => Allow FullControl => Allow 268435456 => Allow ReadAndExecute, Synchronize => Allow -1610612736 => Allow 268435456 => Allow
Я использовал Enum.Format(typeof(FileSystemAccessRights),rule,"G")
получить форматирование, эффективно делать ToString(), но я просто не был уверен, что эти цифры были правильными.
Код для вывода выше:
private static DirectorySecurity CheckWriteAccess(string backupPath)
{
DirectorySecurity writeAccess = new DirectorySecurity(Path.GetDirectoryName(backupPath),AccessControlSections.Access);
Console.WriteLine("Checking write access in this directory....");
foreach (FileSystemAccessRule rule in writeAccess.GetAccessRules(true, true, typeof(NTAccount)))
{
Console.WriteLine("{0} => {1}", Enum.Format(typeof(FileSystemRights),rule.FileSystemRights,"G"), rule.AccessControlType);
}
return writeAccess;
}
Это не среда .NET, которая предотвращает несанкционированный доступ, но в файловой системе. – dtb
Вы просто перечисляете правила (вход контроля доступа/ACE) в ACL файла/папки (список управления доступом), но вы пренебрегаете тем, какой _user_ предоставлен, который _right_. Например, вы показываете «разрешить, разрешить» и т. Д., Но вы не показываете, _who_ разрешено. Каждый ACE в ACL описывает принципала (пользователя или группу) и их прав (r/w/x и т. Д.). Вы все еще не показали, что пользователь, который запускает программу (вы?), Имеет ACE с полным контролем на ресурсе, к которому вы пытаетесь получить доступ. – x0n
, который является окончательным решением с образцом исходного кода? – Kiquenet