Мне нужна помощь со сценарием. То, что я пытаюсь сделать, - это когда в ADUC создаются новые пользователи и создается их путь к профилю (домашняя папка), это дает пользователям «Полный доступ». Я хочу изменить это на "Изменить разрешения". Моя проблема в том, что еженедельно создается несколько пользователей, и мне нужен сценарий, который может просматривать все домашние папки и, если он найдет пользователя с полным контролем, изменить его для изменения. Но также есть группа безопасности администраторов, в которой есть несколько администраторов, у которых есть «Полный доступ к каждому домашнему каталогу. Я не хочу, чтобы он заглядывал внутрь группы и забирал у них полный контроль. Какие командлеты мне нужно сказать игнорировать эту группу и измените только пользователя, у которого есть «Полный доступ», для изменения разрешений. У меня есть сценарий, который изменяет конкретного пользователя с «Полный доступ» для изменения, но я не знаю, как правильно заставить его просто искать просто учетная запись пользователя в папках с «Полный доступ».
#ChangeACL.ps1
$Right="Modify"
#The possible values for Rights are
# ListDirectory
# ReadData
# WriteData
# CreateFiles
# CreateDirectories
# AppendData
# ReadExtendedAttributes
# WriteExtendedAttributes
# Traverse
# ExecuteFile
# DeleteSubdirectoriesAndFiles
# ReadAttributes
# WriteAttributes
# Write
# Delete
# ReadPermissions
# Read
# ReadAndExecute
# Modify
# ChangePermissions
# TakeOwnership
# Synchronize
# FullControl
$StartingDir="\\server\Path" #What directory do you want to start at?"
$Principal="domain\user" #What security principal do you want to grant" `
#define a new access rule.
$rule=new-object System.Security.AccessControl.FileSystemAccessRule($Principal,$Right,"ContainerInherit,ObjectInherit", 'None',"Allow")
foreach ($file in $(Get-ChildItem $StartingDir -recurse)) {
$acl=(Get-Item $file.FullName).GetAccessControl('Access')
#Add this access rule to the ACL
$acl.SetAccessRule($rule)
#Write the changes to the object
#Set-Acl $File.Fullname $acl
(Get-Item $file.FullName).SetAccessControl($acl)
}
Я создал еще один для всех, у кого может быть такая же ситуация. Этот будет проверять ACL и при необходимости изменится.
#set root share to scan
$HomeFolders = get-childitem \\servername\USERS -Directory
# loop through all folders in root
foreach ($HomeFolder in $HomeFolders) {
$Path = $HomeFolder.FullName
#set username based on folder name. Know that this is not going to be 100% accurate
# since some user shares may have access granted to other users(ie, managers)
$Username = $HomeFolder.Name
# set variable for Username
$IdentityReferrence = "domain\$Username"
# create security object specific to user
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule($IdentityReferrence, 'Modify', 'ContainerInherit,ObjectInherit', 'None', 'Allow')
# get acl of folder in loop
$Acl = (Get-Item $Path).GetAccessControl('Access')
# look through all access objects
foreach ($aclitem in $acl.Access) {
# if a matching userID is found, check the permissions against the new access rule identity reference.
if ($aclitem.IdentityReference -eq $ar.IdentityReference) {
# if rights do not match, set the permissions with access rule set before
if ($aclitem.FileSystemRights -ne $ar.FileSystemRights) {
write-host $HomeFolder.FullName "has permission of "$aclitem.FileSystemRights
$Acl.SetAccessRule($Ar)
write-host "Correcting permissions on $($homefolder.fullname)"
(Get-Item $HomeFolder.FullName).SetAccessControl($acl)
}
}
}
}
После некоторого тестирования я придумал этот сценарий и, похоже, работает:
$HomeFolders = Get-ChildItem \\server\Path -Directory
foreach ($HomeFolder in $HomeFolders) {
$Path = $HomeFolder.FullName
$Acl = (Get-Item $Path).GetAccessControl('Access')
$Username = $HomeFolder.Name
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("domain\$Username", 'Modify','ContainerInherit,ObjectInherit', 'None', 'Allow')
$Acl.SetAccessRule($Ar)
(Get-Item $HomeFolder.FullName).SetAccessControl($acl)
}