PowerShell清空目录及递归的所有文件(夹)的审核者。问答笔记

~={green}使用PowerShell清空"C:\Users\markp\Desktop\test"目录及递归的 所有文件(夹)的审核者。请写出完整的命令=~

以下是使用 PowerShell 清空指定目录及递归子目录中所有文件和文件夹的审核者(audit settings)的完整命令:

powershell

Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse | ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }

命令说明:

  1. Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse:获取指定目录及其所有子目录中的文件和文件夹。
  2. ForEach-Object:对每个文件或文件夹执行操作。
  3. Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity):为每个对象设置一个新的空 ACL(访问控制列表),从而移除现有的审核者设置。
    注意事项:

这条命令可以清空"C:\Users\markp\Desktop\test"递归的所有文件(夹)的审核者。但是本目录 test并没有清空

你是对的,上述命令只清空了 C:\Users\markp\Desktop\test 目录下递归的文件和子文件夹的审核者(audit settings),但没有清空 test 目录本身的审核者设置。要同时清空 test 目录及其递归内容的所有审核者,需要稍微修改命令,确保 test 目录本身的 ACL 也被处理。以下是完整的 PowerShell 命令,可以清空 C:\Users\markp\Desktop\test 目录及其递归的所有文件和文件夹的审核者:

powershell

# 清空 test 目录本身的审核者
Set-Acl -Path "C:\Users\markp\Desktop\test" -AclObject (New-Object System.Security.AccessControl.DirectorySecurity)
# 清空 test 目录下所有递归文件和文件夹的审核者
Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse | ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }

命令说明:

  1. 第一行:Set-Acl -Path "C:\Users\markp\Desktop\test" -AclObject (New-Object System.Security.AccessControl.DirectorySecurity):直接针对 test 目录本身设置一个新的空 ACL,清除其审核者设置。
  2. 第二行:Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse | ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }:递归处理 test 目录下的所有文件和子文件夹,清空它们的审核者设置。
    第二行:Get-ChildItem -Path “C:\Users\markp\Desktop\test” -Recurse |ForEach-对象 { set-acl -path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }:递归处理 test 目录下的所有文件和子文件夹,清空它们的审核者设置。
    注意事项:

powershell

# 备份 ACL
Get-Acl -Path "C:\Users\markp\Desktop\test" | Export-Clixml -Path "C:\backup\test_acl_backup.xml"
# 执行清空操作
Set-Acl -Path "C:\Users\markp\Desktop\test" -AclObject (New-Object System.Security.AccessControl.DirectorySecurity)
Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse | ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }
# 检查审核者是否清空
Get-Acl -Path "C:\Users\markp\Desktop\test" | Format-List

~={green}能不能加入排除文件夹(及此文件夹中的所有内容)?比如test文件夹中有一个文件夹名为aaa,我想将 它排除在外。=~

是的,可以在 PowerShell 命令中加入排除特定文件夹(及其所有内容的)逻辑,以确保 C:\Users\markp\Desktop\test 目录中的 aaa 文件夹及其递归内容不被清空审核者设置。以下是修改后的完整命令:

powershell

# 清空 test 目录本身的审核者
Set-Acl -Path "C:\Users\markp\Desktop\test" -AclObject (New-Object System.Security.AccessControl.DirectorySecurity)
# 清空 test 目录下所有递归文件和文件夹的审核者,但排除 aaa 文件夹及其内容
Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse | Where-Object { $_.FullName -notlike "*\aaa\*" -and $_.FullName -ne "C:\Users\markp\Desktop\test\aaa" }
 | ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }

命令说明:

  1. 清空 test 目录本身的审核者:
    • Set-Acl -Path "C:\Users\markp\Desktop\test" -AclObject (New-Object System.Security.AccessControl.DirectorySecurity):直接清空 test 目录的审核者设置。
      Set-Acl -Path “C:\Users\markp\Desktop\test” -AclObject (New-Object System.Security.AccessControl.DirectorySecurity):直接清空 test 目录的审核者设置。
  2. 递归处理并排除 aaa 文件夹:
    - Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse:获取 test 目录下的所有文件和子文件夹。
    - Where-Object { $_.FullName -notlike "*\aaa\*" -and $_.FullName -ne "C:\Users\markp\Desktop\test\aaa" }:过滤掉路径中包含 \aaa\ 或恰好是 aaa 文件夹本身的项,确保 aaa 文件夹及其内容不被处理。
    - ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }:对过滤后的文件和文件夹清空审核者设置。
    ForEach-对象 { set-acl -path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }:对过滤后的文件和文件夹清空审核者设置。
    注意事项:

powershell

