Icacls 是一个Windows命令行实用程序,IT管理员可以使用它来更改文件和文件夹上的访问控制列表。IT专业人员或系统管理员经常执行的最常见任务之一是修改文件服务器上的权限。使用 icacls 命令是一个非常高效的方法来实现这一点,我们将在本指南中解释如何使用这个命令。
如何使用 icacls 命令
根据我个人经验,在 Windows 上修改文件权限通常是使用文件资源管理器完成的。对于许多 IT 人员来说,打开文件资源管理器,浏览到导致某些用户访问问题的网络位置,并将其权限从“读取”更改为“读取/修改”或类似的操作,是非常直观的。简单快速,相当容易使用。
然而,有许多情况包括不同范围的情景,图形用户界面的功能并不像我们希望的那样强大。如果我们要更改 2200 万个文件和文件夹的权限,我们希望做到正确!
什么是访问控制列表(ACL)?
在Windows和NTFS文件系统中,每个文件对象(文件夹)都有一个访问控制列表。该列表由访问控制条目(ACE)组成。该列表包含了所有对该文件对象具有某种权限级别的用户和/或其他安全容器对象(组等)。
什么是访问控制条目?请稍等…
什么是访问控制条目(ACE)?
访问控制条目(ACE)是一个单独的记录或权限规则,用于控制用户/组在文件对象上的个别权限级别。让我列出ACL可用的高级基本权限:
- 完全访问(F)
- 修改访问(M)(包括“删除”)
- 读取和执行访问(RX)
- 只读访问(R)
- 只写访问(W)
还有大约十几个以上的“高级”权限,但这些不在本文的范围内。
文件资源管理器限制
现在,如果我是微软的文件资源管理器(File Explorer)项目经理(这并不是我特别羡慕的工作),这些是我会添加的功能。相信我,我已经希望他们添加这些功能几十年了!
假设你正在处理从服务器A迁移到服务器B的文件服务器迁移。你已经将数据复制到目的地(服务器B)。你已经发现并非所有权限递归看起来都正确。
所以,你进入树的根目录,进入安全 选项卡,并对访问控制列表进行了一些更改。你勾选了递归修改根目录下的所有2200万个文件和文件夹的复选框。它开始进行更改,然后向你弹出一些关于对系统文件、只读文件等进行更改的确认弹窗。
现在,这是我的请求-在他们可能创建的迷你“向导”中,我想要指定简单地假设并点击所有确认请求上的“是”。然后,该过程将继续处理任何错误,并在完成时向我提供摘要,附带一个链接,可以下载文件的原始输出,这样我就可以回去检查可能会弹出的任何错误或警告。
不,我不知道微软是否会提供如此美妙、强大、设定并忘记此类功能集。所以,在此期间,我们求助于命令行和脚本的力量。这就是内置的icacls命令派上用场的地方。
理解icacls语法
icacls 的语法实际上非常简单且相对容易学习。基本上,您使用命令,然后添加要检查或操作的文件或文件夹,接着是您想要添加/更改/删除的权限。
当然,还有命令行开关。我们很快将覆盖所有这些内容。以下是当您只运行以下命令然后接文件名时会发生的情况的示例。
icacls Excellent.txt

它将每行输出一个ACE,因此使用上面的示例:
- 内建的 ‘SYSTEM’ 帐户具有继承(I)和完全(F)访问权限
- 内建的管理员组具有相同的权限
- 内建的用户组具有继承(I)、读取(R)和执行(X)权限。
您可以在 PowerShell 中使用 icacls 吗?
嗯,正如您可以从我上面的示例和屏幕截图看到的,您确实可以使用 PowerShell 来运行 icacls 命令。您只需要注意一些需要稍微不同方式引用的环境变量即可。
查看和管理文件对象上的ACL 的等效PowerShell cmdlet 是 Get-Acl 和 Set-Acl。这听起来像是一个未来的帖子构思!?
使用 icacls 设置文件或文件夹的权限
因为在Windows上内置了icacls命令,所以一旦您理解了基础知识,就可以自由地开始使用该命令。您也可以在命令行上仅输入‘icacls’即可查看可用的帮助信息。 您还可以浏览类似的微软文档以了解有关icacls命令的信息在此页面上。
如何显示对象的当前ACL
好了,我想这里的阐述就够了… 让我们开始使用该命令。 要显示文件或目录的当前ACL,只需使用以下命令:
icacls file or directory
icacls Download

在这里,“Download”是一个带有文件和子文件夹的文件夹。 正如您会注意到的,针对目录对象,输出略有不同。 您将看到(OI)和(CI),因为这些是仅适用于目录的特殊容器继承级权限。
对于内置的Administrators组,您可以看到它拥有完全权限和继承权限。“(OI)”显示此目录中的其他对象将继承此ACE。“(CI)”显示此目录中的其他文件夹将再次继承此ACE。(此目录恰好没有,但如果有的话,它将自动继承相同的ACE)
向文件或文件夹授予权限
事情开始变得热闹起来了。让我们使用/grant开关在我们的Active Directory域中设置权限并向其他用户添加一些权限。通过以下命令,我们将为Billy Reinders(breinders)将只读(R)权限授予Excellent.txt文件。
icacls Excellent.txt /grant reinders\breinders:R /t /c

前面的命令已经成功完成;然后我通过检查权限来验证我的更改 – 现在我们看到’REINDERS\breinders’具有只读(R)权限。而且,因为我们没有看到’I’列出,我们知道它没有继承,是显式设定的。
只是为了提醒您,’/t’开关用于递归设置整个文件夹树上的权限。’/c’开关告诉命令在遇到任何错误时继续执行。
移除文件或文件夹的权限
与使用/grant开关给予权限/添加权限不同,我们使用/remove开关从ACE中移除权限。让我们继续移除Billy对Excellent.txt文件的权限。
icacls Excellent.txt /remove:g reinders\breinders /t /c

