管理文件和文件夹权限是一个复杂而耗时的过程。当使用图形界面(GUI)时尤其如此。PowerShell使这一过程更加简单快捷。

1.显示NTFS文件和目录的权限(List NTFS file and folder permissions

NTFS有大量的权限,可以对文件和文件夹进行各种组合设置。要轻松查看所有可用权限,您可以输出 System.Security.AccessControl.FileSystemRights

[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])

如何用PowerShell管理文件和目录权限_访问权限

其中包括基础权限和高级权限(basic permissions and advanced permissions

如何用PowerShell管理文件和目录权限_访问权限_02

如何用PowerShell管理文件和目录权限_powershell_03

1)基础权限(Basic Permissions):
  • 完全控制(Full Control): 用户可以修改、添加、移动和删除文件和目录及其关联属性。此外,用户可以更改所有文件和子目录的权限设置。(Users can modify, add, move and delete files and directories, as well as their associated properties. In addition, users can change permissions settings for all files and subdirectories.)
  • 修改(Modify):用户可以查看和修改文件和文件属性,包括将文件删除和添加到目录,或将文件属性添加到文件。 
  • 读取和执行(Read & Execute): 用户可以运行可执行文件,包括脚本。
  • 读取(Read): Users can view files, file properties and directories.
  • 写入(Write):用户可以写入文件并将文件添加到目录Users can write to a file and add files to directories.
2)高级权限(Advanced Permissions)
  • Traverse Folder/Execute File: 遍历文件夹/执行文件:允许浏览文件夹,即使用户对这些文件或文件夹没有明确的权限。此外,用户还可以运行可执行文件。
  • List Folder/Read Data:列出文件夹/读取数据:可以查看文件夹中文件和子文件夹的列表,也可以查看其中包含的文件的内容。
  • 读取属性Read Attributes: 查看文件或文件夹的属性。
  • 写入属性Write Attributes: 更改文件或文件夹的属性.
  • 读取扩展属性Read Extended Attributes: 查看文件或文件夹的扩展属性。
  • 写入扩展属性Write Extended Attributes: 更改文件或文件夹的扩展属性。
  • 创建文件/写入数据Create Files/Write Data: 允许在文件夹中创建文件,写入数据,允许更改文件夹中的文件。
  • 创建文件夹/附加数据Create Folders/Append Data: 在现有文件夹中创建文件夹,并允许向文件中添加数据,但不能更改、删除或覆盖文件中的现有数据。
  • 删除Delete: 能够删除文件或文件夹。
  • 读取权限Read Permissions: 用户可以读取文件或文件夹的权限。
  • 更改权限Change Permissions: 用户可以更改文件或文件夹的权限。
  • 取得所有权Take Ownership: 用户可以取得文件或文件夹的所有权。
  • 同步Synchronize:  使用文件或文件夹进行同步。这使线程能够等待,直到对象处于发出信号的状态。

2.使用Get-Acl获取文件和文件夹的访问权限:

get-acl -Path C:\fileshare |fl

如何用PowerShell管理文件和目录权限_icacls_04

(Get-ACL -Path "C:\fileshare").Access | Format-Table IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -AutoSize

如何用PowerShell管理文件和目录权限_icacls_05

3.使用Get-Acl和Set-Acl修改文件和文件夹权限:

$ACL = Get-ACL -Path "Test1.txt"

$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("TestUser1","Read","Allow")

$ACL.SetAccessRule($AccessRule)

$ACL | Set-Acl -Path "Test1.txt"

(Get-ACL -Path "Test1.txt").Access | Format-Table IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -AutoSize

使用Get-Acl和Set-Acl将权限复制到新对象:

Get-ACL -Path "Test1.txt" | Set-ACL -Path "Test2.txt"

(Get-ACL -Path "Test2.txt").Access | Format-Table IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -AutoSize

使用管道运算符传递权限:

Get-Acl -Path "C:\Dog.txt" | Set-Acl -Path "C:\Cat.txt"

