У нас есть несколько серверов в одном домене, и требуется удалить разрешение из определенной папки, которая определена в сценарии power-shell, и мне нужно указать имя объекта, который я собираюсь удалить, и список серверов (Учитывая путь в текстовом файле тоже допустим). Можно ли решить эту задачу через Power Shell?
Например: определенный путь (C: \ Powershell), имя объекта на вкладке безопасности (myname@domain.com), список серверов (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
}
Спасибо !
Вы, вероятно, захотите взглянуть на Get-Acl и Set-Acl. Есть несколько переменных, которые могут определить ваш метод:
Пример ниже - запуск с машины, вошедшей в систему как пользователь с доступом администратора ко всем необходимым серверам. Для каждого сервера получите список ACL для вашего объекта через UNC (\ servername \ c $ \ path), удалите нужное правило 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
}
}