Назад | Перейти на главную страницу

Удалить доступ объекта или пользователя из каталога с помощью PS

У нас есть несколько серверов в одном домене, и требуется удалить разрешение из определенной папки, которая определена в сценарии 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
    }

}

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