Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создание папок с именами сотрудников, используя «Powershell» (http://forum.oszone.net/showthread.php?t=312120)

boffin2 28-02-2016 17:54 2611150

Создание папок с именами сотрудников, используя «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?

Iska 28-02-2016 21:13 2611212

Цитата:

Цитата boffin2
Скрытый текст »

Внутри тэга скрытого текста ещё нужно обрамить код тэгом «code».

Kazun 29-02-2016 08:57 2611295

Можно поправить только в одном месте:
Код:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"LDAP://OU=Users,OU=company,DC=company,DC=loc")


Время: 04:42.

Время: 04:42.
© OSzone.net 2001-