Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Создание папок с именами сотрудников, используя «Powershell»

Ответить
Настройки темы
PowerShell - [решено] Создание папок с именами сотрудников, используя «Powershell»

Новый участник


Сообщения: 13
Благодарности: 0

Профиль | Отправить PM | Цитировать


Собственно говоря скрипт
Скрытый текст

# Создание папок обмена для сотрудников компании
# Структура скрипта взята у В. Питина http://www.pitin.su/news-42-0-0.htm, добавлена раздача прав
# Папки создаются по записям пользователей из заданного OU в Active Directory
# папки именуются по полю name учетной записи
# Права на корневую папку обмена следующие:
# СОЗДАТЕЛЬ-ВЛАДЕЛЕЦOI)(CI)(IO)F
# NT AUTHORITY\системаOI)(CI)F
# Domain AdminsOI)(CI)F
# Domain UsersCI)R
# это дает возможность пользователям только просматривать список именных папок
# Права на папку пользователя следующие:
# СОЗДАТЕЛЬ-ВЛАДЕЛЕЦOI)(CI)(IO)F
# NT AUTHORITY\системаOI)(CI)F
# user.nameOI)(CI)F
# Domain AdminsOI)(CI)F
# Domain UsersOI)(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?

Отправлено: 17:54, 28-02-2016

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:13, 28-02-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Можно поправить только в одном месте:
Код: Выделить весь код
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"LDAP://OU=Users,OU=company,DC=company,DC=loc")
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:57, 29-02-2016 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Создание папок с именами сотрудников, используя «Powershell»

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Создание динамического скрипта для PowerShell AZABAZA Скриптовые языки администрирования Windows 1 18-11-2015 13:52
CMD/BAT - Найти файл используя список с именами в txt файле Spacejet Скриптовые языки администрирования Windows 0 29-07-2015 10:02
CMD/BAT - Создание папок и файлов со с случайными именами. Kirstem Скриптовые языки администрирования Windows 0 26-04-2015 20:06
вирь, называет себя именами папок 1.44 мб. Naiki Лечение систем от вредоносных программ 2 22-03-2010 10:43
VBS/WSH/JS - Создание папок исходя из имени хоста.Создание ярлыков. ufunf Скриптовые языки администрирования Windows 1 18-02-2010 13:59




 
Переход