管理文件和文件夹权限是一个复杂而耗时的过程。当使用图形界面(GUI)时尤其如此。PowerShell使这一过程更加简单快捷。
1.显示NTFS文件和目录的权限(List NTFS file and folder permissions )
NTFS有大量的权限,可以对文件和文件夹进行各种组合设置。要轻松查看所有可用权限,您可以输出 System.Security.AccessControl.FileSystemRights
[System.Enum]::GetNames([System.Security.AccessControl.FileSystemRights])
其中包括基础权限和高级权限(basic permissions and advanced permissions)
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
(Get-ACL -Path "C:\fileshare").Access | Format-Table IdentityReference,FileSystemRights,AccessControlType,IsInherited,InheritanceFlags -AutoSize
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 应用于指定目录中的文件。
- Basic permissions
- 完全访问Full access (F)
- 修改访问权限Modify access (M)
- 读取和执行访问权限Read and execute access (RX)
- 只读访问Read-only access (R)
- 只写访问Write-only access (W)
- 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。 该命令还可以使用:
|
/inheritancelevel: [e | d | r] | 设置继承级别,可以是:
|
- 继承权可以先于以下任一
<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
如果要授予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
授予
常见特殊标识组的SID:
Anonymous Logon: S-1-5-7
Authenticated Users: S-1-5-11
icacls C:\fileshare /grant everyone:R /t /c
删除Everyone的权限:
icacls C:\fileshare /remove:g everyone /t /c
设置所有者:
icacls C:\fileshare /setowner y\scadmin /t /c
icacls C:\fileshare /setowner ykxadmin@artingykx.com /t /c