将 File0.txt 文件中的安全描述符应用于目录及其所有子目录中的所有文本文件 C:\Temp

$NewAcl = Get-Acl File0.txt

Get-ChildItem -Path "C:\temp" -Recurse -Include "*.txt" -Force | Set-Acl -AclObject $NewAcl


禁用继承并保留继承的访问规则

$NewAcl = Get-Acl -Path "C:\Pets\Dog.txt"

$isProtected = $true

$preserveInheritance = $true

$NewAcl.SetAccessRuleProtection($isProtected, $preserveInheritance)

Set-Acl -Path "C:\Pets\Dog.txt" -AclObject $NewAcl

要修改对象的继承属性,我们必须将SetAccessRuleProtection方法与构造函数一起使用:isProtected,preserveHeritage。第一个是Protected属性,定义文件夹是否继承其访问权限。将此值设置为$true将禁用继承。如果要删除继承,第二个属性preserveHeritage允许我们将现有继承的权限复制到对象上。这可能非常重要,这样我们就不会失去对对象的访问权限,但可能不是所需的。

$ACL = Get-Acl -Path "Folder1"

$ACL.SetAccessRuleProtection($true,$false)

$ACL | Set-Acl -Path "Folder1"


授予管理员对文件的完全控制权

$NewAcl = Get-Acl -Path "C:\Pets\Dog.txt"

# Set properties

$identity = "BUILTIN\Administrators"

$fileSystemRights = "FullControl"

$type = "Allow"

# Create new rule

$fileSystemAccessRuleArgumentList = $identity, $fileSystemRights, $type

$fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList

# Apply new rule

$NewAcl.SetAccessRule($fileSystemAccessRule)

Set-Acl -Path "C:\Pets\Dog.txt" -AclObject $NewAcl

使用Get-Acl和Set-Acl更改所有权:

$ACL = Get-Acl -Path "Folder1"

$User = New-Object System.Security.Principal.Ntaccount("TestUser1")

$ACL.SetOwner($User)

$ACL | Set-Acl -Path "Folder1"

Get-ACL -Path "Folder1"

4.icacls:显示、设置、授予、删除和拒绝权限

在计算机安全中,ACL代表“访问控制列表”。ACL本质上是与对象或资源相关联的权限规则列表。ACL中的每个权限规则都被称为访问控制条目(ACE),它控制指定的受托人(如个人、组或会话)对对象的访问。这些类型的访问控制列表被称为自由访问控制列表(DACL)。在DACL中,权限通常由对象的管理员或所有者设置。icacls就是用来显示或修改指定文件上的随机访问控制列表 (DACL),并将存储的 DACL 应用于指定目录中的文件。

  1. Basic permissions
  • 完全访问Full access (F)
  • 修改访问权限Modify access (M)
  • 读取和执行访问权限Read and execute access (RX)
  • 只读访问Read-only access (R)
  • 只写访问Write-only access (W)
  1. Advanced permissions
  • 删除Delete (D)
  • 读取控制(读取权限)Read control (RC)
  • 写入 DAC(更改权限)Write DAC (WDAC)
  • 写入所有者(获取所有权)Write owner (WO)
  • 同步Synchronize (S)
  • 访问系统安全性Access system security (AS)
  • 允许的最大值Maximum allowed (MA)
  • 泛型读取Generic read (GR)
  • 泛型写入Generic write (GW)
  • 泛型执行Generic execute (GE)
  • 泛型全部Generic all (GA)
  • 读取数据/列表目录Read data/list directory (RD)
  • 写入数据/添加文件Write data/add file (WD)
  • 追加数据/添加子目录Append data/add subdirectory (AD)
  • 读取扩展属性Read extended attributes (REA)
  • 写入扩展属性Write extended attributes (WEA)
  • 执行/遍历Execute/traverse (X)
  • 删除子级Delete child (DC)
  • 读取属性Read attributes (RA)
  • 写入属性Write attributes (WA)


