Или если Вы предпочитаете PowerShell, один из моих techs записал это, которое работало хорошо на нас. Я уверен, что это может, очистил некоторых, но я уехал в некоторых строках тестирования, чтобы помочь играть с и настроить. Это использует инструменты Quest, в которых Вы больше не нуждаетесь, особенно если Вы находитесь на PowerShell v2 и SubInACL:
cls
#Add-PSSnapin quest*
#$dirlist = gci -name c:\test -Exclude *.* | sort #my original
$dirlist = gci \\servername\sharename -Exclude *.* | ? { $_.PSIsContainer }
$subinacl = "C:\utils\subinacl.exe"
foreach ($userdir in $dirlist)
{
$username = $userdir.name
$adaccount = Get-QADUser $username
#Verifies user is an active employee, renamed folder to be deleted if not
If (($adaccount.AccountIsDisabled -eq $TRUE) -or (!$adaccount))
{
write-host "$username is not a current employee"
#takeownership
#takeown /f $userdir /R /D Y /A
#rename folder to _DEL_originalname
$newname = "_DEL_$username"
rename-item -path $userdir -newname $newname
}
Else
{
#get full path
Write-Host $userdir.name
#$currentDir = "c:\test\$userdir" #my original
$currentDir = $userdir.FullName # this way you don't dupe the start folder
#takeown /f $userdir /R /D Y /A
#get ACL of folder
$acl = Get-Acl $currentDir
#variable to set new permissions for username of folder
#$permission = "domainname\$userdir",”FullControl”,”ContainerInherit,ObjectInherit”,”None”,”Allow” #original
$permission = "$username@domainname.com",”FullControl”,”ContainerInherit,ObjectInherit”,”None”,”Allow”
$accessRule = new-object System.Security.AccessControl.FileSystemAccessRule $permission
#actually set the permissions
$acl.SetAccessRule($accessRule)
#$acl | Set-Acl $currentDir #my original
Set-Acl $currentDir $acl
#use subinacl to set owner at parent level and below
$params1 = "/file $currentDir /setowner=domainname\$username"
$params2 = "/subdirectories $currentDir\*.* /setowner=domainname\$username"
$params3 = "/subdirectories $currentDir\* /grant=domainname\$username"
$params4 = "/subdirectories $currentDir\* /grant=domainname\administrators=F"
Invoke-Expression "$subinacl $params1" | out-null
Invoke-Expression "$subinacl $params2" | out-null
Invoke-Expression "$subinacl $params3" | out-null
# Invoke-Expression "$subinacl $params4" | out-null
}
}
Этот сценарий является тем, который я использовал на победе 2008 для сброса безопасности пользователей на каталоге, названном e:\users. Это сбрасывает владение корректному владельцу и устанавливает профиль стандартной защиты. Это использует встроенный takeown и icacls, которые идут с 2008 так никакие внешние необходимые инструменты.
Это предполагает, что имена пользователей и имена каталогов являются тем же. т.е. e:\users\j.doe принадлежит mydomain\j.doe
При передаче его параметр как j.doe, это только 'исправляет' тот каталог, таким образом, можно протестировать его на одном каталоге. Проверьте, что права доступа - то, что Вы хотите перед живым использованием. Я использовал это для исправления вещей после миграции, где я копировал файлы в сценариях.
@echo off
setlocal enabledelayedexpansion
set mydom=mydomainname
set domadmins=%mydom%\Domain Admins
set domadmin=%mydom%\administrator
for /d %%A in (e:\users\%1*) do (
echo %%~nA%%~xA %%A
echo.
echo takeown
takeown /f %%A /r /d y
echo.
echo reset security
icacls %%A\*.* /reset /t
echo.
echo reset user access
icacls %%A\*.* /grant:r "%mydom%\%%~nA%%~xA:(oi)(ci)F"
echo.
echo Add domainadmins
icacls %%A\*.* /grant:r "%domadmins%:(oi)(ci)f" /grant:r "%mydom%\%%~nA%%~xA:(oi)(ci)F" /grant:r "%domadmin%:(oi)(ci)f" /grant:r "SYSTEM:(OI)(CI)F" /t /c
rem echo.
rem echo add user full access
rem icacls %%A /grant:r "%mydom%\%%~nA%%~xA:(oi)(ci)F" /t /c
icacls %%A\*.* /inheiritance:r
echo.
echo reset user ownership
@echo on
icacls %%A\*.* /setowner %mydom%\%%~nA%%~xA /t /c
@echo off)
echo finished
Я внес некоторые незначительные изменения при регистрации, таким образом, может быть синтаксическая ошибка.