![]() |
Создание папок с именами сотрудников, используя «Powershell»
Собственно говоря скрипт
Скрытый текст
# Создание папок обмена для сотрудников компании # Структура скрипта взята у В. Питина 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? |
Цитата:
|
Можно поправить только в одном месте:
Код:
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"LDAP://OU=Users,OU=company,DC=company,DC=loc") |
Время: 05:00. |
Время: 05:00.
© OSzone.net 2001-