Некоторые картинки не загружаются из РФ и РК, используйте VPN.

воскресенье, 4 февраля 2024 г.

Script Posh Восстановление acl в папке пользователя

В попытке настроить аудит, у меня сломался acl для пользовательских папок. Если бы речь шла об одной папке, то я бы решил этот вопрос простым удалением папки пользователя и его повторным входом в систему. Но речь шла о терминальном сервере. Поэтому родился этот скрипт. Единственно что надо учесть:

  1. Скрипт рассчитан на русскую локализацию
  2. Скрипт обрабатывает только каталоги внутри пользовательского
  3. Скрипт подразумевает, что имя каталога совпадает с именем пользователя
  4. Скрипт рассчитан на то, что владельцем каталога пользователя является системная учетная запись, а все дочерние принадлежат пользователю. На разных системах по разному.
  5. Сам скрипт использует icacls, вместо get-acl.
  6. Входящими параметрами скрипта является имя пользователя и домен, если домен не указан, то скрипт будет использовать имя ПК, с которого запущен (на тесте были ошибки, но мне не нужно было и не стал исправлять).

param(
     [Parameter()]
     [string]$User,
     [Parameter()]
     [string]$Domain=$env:COMPUTERNAME
)

$LogFile = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".log"
$CurrentTimeStamp=Get-Date -Format "dd.MM.yyyy`tHH:mm:ss"

function Logging($Message) {
	Write-Host "$Message"
    Write-Output("$CurrentTimeStamp`t$Message") | Out-File $LogFile -Append
}

if ($User) {
    Logging("User $User in $Domain is processing")
} else {
    Logging("Parameter `"User for processing (-User)`" is not specified ")
    exit
}
$UserFolder="C:\users\$User"

if (-Not (Test-Path $UserFolder)) {
    Logging("User folder $UserFolder not found")
    Exit
}

function getAcls ($ObjectFS){
    switch ($ObjectFS)
    {
        "Application Data" {return "SYSTEM"}
        "Local Settings" {return "SYSTEM"}
        "NetHood" {return "SYSTEM"}
        "PrintHood" {return "SYSTEM"}
        "SendTo" {return "SYSTEM"}
        "главное меню" {return "SYSTEM"}
        "Мои документы" {return "SYSTEM"}
        "Шаблоны" {return "SYSTEM"}
        Default {return "FULL"}   
    }  
}

foreach ($ObjectFS in  $(Get-ChildItem -Path $UserFolder -Force -Exclude "ntuser*","AppData")) {
    $ObjectFSFullName=$($ObjectFS.FullName)
    Logging("    Object $ObjectFSFullName is processing")
    #ICACLS
    $ACL= getAcls($ObjectFS.BaseName)
    Logging("        $ACL")
    Logging("        ICACLS $ObjectFSFullName /setowner $Domain\$user")
    ICACLS $ObjectFSFullName /setowner $Domain\$user /C /Q
    Logging("        ICACLS $ObjectFSFullName  /C /Q /RESET")
    ICACLS $ObjectFSFullName   /C /Q /RESET
    
    if ( "$ACL" -eq "SYSTEM" ) {
        Logging("        ICACLS $ObjectFSFullName  /setowner `"NT AUTHORITY\СИСТЕМА`" /c /q")
        ICACLS $ObjectFSFullName  /setowner "NT AUTHORITY\СИСТЕМА" /c /q
        Logging("        ICACLS $ObjectFSFullName  /deny `"Все:(NP)(S,RD)`" /c /q")
        ICACLS $ObjectFSFullName  /deny "Все:(NP)(S,RD)" /c /q
   }

}

 

Комментариев нет:

Отправить комментарий