2010-01-27 2 views
4

Я тестировал 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; 
} 
+0

Это не среда .NET, которая предотвращает несанкционированный доступ, но в файловой системе. – dtb

+0

Вы просто перечисляете правила (вход контроля доступа/ACE) в ACL файла/папки (список управления доступом), но вы пренебрегаете тем, какой _user_ предоставлен, который _right_. Например, вы показываете «разрешить, разрешить» и т. Д., Но вы не показываете, _who_ разрешено. Каждый ACE в ACL описывает принципала (пользователя или группу) и их прав (r/w/x и т. Д.). Вы все еще не показали, что пользователь, который запускает программу (вы?), Имеет ACE с полным контролем на ресурсе, к которому вы пытаетесь получить доступ. – x0n

+0

, который является окончательным решением с образцом исходного кода? – Kiquenet

ответ

5

КАС IOPermisson чтения/записи только предоставляет Вам возможность для чтения или записи. Он не обращает внимания на уровне файловой системы разрешений (ACL.) Проверьте ACL на папку немного ближе :)

-Oisin

+0

также может быть, что ou не может ПРОЧТИТЬ DLL, потому что он открыт только процессом. – x0n

+0

Я думаю, что это приведет к «IOException», а не к «UnauthorizedAccessException». (+1 для ответа, хотя) –

+0

Итак, вы говорите, что .NET не имеет каких-либо ограничений пользователя из CLR, которые ограничивают доступ, поэтому мне разрешено. НО ... тогда я должен допросить файловую систему напрямую, а затем посмотреть, блокирует ли это это? –

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

  • Нет связанных вопросов^_^