В попытке настроить аудит, у меня сломался acl для пользовательских папок. Если бы речь шла об одной папке, то я бы решил этот вопрос простым удалением папки пользователя и его повторным входом в систему. Но речь шла о терминальном сервере. Поэтому родился этот скрипт. Единственно что надо учесть:
- Скрипт рассчитан на русскую локализацию
- Скрипт обрабатывает только каталоги внутри пользовательского
- Скрипт подразумевает, что имя каталога совпадает с именем пользователя
- Скрипт рассчитан на то, что владельцем каталога пользователя является системная учетная запись, а все дочерние принадлежат пользователю. На разных системах по разному.
- Сам скрипт использует icacls, вместо get-acl.
- Входящими параметрами скрипта является имя пользователя и домен, если домен не указан, то скрипт будет использовать имя ПК, с которого запущен (на тесте были ошибки, но мне не нужно было и не стал исправлять).
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
}
}
Комментариев нет:
Отправить комментарий