使用 ICACLS 在 Windows 中将文件设置为“只读”

使用 ICACLS 在 Windows 中将文件设置为“只读”

我知道如何使用以下命令将文件设置为只读cacls

  cacls "toto.txt" //E //P Everyone:N
  cacls "toto.txt" //E //G Everyone:R

它删除了所有人的所有权利,然后仅添加了“读取”权利。

如何用 做同样的事情icacls

具体来说,我尝试过:

  • icacls toto.txt /grant "everyone":R但文件仍然可写
  • icacls toto.txt /deny "everyone":W但文件已经无法读取

答案1

问题在于访问权限是从父文件夹继承的。

以下两行代码可以达到这个效果:

icacls toto.txt /inheritance:r
icacls toto.txt /grant "everyone":R

第一个附加行将删除所有继承。

或者更好的是,你可以将它们合并成一行:

icacls toto.txt /inheritance:r /grant:r Everyone:R

答案2

直到今天,这仍然是 icacls 中的一个错误。将文件夹设为只读也是如此。拒绝“W”也会拒绝“同步”权限。

你可以用cacls来查看:

Everyone:(DENY)(special access:)
                                    SYNCHRONIZE
                                    FILE_WRITE_DATA
                                    FILE_APPEND_DATA
                                    FILE_WRITE_EA
                                    FILE_WRITE_ATTRIBUTES

为了获得想要的结果,您必须明确指定其他 4 项权利:

icacls toto.txt /deny "everyone":(WD,AD,WEA,WA)

然后 cacls 会告诉您 SYNCHRONIZE 不再被拒绝,并且文件仍然可读。

Everyone:(DENY)(special access:)
                                    FILE_WRITE_DATA
                                    FILE_APPEND_DATA
                                    FILE_WRITE_EA
                                    FILE_WRITE_ATTRIBUTES

Icacls 将提供相同的输出使用任一命令后,无论是否同步:

Everyone:(DENY)(W)

另请参阅此博客: 我使用 GUI 和 icacls 设置了相同的 ACL,但结果却不同

笔记如果你想知道“同步”是做什么的,这里有一个描述:

同步

同步权限允许或拒绝不同的线程等待文件或文件夹的句柄并与可能向其发出信号的另一个线程同步。此权限仅适用于多线程、多进程程序。

此外, 。Net 不允许您同时拒绝写入和同步。 (Powershell)。Icacls 做了一些 .Net 中不允许的事情。FileSystemAccessRights 被简化为仅“写入”。

New-Object System.Security.AccessControl.FileSystemAccessRule(
  'Users','Write, Synchronize','Deny')

FileSystemRights  : Write
AccessControlType : Deny
IdentityReference : Users
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

相关内容