icacls <filename> [/grant[:r] <sid>:<perm>[...]] [/deny <sid>:<perm>[...]] [/remove[:g|:d]] <sid>[...]] [/t] [/c] [/l] [/q] [/setintegritylevel <Level>:<policy>[...]]

icacls <directory> [/substitute <sidold> <sidnew> [...]] [/restore <aclfile> [/c] [/l] [/q]]

<filename>

指定要显示或修改 DACL 的文件。

<directory>

指定要显示或修改 DACL 的目录。

/t

对当前目录及其子目录中的所有指定文件执行操作。

/c

尽管存在任何文件错误,但仍继续操作。 仍会显示错误消息。

/l

对符号链接而不是其目标执行操作。

/q

抑制成功消息。

[/setowner <username> [/t] [/c] [/l] [/q]]

将所有匹配文件的所有者更改为指定用户。

[/reset [/t] [/c] [/l] [/q]]

将 ACL 替换为所有匹配文件的默认继承 ACL。

[/grant[:r] <sid>:<perm>[...]]

授予指定的用户访问权限。 权限替换了以前授予的显式权限。

不添加 :r,表示将权限添加到以前授予的任何显式权限。

[/deny <sid>:<perm>[...]]

显式拒绝指定的用户访问权限。 为所述权限添加显式拒绝 ACE,并删除任何显式授予中的相同权限。

[/remove[:g | :d]] <sid>[...] [/t] [/c] [/l] [/q]

从 DACL 中删除所有出现的指定 SID。 该命令还可以使用:

  • :g - 删除对指定 SID 的所有出现的授予权限。
  • :d - 删除对指定 SID 的所有出现的拒绝权限。

/inheritancelevel: [e | d | r]

设置继承级别,可以是:

  • e - 启用继承
  • d - 禁用继承并复制 ACE
  • r - 禁用继承并仅删除继承的 ACE
  • 继承权可以先于以下任一 <perm> 形式:
  • (I) - 继承。 ACE 继承自父容器。Inherit (I)
  • (OI) - 对象继承。 此容器中的对象将继承此 ACE。 仅适用于目录。Object Inherit (OI)
  • (CI) - 容器继承。 此父容器中的容器将继承此 ACE。 仅适用于目录。Container Inherit (CI)
  • (IO) - 仅继承。 ACE 继承自父容器,但不适用于对象本身。 仅适用于目录。Inherit Only (IO)
  • (NP) - 不传播继承。 ACE 由容器和对象从父容器继承,但不会传播到嵌套容器。 仅适用于目录。Not Propagate

显示file1的DACL:

icacls .\file1.txt

如何用PowerShell管理文件和目录权限_powershell_06

如何用PowerShell管理文件和目录权限_powershell_07

如果要授予test.user对file1.txt的写入Write-only access (W)权限:

icacls file1.txt /grant test.user:W

如果要授予test.user对file1.txt的完全控制权限Full access (F):

icacls file1.txt /grant test.user:F

授予Windows Server 特殊标识组(有时称为安全组)Everyone 的只读权限:

常见特殊标识组的SID:

Anonymous Logon: S-1-5-7

Authenticated Users: S-1-5-11

Creator Owner: S-1-3-0
Everyone: S-1-1-0 从 Windows Server 2003 开始,Everyone 组仅包含“Authenticated Users”和“Guest”。 默认情况下,该组不再包括 Anonymous Logon 组。

 icacls C:\fileshare /grant everyone:R /t /c

如何用PowerShell管理文件和目录权限_icacls_08

删除Everyone的权限:

icacls C:\fileshare /remove:g everyone /t /c

如何用PowerShell管理文件和目录权限_icacls_09


设置所有者:

icacls C:\fileshare /setowner y\scadmin /t /c

icacls C:\fileshare /setowner ykxadmin@artingykx.com /t /c

如何用PowerShell管理文件和目录权限_powershell_10