使用 PS 从目录中删除对象或用户的访问权限

使用 PS 从目录中删除对象或用户的访问权限

我们在同一个域中有多台服务器,要求是从 power-shell 脚本中定义的特定文件夹中删除权限,并且我需要指定要删除的对象的名称和服务器列表(给出文本文件中的路径也可以)。是否可以通过 power shell 完成此任务?

例如:定义路径(C:\Powershell),安全选项卡上的对象名称([电子邮件保护]),服务器列表 (SERVER01,Server02)

Also this was the script that I tried 
$path = "C:\Powershell"
$users = @{}



$users = Get-NTFSAccess $path | Where-Object {$_.Account -ne "DOMAIN\Exclude"} | Select-Object Account



foreach ($user in $users) {
    $removalAccount = $user.Account
    Write-Host "Removing account - $($removalAccount)"
    Remove-NTFSAccess -Path $path -Account $removalAccount -AccessRights FullControl -AccessType Allow
    Remove-NTFSAccess -Path $path -Account $removalAccount -AccessRights FullControl -AccessType Deny    
}

谢谢 !

答案1

您可能需要查看 Get-Acl 和 Set-Acl。有几个变量可以决定您的方法:

  • 特定对象的权限是否始终明确且不被继承?(影响代码)
  • 您是每台服务器的管理员吗?
  • 如果是,那么每个服务器如何在网络上访问?(影响部署方法)

以下示例 - 从以具有管理员权限的用户身份登录的计算机运行所有所需服务器。对于每台服务器,通过 UNC (\servername\c$\path) 获取对象的 ACL 列表,删除所需的 ACL 规则,然后将修改后的 ACL 列表应用于对象。

诚然,通过 UNC 进行访问并不完美,而且可能会引起一些安全方面的担忧,但至少下面的代码应该可以让你了解需要调查的事情。我会考虑使用组策略或 SCCM 等管理工具部署脚本,而不是通过 UNC 远程一次性完成 - 我想这取决于你需要修改多少台服务器 :)

$servers = "SERVER1","SERVER2","SERVER3"
$base_path = "\c$\Powershell"
$acl_name = "DOMAIN\User.Name"

foreach ($server in $servers){
    $full_path = ("\\" + $server + $base_path)
    $acl_list = Get-Acl $full_path
    $acls_to_remove = $acl_list.access | where-object {($_.IdentityReference -eq $acl_name) -and ($_.IsInherited -eq $false)}

    foreach ($acl in $acls_to_remove){
        $acl_list.RemoveAccessRule($acl)
        Set-Acl -Path $full_path -AclObject $acl_list
    }

}

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-acl?view=powershell-6

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-acl?view=powershell-6

相关内容