Get-ChildItem -Path "C:\Users\markp\Desktop\test" -Recurse | Where-Object { $_.FullName -notlike "*\aaa\*" -and $_.FullName -ne "C:\Users\markp\Desktop\test\aaa"
 -and $_.FullName -notlike "*\bbb\*" -and $_.FullName -ne "C:\Users\markp\Desktop\test\bbb" } | ForEach-Object { Set-Acl -Path $_.FullName -AclObject (New-Object System.Security.AccessControl.DirectorySecurity) }

~={green}排除多个文件夹的命令,它会排除文件夹的子文件夹吗?=~

是的,这个排除多个文件夹的命令(如我之前提供的示例)会自动排除指定文件夹的子文件夹及其所有内容。这是因为过滤条件使用 了 -notlike "*\aaa\*" 和 -notlike "*\bbb\*" 等模式,这些模式会匹配任何路径中包含 \aaa\ 或 \bbb\ 的项,包括:

C:\Users\markp\Desktop\test\
├── file1.txt
├── aaa\
│ ├── sub1\
│ │ └── file2.txt
│ └── file3.txt
└── bbb\
└── sub2\
└── file4.txt

运行命令后:

~={red}我只想清空审核者,不想清空权限。怎么办?=~

是的,可以实现只清空审核者(audit rules)而不影响权限(access rules)。之前的命令使用空 DirectorySecurity 对象会清空整个 ACL(包括权限),所以我们需要修改逻辑:先获取当前 ACL,然后创建一个新 ACL,只复制访问规则(Access Rules),忽略审核规则(Audit Rules),最后设置回去。这样就能精确移除审核者设置。以下是更新后的完整 PowerShell 命令,包含排除 aaa 文件夹(及其所有内容)的逻辑。它会处理 C:\Users\markp\Desktop\test 目录本身及其递归内容,但跳过 aaa 分支。

powershell

# 清空 test 目录本身的审核者(保留权限)
$testPath = "C:\Users\markp\Desktop\test"
$acl = Get-Acl -Path $testPath
$newAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $acl.Access) { $newAcl.AddAccessRule($access) }
Set-Acl -Path $testPath -AclObject $newAcl

# 清空 test 目录下所有递归文件和文件夹的审核者(保留权限),但排除 aaa 文件夹及其内容
Get-ChildItem -Path $testPath -Recurse | Where-Object { $_.FullName -notlike "*\aaa\*" -and $_.FullName -ne "$testPath\aaa" } | ForEach-Object {
$currentAcl = Get-Acl -Path $_.FullName
$currentNewAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $currentAcl.Access) { $currentNewAcl.AddAccessRule($access) }
Set-Acl -Path $_.FullName -AclObject $currentNewAcl
}

命令说明:

  1. 处理 test 目录本身:
    • Get-Acl:获取当前 ACL。
    • New-Object System.Security.AccessControl.DirectorySecurity:创建一个新 ACL 对象。
    • foreach (access in $acl.Access) { $newAcl.AddAccessRule(access) }:只复制所有访问规则(权限),忽略审核规则。
      foreach (access $acl。Access) { $newAcl.AddAccessRule(access) }:只复制所有访问规则(权限),忽略审核规则。
    • Set-Acl:应用新 ACL,审核者被清空,但权限保留。
  2. 递归处理并排除 aaa:
    - Get-ChildItem -Recurse | Where-Object { ... }:获取并过滤项,排除路径中包含 \aaa\ 或精确匹配 aaa 的项(包括其子内容)。
    - 对每个过滤后的项,重复上述逻辑:复制访问规则,忽略审核规则,然后设置新 ACL。
    注意事项:

powershell

Where-Object { $_.FullName -notlike "*\aaa\*" -and $_.FullName -ne "$testPath\aaa" -and $_.FullName -notlike "*\bbb\*" -and $_.FullName -ne "$testPath\bbb" }

~={green}$testPath = "C:\Users\42170\Desktop\wwgg"这条命令是什么意思?=~

这是一个 PowerShell 命令,用于定义一个变量:

powershell

$testPath = "C:\Users\42170\Desktop\wwgg"
Get-ChildItem -Path $testPath # 使用变量获取 wwgg 文件夹的内容

注意:

~={green}假如排除的目录是:C:\Program Files ,目录名中间有空隔的怎么办?=~

是的,在 PowerShell 中,如果排除的目录名称中间有空格(如 "Program Files"),处理方式很简单:因为 FullName 属性返回的是完整的路径字符串(例如 C:\Users\markp\Desktop\test\Program Files\sub),在 Where-Object 的 -notlike 过滤器中,直接使用包含空格的模式即可,例如 *\Program Files\*。PowerShell 的字符串比较会自动处理空格,无需额外转义(只需确保模式字符串用双引号包围,如果必要)。更新后的完整命令示例假设你要排除 C:\Users\markp\Desktop\test 目录下的一个名为 "Program Files" 的子文件夹(及其所有内容),同时只清空审核者(保留权限)。命令如下:

