Показать сообщение отдельно
Старый 13.11.2008, 02:14   #1
ViP
 
Пол:Мужской
Регистрация: 18.01.2006
Адрес: MSK RU
Сообщений: 2,837
Репутация: 1164
По умолчанию Организация папок пользователей и обмена в домене

В свете периодически обсуждаемых проблем с правами пользователей на папки выкладываю описание технологии, как это делаю я.
Политика такова.
  • На файл-сервере есть общий шаринг. Он же "файлопомойка", он же "папка для обмена", он же "common".
  • У каждого пользователя на сервере есть персональная папка, доступ к которой имеет только он. Она носит такое же имя, как и пользователь. Можно перенаправлять туда "Мои документы", почтовые базы и т.п.
  • Общий диск мы обычно подключаем логон-скриптом под буквой N каждому клиенту. Персональный диск - P.
  • Чтобы не плодить лишние шары на сервере, и common и все персональные папки лежат в одной папке - "personal folders" в корне диска на сервере. Зашарена эта самая родительская папка под именем "pf".
  • В список доступа (acl) на "personal folders" добавляем Domain Users.
  • Со всех папок пользователей снимаем наследование прав (это лучше делать, выделив их все скопом), копируем acl от родителя и удаляем оттуда Domain Users. Теперь в acl каждой папки добавляем пользователя, которому она принадлежит.

Итак, типовой логон-скрипт allusers.cmd:
Код:
@net use * /delete /yes
@net use N: \\server\PF\common
@net use P: \\server\PF\%username%
@net time \\server /set /y
@net use * /delete /yes
Сносим все шаринги пользователей, которые они могли наделать (зачем вы им вообще дали эти права?)
@net use N: \\server\PF\common
Подключаем общую папку. Механизм одинаков для всех.
@net use P: \\server\PF\%username%
А вот тут уже для каждого пользователя подключится своя папка. Замечу, что это прокатит только для англоязычных имён пользователей (не проверял!). Русские символы, imho, будут коверкаться, как обычно, командной строкой. Для их использования надо переделать этот скрипт под vbs.
@net time \\server /set /y
Синхронизируем время во всей сети с сервером.
Картина прекрасная, но какими усилиями она достигнута? В конторе 50 челов. Админу машинисткой клепать 50 папок, копируя их из списка AD? На это дело есть скриптик, который:
  • Создаёт Organizational Unit (OU) в AD. В дальнейшем вы можете создавать для него отдельную групповую политику.
  • Создаёт в этом OU пользователей, прописывает им дефолтный пароль, задаёт логон-скрипт (allusers.cmd). Сам логон-скрипт надо копировать в папку отдельно.
  • Создаёт общую папку и шарит её
  • Создаёт папки пользователей
Список пользователей берётся скриптом из текстового файла c:\users.txt, в котором эти имена написаны по одному в строке.
Далее приведён текст скрипта CreateUsers.vbs. Перед копированием прочитайте комментарии. Строки комментариев начинаются с апострофа.

Код:
Const PersonalFoldersPath = "D:\Personal folders"
Const UsersPassword = "DefPass90"

Const Enabled = 1
Const Disabled = 0
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' УСТАНОВКА ПАРАМЕТРОВ
Set objFSO = CreateObject("Scripting.FileSystemObject")
' проверяем существование файла C:\users.txt
If Not objFSO.FileExists("C:\users.txt") Then
	Wscript.Echo "Users list (c:\users.txt) does not exist."
	Return
End If

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\MicrosoftActiveDirectory")
Set colDomainInfo = objWMIService.ExecQuery("Select TreeName,DCName from Microsoft_LocalDomainInfo")
For each objDomain in colDomainInfo
	strTreeName = objDomain.TreeName
	strDCName = objDomain.DCName & "." & strTreeName
Next
strADsPath = "dc=" & Join(Split(strTreeName, "."), ",dc=")
' собираем имя DC

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ДОБАВИМ В РЕЕСТР ПОЛЕЗНЫЕ КЛЮЧИКИ
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.RegWrite("HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate" , 1, "REG_DWORD")
objShell.RegWrite("HKCR\Folder\Shell\MenuText\Command\", "cmd.exe /k cd " & chr(34) & "%1" & chr(34))
objShell.RegWrite("HKCR\Folder\Shell\MenuText\", "Command Prompt Here")

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' СОЗДАЁМ ПАПКИ И ШАРИМ ИХ
objFSO.CreateFolder(PersonalFoldersPath)
objFSO.CreateFolder(PersonalFoldersPath & "\Common")

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objNewShare = objWMIService.Get("Win32_Share")
objNewShare.Create(PersonalFoldersPath, "PF", 0, 32766, "Domain users personal folders")

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' СОЗДАЁМ OU
'старт или
 'создание OU
Set objDomain = GetObject("LDAP://" & strADsPath)
Set objOU = objDomain.Create("organizationalUnit", "ou=OU users")
objOU.SetInfo
'или
 'использование существующего OU
'Set objOU = GetObject("LDAP://ou=OU users," & strADsPath)
'конец или

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' СОЗДАЁМ ПОЛЬЗОВАТЕЛЕЙ В AD
Set objUsersList = objFSO.OpenTextFile("c:\users.txt", 1)

Do While objUsersList.AtEndOfStream = False
	strUserName = objScriptFile.ReadLine

	objFSO.CreateFolder(PersonalFoldersPath & "\" & strUserName)

	Set objUser = objOU.Create("User", "cn=" & strUserName)
	objUser.Put "givenName", strUserName
	objUser.Put "userPrincipalName", strUserName
	objUser.Put "sAMAccountName", strUserName
	objUser.Put "displayName", strUserName
	objUser.Put "homeDrive", "P:"
	objUser.Put "homeDirectory", "\\" & strDCName & "\pf\" & strUserName
	objUser.Put "scriptPath", "allusers.cmd"
	objUser.SetInfo

	objUser.AccountDisabled = False
	objUser.AllowLogon = Disabled
	objUser.SetPassword UsersPassword
	intUAC = objUser.Get("userAccountControl")
	objUser.Put "userAccountControl", intUAC Xor ADS_UF_DONT_EXPIRE_PASSWD
	objUser.SetInfo

Loop

objUsersList.Close
В скрипте не реализовано назначение полномочий на персональные папки пользователей. Ручками это делать геморно, поэтому рассчитываю, что в обсуждении мы найдём решение этой задачи.
PLAstic вне форума
 
Ответить с цитированием Вверх
Эти 3 пользователя(ей) сказали cпасибо за это полезное сообщение:
 
Время генерации страницы 0.08483 секунды с 9 запросами