У меня есть файловый сервер Windows 2008 R2. Он настроен таким образом, что пользователи получают домашний диск, сопоставленный с ним H :. Он находится в следующем месте \\servername\home\%username%
У меня были проблемы с тем, что пользователи Mac могли видеть домашние диски других пользователей (даже с включенным перечислением).
Мне нужно изменить разрешения для каталога и всех подкаталогов пользователей. Есть ли простой способ сделать это оптом их более тысячи.
Я смотрел Set-Acl http://helgeklein.com/setacl/examples/managing-file-system-permissions-with-setacl-exe/ однако я не вижу, как он будет делать все домашние диски пользователей, которые уже существуют. Если кто-то знает хороший инструмент, это было бы здорово.
Я хочу применить следующие разрешения к папке% username%
SYSTEM - Full control
local\Users special list and read attributes
local\administrators - Full control
%username% = modify
Спасибо
Этот сценарий я использовал в win 2008 для сброса безопасности пользователя в каталоге e: \ users. Он сбрасывает право собственности на правильного владельца и устанавливает стандартный профиль безопасности. Он использует встроенную утилиту и 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
При публикации я внес некоторые незначительные изменения, поэтому может быть синтаксическая ошибка.
Или, если вы предпочитаете PowerShell, один из моих технических специалистов написал это, и это хорошо сработало для нас. Я уверен, что он может кое-что очистить, но я оставил некоторые тестовые строки, чтобы упростить игру и настройку. Это использует Инструменты квеста который вам больше не нужен, особенно если вы используете 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
}
}