我们在同一个域中有多台服务器,要求是从 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
}
}