如何使用Cywin或Powershell从文件中删除用户

时间:2013-02-13 09:40:50

标签: powershell cygwin

非常感谢您提前帮助。

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

我之所以这样做是因为Cobian Backup工具无法访问这些文件(Permission denied),我认为用户就是问题。

所以我有Cygwin(bash)PowerShell来帮助我完成这项繁琐的工作。

我附上3个截图:

  1. Windows安全性标签

    enter image description here

  2. 命令get-acl | format-list

    的PowerShell输出

    enter image description here

  3. getfacl

    的Cygwin输出

    enter image description here

  4. 我对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”参数似乎存在问题

    enter image description here

2 个答案:

答案 0 :(得分: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和所有子文件和文件夹中删除用户的访问权限。

答案 1 :(得分:0)

最简单的方法可能是icacls

icacls file /remove C850-180

但是,您无法删除从父文件夹继承的权限。我怀疑这就是setfacl失败的原因。不幸的是,当您将Get-Acl的输出传输到Format-List时,会抑制继承信息。试试这个:

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

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

icacls file /inheritance:d
自Windows Server 2003 SP2起,

icaclsavailable

<强>更新

您可以通过添加选项/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