powershell

# 清空 test 目录本身的审核者(保留权限)
$testPath = "C:\Users\markp\Desktop\test"
$acl = Get-Acl -Path $testPath
$newAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $acl.Access) { $newAcl.AddAccessRule($access) }
Set-Acl -Path $testPath -AclObject $newAcl

# 清空 test 目录下所有递归文件和文件夹的审核者(保留权限),但排除 "Program Files" 文件夹及其内容
Get-ChildItem -Path $testPath -Recurse | Where-Object { $_.FullName -notlike "*\Program Files\*" -and $_.FullName -ne "$testPath\Program Files" } | ForEach-Object {
$currentAcl = Get-Acl -Path $_.FullName
$currentNewAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $currentAcl.Access) { $currentNewAcl.AddAccessRule($access) }
Set-Acl -Path $_.FullName -AclObject $currentNewAcl
}

关键说明:

~={green}我要清空c:\所有文件(夹)及子文件(夹) 的审核者,但保留权限。排除目录是:"C:\Program Files\WindowsApps" ,"C:\Program Files\Windows Defender" ,"C:\Program Files\Windows Defender Advanced Threat Protection" , "C:\Program Files\ModifiableWindowsApps" ,"C:\Program Files (x86)\InstallShield Installation Information" ,"C:\Program Files (x86)\Microsoft" ,"C:\Program Files (x86)\Windows Defender" ,"C:\ProgramData" ,"C:\Windows" ,"C:\Users"。请写出完整的命令。=~

以下是使用 PowerShell 清空 C:\ 目录及其所有递归文件和文件夹的审核者(audit rules)设置的完整命令,同时保留权限(access rules)。命令会排除您指定的所有目录及其所有子内容(包括子文件夹和文件)。警告:此操作针对系统根目录,风险很高!请在执行前备份 ACL 设置,并以管理员身份运行 PowerShell。建议先在测试环境中验证。完整命令

powershell

# 清空 C:\ 目录本身的审核者(保留权限)
$rootPath = "C:\"
$acl = Get-Acl -Path $rootPath
$newAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $acl.Access) { $newAcl.AddAccessRule($access) }
Set-Acl -Path $rootPath -AclObject $newAcl

# 清空 C:\ 目录下所有递归文件和文件夹的审核者(保留权限),但排除指定的目录及其所有内容
Get-ChildItem -Path $rootPath -Recurse | Where-Object {
$_.FullName -notlike "C:\Program Files\WindowsApps\*" -and $_.FullName -ne "C:\Program Files\WindowsApps" -and
$_.FullName -notlike "C:\Program Files\Windows Defender\*" -and $_.FullName -ne "C:\Program Files\Windows Defender" -and
$_.FullName -notlike "C:\Program Files\Windows Defender Advanced Threat Protection\*" -and $_.FullName -ne "C:\Program Files\Windows Defender Advanced Threat Protection" -and
$_.FullName -notlike "C:\Program Files\ModifiableWindowsApps\*" -and $_.FullName -ne "C:\Program Files\ModifiableWindowsApps" -and
$_.FullName -notlike "C:\Program Files (x86)\InstallShield Installation Information\*" -and $_.FullName -ne "C:\Program Files (x86)\InstallShield Installation Information" -and
$_.FullName -notlike "C:\Program Files (x86)\Microsoft\*" -and $_.FullName -ne "C:\Program Files (x86)\Microsoft" -and
$_.FullName -notlike "C:\Program Files (x86)\Windows Defender\*" -and $_.FullName -ne "C:\Program Files (x86)\Windows Defender" -and
$_.FullName -notlike "C:\ProgramData\*" -and $_.FullName -ne "C:\ProgramData" -and
$_.FullName -notlike "C:\Windows\*" -and $_.FullName -ne "C:\Windows" -and
$_.FullName -notlike "C:\Users\*" -and $_.FullName -ne "C:\Users"
} | ForEach-Object {
$currentAcl = Get-Acl -Path $_.FullName
$currentNewAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $currentAcl.Access) { $currentNewAcl.AddAccessRule($access) }
Set-Acl -Path $_.FullName -AclObject $currentNewAcl
}

命令说明

  1. 处理 C:\ 目录本身:
    • 获取当前 ACL。
    • 创建一个新 ACL 对象,只复制访问规则($acl.Access),忽略审核规则。
    • 设置新 ACL,从而清空审核者但保留权限。
  2. 递归处理并排除指定目录:
    - Get-ChildItem -Path "C:\" -Recurse:获取 C:\ 下的所有文件和文件夹(递归)。
    - Where-Object { ... }:过滤条件,使用 -notlike "C:\ExcludeDir\*" 排除整个子树(包括子文件夹和文件),并用 -ne "C:\ExcludeDir" 排除目录本身。所有条件用 and 连接。对于有空格的路径(如 "Program Files (x86)"),PowerShell 会正确处理字符串匹配。
    - ForEach-Object { ... }:对每个过滤后的项,重复 ACL 处理逻辑(复制访问规则,设置新 ACL)。
    注意事项

