Предположим, в NTFS / Active Directory у меня есть два подключенных диска:
H:\
I:\
Пользователи могут редактировать файлы в H: \, но не в I: \. Я хочу, чтобы пользователи могли с помощью сценария перемещать свои файлы на диск I: \, если не произойдет перезапись. После копирования файлов сценарий удаляет разрешения на запись для скопированных файлов в I: \ таким образом, что пользователи больше не могут изменять разрешения обратно, а файлы в I: \ становятся в некотором смысле постоянными.
Как я могу настроить это безопасным способом?
На мой взгляд, проблема заключается в том, что если сценарий выполняется от имени пользователя, им необходимо иметь разрешение на запись на диск I.
Возможно, у вас может быть запланированная задача, работающая с разрешениями на запись на диске I, которая извлекает файлы. Возможно, они могли бы создать файл с названием «readytocopy.txt» или что-то в этом роде. Когда запланированная задача находит этот файл в каталоге пользователя, она копирует файлы (кроме readytocopy.txt).
Какую конкретную проблему вы пытаетесь решить?
После кучи проб и ошибок этот сценарий PowerShell, кажется, делает это:
$worm="C:\WORM"
mkdir -Force $worm
cd $worm
<# https://serverfault.com/a/17869
SYSTEM - Full Control - Apply onto: This folder, subfolders, and files
Administrators - Full Control - Apply onto: This folder, subfolders, and files
Authenticated Users - Read - Apply onto: This folder, subfolders, and files
Authenticated Users - Create Files / Write Data - Apply onto: This folder and subfolders
#>
$acl = Get-Acl $worm
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'Users', `
'CreateDirectories, CreateFiles, ListDirectory, Read', `
'ContainerInherit, ObjectInherit', `
'None', `
'Allow'
$acl.AddAccessRule($ace1)
Set-Acl -AclObject $acl -Path $worm
$acl = Get-Acl $worm
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'Users', `
'DeleteSubdirectoriesAndFiles,Delete', `
'ContainerInherit, ObjectInherit', `
'None', `
'Deny'
$acl.AddAccessRule($ace1)
Set-Acl -AclObject $acl -Path $worm
$acl = Get-Acl $worm
$ace1 = New-Object Security.AccessControl.FileSystemAccessRule 'Users', `
'WriteData', `
'ObjectInherit', `
'InheritOnly', `
'Deny'
$acl.AddAccessRule($ace1)
Set-Acl -AclObject $acl -Path $worm
Однако это не надежно, поскольку администратор может вернуть себе контроль с помощью:
icacls C:\WORM /T /Q /C /RESET
Я скажу, что если вам нужно решение промышленного уровня для соответствия требованиям SEC или что-то еще, вам, возможно, придется инвестировать в NetApp и SnapLock:
https://library.netapp.com/ecmdocs/ECMP1196889/html/GUID-7334EEB5-94E9-4500-BA40-681DEC572420.html
Это возможно с помощью комбинации сценария, запланированной задачи и разрешений NTFS.
Предполагая, что у вас нет подпапок и есть только файлы в одной папке, вот как этого добиться:
Группы
(используйте встроенные, если хотите)
Разрешения NTFS для папки назначения (I :)
Запланированное задание
Сценарий
Наступит время, когда пользователь все еще будет доступен для записи, в зависимости от того, как закодированы сценарии, сколько файлов находится в папке и т. Д., Это займет всего миллисекунды.
Вы должны иметь возможность сделать это с обычными разрешениями NTFS. Я нашла эту статью. Ему около 10 лет, но он довольно ясно показывает этот пример:
https://technet.microsoft.com/en-us/magazine/2006.01.howitworksntfs.aspx
- Предоставьте разрешения на чтение и выполнение и запись только для этой папки (выбранной в списке «Применить к») пользователям, которым вы хотите иметь доступ к папке.
- Предоставьте разрешение на чтение и выполнение для вложенных папок и файлов только одним и тем же пользователям.
- Предоставьте право записи специальному пользователю-владельцу-создателю.
В результате все пользователи смогут добавлять файлы в папку и читать файлы друг друга, но только пользователь, создавший файл, сможет его изменять.