2016-01-09 4 views
1

Я пытаюсь реализовать модель Bell-La Padula на локальных учетных записях Windows на C#, и в этой модели пользователь с более низким уровнем безопасности может записывать файлы, которые относятся к более высокому уровню безопасности без прочитайте его !! Я Добавлено разрешения на файлы, как этотЗапись в файл без разрешения на чтение

file.txt: чтение [отрицать] - писать [Разрешить]

Сейчас я работаю над позволяет пользователю добавлять текст в file.txt не прочитав его. Я использовал это:

using (FileStream aFile = new FileStream(filename, FileMode.Append, FileAccess.Write)) 
       using (StreamWriter sw = new StreamWriter(aFile)) 
       { 
        sw.WriteLine(DateTime.Now.ToString() + " Modified BY :" + username + Environment.NewLine); 
        sw.WriteLine(textBox1.Text); 
        sw.WriteLine("---------- END User Edition --------------"); 
       } 

Он работал, когда я запускаю программу из учетной записи администратора, но когда я попытался запустить его Guset аккаунт это поднять исключение: вы не можете получить доступ к этому файлу!

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

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

ответ

1

Прошло немного времени, но выяснилось. Пришлось использовать procmon, чтобы понять это. Ваш код в порядке. Однако вам необходимо правильно настроить разрешения.

Для вашего текстового файла вам необходимо предоставить права на ограниченную учетную запись только для записи. Не проверяйте что-либо в столбце deny. Потому что, если вы это сделаете, доступ запрета будет превзойти все остальное. Вам также необходимо предоставить доступ к этой учетной записи для Чтение атрибутов и Прочитать расширенные атрибуты.

Возможно, вы можете выполнить то же самое, используя icacls или cacls. Ниже приведены инструкции по ручной настройке. Это основано на Windows 10 (Win7 должен быть похож):

  1. правой кнопкой мыши на файле

  2. нажмите на свойства.

  3. Перейдите на вкладку «Безопасность».

  4. Нажмите на кнопку "Редактировать" кнопку

  5. Нажмите на "Добавить ..." кнопку

  6. Найти ограниченную учетную запись пользователя.

  7. На вкладке «Разрешения» выберите учетную запись.

  8. снимите отметку со всего, кроме флажка «Написать». enter image description here

  9. Нажмите «ОК», чтобы закрыть это диалоговое окно.

  10. Нажмите кнопку «Дополнительно».

  11. Выберите учетную запись и нажмите кнопку «Изменить».

  12. В следующем диалоговом окне нажмите кнопку «Показать дополнительные разрешения» enter image description here

  13. Убедитесь, что следующие флажки проверяются.

    • Чтение атрибутов
    • Чтение расширенных атрибутов
    • Создание файлов/запись данных
    • Создание папок/добавление данных
    • Запись атрибутов
    • записи расширенных атрибутов

      enter image description here

  14. Нажмите OK во всех диалоговых окнах.

+0

Ваше решение сработало для меня. В моем случае я хотел сделать это на сетевом ресурсе, поэтому мне пришлось дать Full Control всем, чтобы он работал. – expirat001

0

Чтобы сделать это программно, вам нужно разрешить эти:

System.Security.AccessControl.FileSystemRights.AppendData 
System.Security.AccessControl.FileSystemRights.CreateFiles 
System.Security.AccessControl.FileSystemRights.ReadAttributes 
System.Security.AccessControl.FileSystemRights.ReadExtendedAttributes 
System.Security.AccessControl.FileSystemRights.WriteAttributes 
System.Security.AccessControl.FileSystemRights.WriteExtendedAttributes 

Extra info here

Read/Write(Extended)Attributes необходимы для операций записи, выше позволит пользователям создавать лог-файлы и добавлять к ним текст не имея возможности читать что-либо, если вы добавите разрешение Delete, это сделает возможным скользящий просмотр файлов журнала (я бы сказал, что большинство людей будут нуждаться в нем как имеющие неограниченное количество журналов без катания, gerous)

Это можно сделать с помощью любого языка .NET, например PowerShell (создавать и записывать файлы журналов и раскатывают их разрешения):

$acl = Get-Acl "C:\logs" 

$acl.SetAccessRuleProtection($true, $false) # Remove inherited 
$acl.Access | % { $acl.RemoveAccessRule($_) } | Out-Null # Remove existing 
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow"))) 
$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators", "FullControl", "ContainerInherit, ObjectInherit", "None", "Allow"))) 

$logsRights = [System.Security.AccessControl.FileSystemRights]::AppendData -bor ` 
       [System.Security.AccessControl.FileSystemRights]::CreateFiles -bor ` 
       [System.Security.AccessControl.FileSystemRights]::Delete -bor ` 
       [System.Security.AccessControl.FileSystemRights]::ReadAttributes -bor ` 
       [System.Security.AccessControl.FileSystemRights]::ReadExtendedAttributes -bor ` 
       [System.Security.AccessControl.FileSystemRights]::WriteAttributes -bor ` 
       [System.Security.AccessControl.FileSystemRights]::WriteExtendedAttributes 

$acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("Users", $logsRights, "ContainerInherit, ObjectInherit", "None", "Allow"))) 
Set-Acl "C:\logs" $acl 
Write-Host "logs ACL" 
$acl.Access 

В зависимости от вашего использования случае вы можете или не может понадобиться, чтобы очистить существующие правила и добавить SYSTEM/Administrators, но вы получите идею