2

非常感谢您的帮助。

所以我有数百个文件和文件夹,我想从中删除用户:C850-108。我可以使用 Windows 界面执行此操作,但在每个文件中执行此操作需要几天时间。

我想这样做的原因是因为 Cobian Backup 工具无法访问这些文件(权限被拒绝),我认为用户是问题所在。

所以我有 Cygwin (bash) 一个 PowerShell 来帮助我完成这项繁琐的任务。

我附上3张截图:

  1. Windows 安全选项卡

    在此处输入图像描述

  2. 命令的 PowerShell 输出get-acl | format-list

    在此处输入图像描述

  3. Cygwin的输出getfacl

    在此处输入图像描述

我对 bash 更有经验,所以我尝试添加这样的用户:

 setfacl.exe -m u:rafaelgp:rwx myfile

这显然什么也没做,但是当我检查 PowerShell 时,我发现它确实有效并添加了一个具有指定权限的新用户 (rafaelgp)。您可以在屏幕截图中看到这一点。所以在这之后,我对 Cygwin 失去了一些信任。

我也尝试过像这样删除用户:

setfacl.exe -d u:C850-108 myfile

但我收到以下消息:

setfacl: illegal acl entries

那么我能做什么呢?正如我所说,我很高兴使用 bash 或 PowerShell 尝试任何事情。

干杯!

更新:

Musaab Al-Okaidi 解决方案的屏幕截图。'$file' 参数似乎有问题

在此处输入图像描述

4

2 回答 2

0

将以下函数添加到您的 shell,只需复制和粘贴,然后您将拥有Remove-UserAccess一个可用的 Cmdlet

Function Remove-UserAccess()
{
   Param
   (   
      [Parameter(Mandatory=$true)][String]$Path,
      [Parameter(Mandatory=$true)][String]$User      
   )

   $Files = New-Object System.Collections.ArrayList
   $Files.Add($Path) | Out-Null

   #Add all files and folders to an array
   $PathSubtree = Get-ChildItem -Path $Path -Recurse
   Foreach ( $File in $PathSubtree )
   {
      $Files.Add($File.FullName) | Out-Null
   }

   # Remove access of the $User from each file in the array
   Foreach ( $File in $Files )
   {
      $AccessRule = Get-Acl $File | % { $_.Access } | ? {  $_.IdentityReference -eq $User}
      IF ( $AccessRule -eq $null )
      {
         Write-Host "$User does not have access to $File" -ForegroundColor Yellow
      }
      ELSE
      {
         $ACL = Get-Acl $File
         $ACL.RemoveAccessRule($AccessRule) | out-Null
         Set-Acl -Path $File -AclObject $ACL -ErrorAction Stop
         Write-Host "Permissions for $user have been removed from the following path: $File" -ForegroundColor Green
      }
   }
}

执行命令如下:

Remove-UserAccess -Path C:\temp -User RAFALAPTOP\C850-108

这将从 C:\temp 以及所有子文件和文件夹中删除用户的访问权限。

于 2013-02-13T10:09:05.053 回答
0

最简单的方法可以说是icacls

icacls file /remove C850-180

但是,您不能删除从父文件夹继承的权限。我怀疑这就是setfacl失败的原因。Get-Acl不幸的是,当您通过管道输出into时,继承信息被抑制Format-List。试试这个:

Get-Acl file | % { $_.Access } | ? { $_.IdentityReference -match 'C850-180' }

IsInherited属性将显示 ACL 是否被继承。如果 ACL 是继承的,则必须先禁用继承,然后才能删除 ACL:

icacls file /inheritance:d

icacls自 Windows Server 2003 SP2 起可用

更新:

您可以通过添加选项将其递归地应用于文件夹树/t

icacls C:\some\folder\* /t /inheritance:d
icacls C:\some\folder\* /t /remove C850-180

但是请注意,递归禁用继承并不是一个好主意,因为它会使管理权限成为一场噩梦。根据您的文件夹结构,最好从父文件夹中简单地删除继承和特定的 ACE:

icacls C:\some\folder /inheritance:d
icacls C:\some\folder /remove C850-180

子文件夹和文件将自动继承其父文件夹更改后的权限。如有必要,您可以通过重置子文件夹和文件的权限来强制执行此操作:

icacls C:\some\folder\* /reset /t /c
于 2013-02-13T10:12:32.807 回答