boffin2
28-02-2016, 17:54
Собственно говоря скрипт
# Создание папок обмена для сотрудников компании
# Структура скрипта взята у В. Питина http://www.pitin.su/news-42-0-0.htm, добавлена раздача прав
# Папки создаются по записям пользователей из заданного OU в Active Directory
# папки именуются по полю name учетной записи
# Права на корневую папку обмена следующие:
# СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ:(OI)(CI)(IO)F
# NT AUTHORITY\система:(OI)(CI)F
# Domain Admins:(OI)(CI)F
# Domain Users:(CI)R
# это дает возможность пользователям только просматривать список именных папок
# Права на папку пользователя следующие:
# СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ:(OI)(CI)(IO)F
# NT AUTHORITY\система:(OI)(CI)F
# user.name:(OI)(CI)F
# Domain Admins:(OI)(CI)F
# Domain Users:(OI)(CI)(специальный доступ:)
# SYNCHRONIZE
# FILE_READ_DATA
# FILE_WRITE_DATA
# FILE_APPEND_DATA
# это дает возможность всем пользователям создавать папки и файлы в папке любого сотрудника,
# но открывать/изменять/удалять файлы каждый сотрудник может только в своей папке
# Параметры скрипта необходимо настроить по месту
# корневой ou может иметь вид "ou=CompanyName" или "ou=CompanyName,ou=root" в зависимости от структуры OU в AD
# DN домена приписывается автоматически
$RootDN = ([ADSI]"").distinguishedName
$RootOU = 'ou=<корневой ou>'
$RootFolder = 'C:\Обмен'
$MaxUsers = 10000
# Блок, задающий константы для раздачи прав.
# FileSystemAccessRule принимает строковые аргументы, но вынесение констант сюда делает код прозрачнее
# флаги для задания наследования прав (CI, OI, IO)
$inheritCO = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
$propagationIO = [system.security.accesscontrol.PropagationFlags]"InheritOnly"
$propagationN = [system.security.accesscontrol.PropagationFlags]"None"
# права для всех пользователей на объекты внутри пользовательских папок
$colUserRights = [system.security.accesscontrol.FileSystemRights]"ListDirectory, CreateFiles, CreateDirectories, AppendData"
$colFullRights = [system.security.accesscontrol.FileSystemRights]"FullControl"
$colListRights = [system.security.accesscontrol.FileSystemRights]"ListDirectory"
# пользователи
$creator = New-Object System.Security.Principal.NTAccount("CREATOR OWNER")
$system = New-Object System.Security.Principal.NTAccount("NT AUTHORITY\SYSTEM")
$admins = New-Object System.Security.Principal.NTAccount("Domain Admins")
$users = New-Object System.Security.Principal.NTAccount("Domain Users")
# собственно сам скрипт
# Полностью очистить папку обмена
Set-Location $RootFolder
Get-ChildItem $RootFolder | Remove-Item -recurse
# выбрать всех пользователей из заданного OU
$dn="$RootOU,$RootDN"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher ([ADSI]"LDAP://$dn")
$objSearcher.Filter = "(&(objectCategory=user)(objectClass=person))"
$objSearcher.SearchScope = [System.DirectoryServices.SearchScope]::Subtree
$objSearcher.PageSize = $MaxUsers
$colResult = $objSearcher.FindAll()
foreach ($u in $colResult)
{
$user = [ADSI]($u.Path)
if ($user.psbase.invokeget("AccountDisabled") -eq $False)
{
# для каждого пользователя, если он не залочен, создаем именную папку
$user = $u.Properties
$Folder = "$RootFolder\$($user.name)"
New-Item -Path "$Folder" -ItemType Directory | Out-Null
# перечень прав доступа к созданной папке
$acl = Get-Acl $Folder
# убираем наследование прав от родительской папки, при этом чистим все права доступа
$acl.SetAccessRuleProtection($True, $False)
# кто-то писал, что SetAccessRuleProtection может почистить не все
# не сталкивался, но на всяк случ удаляем все права, которые были оставлены после сняяяятия наследования
foreach ($ar in $acl.Access)
{
$acl.PurgeAccessRules($ar.IdentityReference)
}
# устанавливаем требуемые права
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $creator, $colFullRights, $inheritCO, $propagationIO, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $system, $colFullRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $admins, $colFullRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $user.samaccountname, $colFullRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $users, $colUserRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$acl | Set-Acl $Folder
}
}
Не понятности в
$RootDN = ([ADSI]"").distinguishedName
$RootOU = 'ou=<корневой ou>'
Что необходимо поправить, чтобы он заработал если домен - company.loc, а OU c пользователями - OU=Users,OU=company,DC=company,DC=loc?
# Создание папок обмена для сотрудников компании
# Структура скрипта взята у В. Питина http://www.pitin.su/news-42-0-0.htm, добавлена раздача прав
# Папки создаются по записям пользователей из заданного OU в Active Directory
# папки именуются по полю name учетной записи
# Права на корневую папку обмена следующие:
# СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ:(OI)(CI)(IO)F
# NT AUTHORITY\система:(OI)(CI)F
# Domain Admins:(OI)(CI)F
# Domain Users:(CI)R
# это дает возможность пользователям только просматривать список именных папок
# Права на папку пользователя следующие:
# СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ:(OI)(CI)(IO)F
# NT AUTHORITY\система:(OI)(CI)F
# user.name:(OI)(CI)F
# Domain Admins:(OI)(CI)F
# Domain Users:(OI)(CI)(специальный доступ:)
# SYNCHRONIZE
# FILE_READ_DATA
# FILE_WRITE_DATA
# FILE_APPEND_DATA
# это дает возможность всем пользователям создавать папки и файлы в папке любого сотрудника,
# но открывать/изменять/удалять файлы каждый сотрудник может только в своей папке
# Параметры скрипта необходимо настроить по месту
# корневой ou может иметь вид "ou=CompanyName" или "ou=CompanyName,ou=root" в зависимости от структуры OU в AD
# DN домена приписывается автоматически
$RootDN = ([ADSI]"").distinguishedName
$RootOU = 'ou=<корневой ou>'
$RootFolder = 'C:\Обмен'
$MaxUsers = 10000
# Блок, задающий константы для раздачи прав.
# FileSystemAccessRule принимает строковые аргументы, но вынесение констант сюда делает код прозрачнее
# флаги для задания наследования прав (CI, OI, IO)
$inheritCO = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
$propagationIO = [system.security.accesscontrol.PropagationFlags]"InheritOnly"
$propagationN = [system.security.accesscontrol.PropagationFlags]"None"
# права для всех пользователей на объекты внутри пользовательских папок
$colUserRights = [system.security.accesscontrol.FileSystemRights]"ListDirectory, CreateFiles, CreateDirectories, AppendData"
$colFullRights = [system.security.accesscontrol.FileSystemRights]"FullControl"
$colListRights = [system.security.accesscontrol.FileSystemRights]"ListDirectory"
# пользователи
$creator = New-Object System.Security.Principal.NTAccount("CREATOR OWNER")
$system = New-Object System.Security.Principal.NTAccount("NT AUTHORITY\SYSTEM")
$admins = New-Object System.Security.Principal.NTAccount("Domain Admins")
$users = New-Object System.Security.Principal.NTAccount("Domain Users")
# собственно сам скрипт
# Полностью очистить папку обмена
Set-Location $RootFolder
Get-ChildItem $RootFolder | Remove-Item -recurse
# выбрать всех пользователей из заданного OU
$dn="$RootOU,$RootDN"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher ([ADSI]"LDAP://$dn")
$objSearcher.Filter = "(&(objectCategory=user)(objectClass=person))"
$objSearcher.SearchScope = [System.DirectoryServices.SearchScope]::Subtree
$objSearcher.PageSize = $MaxUsers
$colResult = $objSearcher.FindAll()
foreach ($u in $colResult)
{
$user = [ADSI]($u.Path)
if ($user.psbase.invokeget("AccountDisabled") -eq $False)
{
# для каждого пользователя, если он не залочен, создаем именную папку
$user = $u.Properties
$Folder = "$RootFolder\$($user.name)"
New-Item -Path "$Folder" -ItemType Directory | Out-Null
# перечень прав доступа к созданной папке
$acl = Get-Acl $Folder
# убираем наследование прав от родительской папки, при этом чистим все права доступа
$acl.SetAccessRuleProtection($True, $False)
# кто-то писал, что SetAccessRuleProtection может почистить не все
# не сталкивался, но на всяк случ удаляем все права, которые были оставлены после сняяяятия наследования
foreach ($ar in $acl.Access)
{
$acl.PurgeAccessRules($ar.IdentityReference)
}
# устанавливаем требуемые права
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $creator, $colFullRights, $inheritCO, $propagationIO, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $system, $colFullRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $admins, $colFullRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $user.samaccountname, $colFullRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$ar = New-Object System.Security.AccessControl.FileSystemAccessRule( $users, $colUserRights, $inheritCO, $propagationN, "Allow")
$acl.SetAccessRule($ar)
$acl | Set-Acl $Folder
}
}
Не понятности в
$RootDN = ([ADSI]"").distinguishedName
$RootOU = 'ou=<корневой ou>'
Что необходимо поправить, чтобы он заработал если домен - company.loc, а OU c пользователями - OU=Users,OU=company,DC=company,DC=loc?