在 NTFS/Active Directory 中,假设我有两个驱动器映射:
H:\
I:\
用户可以编辑 H:\ 中的文件,但不能编辑 I:\ 中的文件。我希望用户能够使用脚本将他们的文件移动到 I:\ 驱动器,除非发生覆盖。复制文件后,脚本将删除对 I:\ 中复制文件的写入权限,这样用户就无法再更改权限,并且 I:\ 上的文件在某种意义上将成为永久文件。
我该如何以安全的方式进行设置?
答案1
经过多次反复尝试后,这个 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
答案2
据我所知,存在一个问题,如果脚本以用户身份运行,他们需要有写入 I 驱动器的权限。
也许您可以运行一个计划任务,在 I 驱动器上以写入权限运行,以提取文件。也许他们可以创建一个名为“readytocopy.txt”或类似的文件。当计划任务在用户目录中找到该文件时,它会复制文件(readytocopy.txt 除外)。
您要解决什么具体问题?
答案3
这可以通过脚本、计划任务和 NTFS 权限的组合来实现。
假设您没有子文件夹,只有单个文件夹中的文件,那么实现方法如下:
群组
- 设置用户组
- 设置管理员组
(如果愿意,可以使用内置的)
目标文件夹的 NTFS 权限 (I:)
- 读取、列出文件夹内容、执行、写入 - 仅限此文件夹,针对用户组
- 完全控制 - 此文件夹、子文件夹、文件属于管理员组
计划任务
- 删除每个具有写权限的文件的所有写权限的脚本
- 可以是使用 icacls.exe、Powershell、vbscript 等任何脚本的批处理脚本
- 将任务设置为手动启动
- 需要以对文件夹和文件具有完全控制权的用户身份运行(管理员组)
- 授予用户组适当的权限来启动计划任务(可以是本地计算机上的任务,也可以是远程计算机上的任务)
脚本
- 几乎可以是任何语言(PS 可能是首选)
- 仅当文件不存在时才复制
- 复制后,使用 Powershell 调用 Start-ScheduledTask,或者如果使用其他脚本语言,则使用 schtasks.exe 启动计划任务。可在本地或远程计算机上运行。
有一段时间文件仍然可以由用户写入,具体取决于脚本的编码方式、文件夹中有多少个文件等等,该时间最短为几毫秒。
答案4
您应该能够使用普通的 NTFS 权限执行此操作。我找到了这篇文章。它大约有 10 年的历史了,但它非常清楚地显示了这个例子:
https://technet.microsoft.com/en-us/magazine/2006.01.howitworksntfs.aspx
- 将“仅此文件夹”(在“应用到”列表中选择)的“读取和执行”以及“写入”权限授予您希望有权访问该文件夹的用户。
- 仅向同一用户授予子文件夹和文件的读取和执行权限。
- 向特殊用户 Creator Owner 授予写入权限。
这样做的效果是,所有用户都能够向文件夹添加文件并读取彼此的文件,但只有创建文件的用户才能修改它。