~={green}只对某一个目录下的文件清除审核者,不清除权限;这个目录的子目录及子目录之下的所有内容都不改变,给出 例子?
=~
以下是使用 PowerShell 只针对指定目录下的直接文件(不包括子目录及其所有内容)清除审核者(audit rules)设置的完整命令示例,同时保留权限(access rules)。这个命令不会递归处理子目录,只处理目录根级下的文件。示例场景假设指定目录是 C:\Users\markp\Desktop\test,目录结构如下:

C:\Users\markp\Desktop\test\
├── file1.txt # 这个文件会被处理(清除审核者,保留权限)
├── file2.doc # 这个文件也会被处理
└── subfolder\ # 子目录及其内容(如 subfolder\file3.txt)不受影响
└── file3.txt

完整命令

powershell

# 定义目录路径
$targetPath = "C:\Users\markp\Desktop\test"

# 只获取该目录下的直接文件(不包括子目录)
Get-ChildItem -Path $targetPath -File | ForEach-Object {
# 获取当前文件的 ACL
$currentAcl = Get-Acl -Path $_.FullName
# 创建一个新 ACL,只复制访问规则(权限),忽略审核规则
$currentNewAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $currentAcl.Access) {
$currentNewAcl.AddAccessRule($access)
}
# 设置新 ACL 清空审核者,但保留权限
Set-Acl -Path $_.FullName -AclObject $currentNewAcl
}

命令说明

  1. $targetPath = "C:\Users\markp\Desktop\test":定义目标目录路径。你可以根据需要修改为其他路径。
  2. Get-ChildItem -Path $targetPath -File:只获取指定目录下的文件(-File 参数确保不包括目录本身或子目录)。这不会递归。
  3. ForEach-Object { ... }:对每个文件执行 ACL 操作。
    - Get-Acl:获取当前 ACL。
    - New-Object System.Security.AccessControl.DirectorySecurity:创建一个新 ACL 对象。
    - foreach (access in $currentAcl.Access) { $currentNewAcl.AddAccessRule(access) }:只复制访问规则(权限),忽略审核规则。
    foreach (access in $currentAcl.Access) { $currentNewAcl.AddAccessRule(< /mjx-merror>access) }:只复制访问规则(权限),忽略审核规则。
    - Set-Acl:应用新 ACL,从而只清空审核者。
    注意事项

~={green}清空某个文件夹及它的子项目的审核者,不清空权限。写出命令。=~

以下是使用 PowerShell 清空指定文件夹及其所有子项目(递归文件和文件夹)的审核者(audit rules)设置的完整命令,同时保留权限(access rules)。命令会处理文件夹本身及其递归内容。示例场景假设指定文件夹是 C:\Test,命令会清空其及所有子项目的审核者,但不会影响权限。完整命令

powershell

# 定义目标文件夹路径(可根据需要修改)
$targetPath = "C:\Test"

# 清空目标文件夹本身的审核者(保留权限)
$acl = Get-Acl -Path $targetPath
$newAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $acl.Access) { $newAcl.AddAccessRule($access) }
Set-Acl -Path $targetPath -AclObject $newAcl

# 清空目标文件夹下所有递归文件和文件夹的审核者(保留权限)
Get-ChildItem -Path $targetPath -Recurse | ForEach-Object {
$currentAcl = Get-Acl -Path $_.FullName
$currentNewAcl = New-Object System.Security.AccessControl.DirectorySecurity
foreach ($access in $currentAcl.Access) { $currentNewAcl.AddAccessRule($access) }
Set-Acl -Path $_.FullName -AclObject $currentNewAcl
}

命令说明

  1. 处理文件夹本身:
    • Get-Acl:获取当前 ACL。
    • New-Object System.Security.AccessControl.DirectorySecurity:创建一个新 ACL 对象。
    • foreach (access in $acl.Access) { $newAcl.AddAccessRule(access) }:只复制访问规则(权限),忽略审核规则。
      foreach ( access。 Access) { access) }:只复制访问规则(权限),忽略审核规则。
    • Set-Acl:应用新 ACL,清空审核者但保留权限。
  2. 递归处理子项目:
    • Get-ChildItem -Path $targetPath -Recurse:获取文件夹下的所有文件和子文件夹(递归)。
    • ForEach-Object { ... }:对每个子项目重复上述 ACL 处理逻辑。

注意事项