在这里,我们使用’/remove:g’开关来移除先前授予Billy Reinders的权限。我再次运行了命令进行验证,您会看到Billy的ACL已经消失。太好了!?
拒绝文件或文件夹的权限
通常,您应该避免使用“显式”’deny’权限,因为这会使您的整体权限基础结构变得复杂。在大多数情况下,您可以依赖于默认的“隐式”拒绝来处理这些情况。
如果用户未列在ACL中,并且用户不是ACL中列出的任何组的成员,则Windows会假定该用户在该对象上没有权限(正确)。然而,以下示例说明了这种情况会变得混乱 – 如果用户是两个组的成员,并且一个组被授予访问权限,另一个组被拒绝,则该用户将被拒绝。这本身是有道理的,但在尝试解决这种情况时可能会变得非常复杂。
然而,如果您想显式添加拒绝权限,您可以使用一般的’/deny’开关来实现这一点。
icacls Download /deny reinders\breinders:(OI)(CI)F /t /c

在这里您可以看到我运行的命令;它已成功完成。然后,我检查了“下载”文件夹的安全选项卡 – 您可以看到Billy对该对象及其所有内容具有拒绝权限。
如何重置对象的ACL
I can’t tell you how many file server migrations or movements of large amounts of file projects I’ve been involved in where I just needed to start from scratch. This invaluable step includes resetting the ACLs on an object in case things get too far gone, or you succumb to a bad idea after being up all night. Maybe a malware attack crippled an entire HR directory that NEEDS to get resolved ASAP. Thankfully, you can use the ‘/reset’ flag to reset the permissions to the default.
icacls Download /reset /t /c
[image]
在我重新授予Billy对“下载”文件夹及其内容的“RW”权限后,我运行了重置命令。正如您所看到的,他的名字再次不在安全选项卡的ACL中。简单而有效。
如何保存和恢复ACLs
A wonderfully powerful feature included with icacls is the ability to backup and restore the ACL of an object to a file for safekeeping. Before you start a large script that changes or resets permissions on millions of files, you can first save the current state of those millions of files’ ACLs to a single file.
如果您在脚本的中途发现有语法错误,可以中止它,然后使用带有’/restore’参数的一次命令运行来恢复整个树的ACL状态!让我们试一试!
icacls Download /save Download_ACL_Backup /t

这将把Download文件夹的整个ACL树保存到一个名为 ‘Download_ACL_Backup’ 的单个文件中。现在,我强烈建议您不要去操作那个文本文件。是的,它看起来像是一些像Linux之类的疯狂的东西。开玩笑的。
以下是Download文件夹的当前状态。

现在,假设一位初级管理员授予Billy Reinders对该位置的完全访问权限。我们还假设其中包含Billy不应该访问的人力资源数据。
icacls Download /grant reinders\breinders:F /t /c

在运行命令后,我再次检查,看到Billy在此文件夹中具有完全的显式控制。通过一次运行此命令,权限将被假定将一举恢复为默认状态。
icacls Download /reset /t /c

运行重置命令后,您将看到他的名字再次从ACL中被移除。他不再完全访问文件夹。提醒 – 这将扫描整个文件夹层次结构。
提示:在这种情况下,您可能已经意识到Billy确实具有只读访问权,因为内置的用户组(其中包括Billy)具有默认的读取和执行权限。这只是一个侧面说明。
如何使用icacls管理Windows完整性级别
Windows中有一个不太为人知的功能,叫做强制访问控制(MAC)。这个功能在系统中已经存在了相当长的时间。然而,微软在Windows Vista/Windows Server 2008中推出了强制完整性控制(MIC)。
权限是由基于策略的固定规则定义的,并通常不能被用户覆盖。通常被称为Windows完整性控制(WIC)。完整性级别用于确定Windows中对象的保护级别。实质上,您始终要确保您的用户拥有正确的权限。
I won’t go into great detail here, but I can show you a few examples of how to use the icacls command with it. If we create a new folder, Test, in the Download directory, we can adjust its integrity level to ‘h’igh.
icacls Test /setintegritylevel h
长话短说,高级别等同于以管理员身份运行任务或进程所需的权限(管理员权限)。因此,即使Billy Reinders对这个文件夹拥有完全控制权限,除非他以某种方式被授予了魔术管理员权限,并且能够以管理员身份运行文件资源管理器(他不能…),否则他将无法访问这个文件夹及其内容。
所以,实质上这是另一层您可以使用来保护高度敏感数据的安全和保护措施。
如何使用icacls管理权限继承
我们还可以使用icacls命令查看和修改文件和文件夹上的继承权限。这使我们能够在一个文件夹上设置显式权限,同时保持其余文件夹设置为自动接受父容器的ACL。
禁用文件和文件夹上的继承
我们可以使用”/inheritance:d”参数在文件或文件夹上禁用继承。在我的例子中,我们在下载文件夹中有一个安装文件夹。您可以在这里看到该文件夹被设置为从上方继承所有权限。
icacls Download

让我们移除安装文件夹上的继承。
icacls Install /inheritance:d /t /c

现在你看,所有的”(I)”条目都不见了。这些现在都是显式权限。您可以从GUI下面的验证中看到,“启用继承”按钮是可用的,因为我们已经禁用了它。
结论
对我来说,icacls最吸引人的一点是能够编写复杂项目的脚本。而且,不用担心文件资源管理器遇到错误、崩溃之类的可靠性问题。
I hope you learned more about using the command line to modify permissions. Please leave a comment or question below. Thank you!
相关文章: