Как стать автором
Обновить

Как организовать хранение пользовательских файлов если под рукой только Windows Server 2012

По приходу в компанию сетевые папки были разбросаны по серверам, и админ только и занимался тем, что перенарезал права. Но логика в большинстве компаний одинаковая:

1. У каждого пользователя должна быть своя папка
2. Папка должна быть у каждого отдела
3. Есть общие папки для сотрудников разных отделов, для рабочих групп.
4. Должна быть общая папка помойка — это мнение сугубо только пользователей.

Для упрощения работы пользователей было принято решение, что это должна быть одна точка входа. Как правило, это что-то вроде SharePoint. Но кроме двух серверов с Windows Server 2012 больше не было ничего.

Вот как было решено поступить.

1. Единой точкой входа решил сделать «Мои документы», хранится на файл-сервере. И поменять место хранения не проблема.
2. Не стали разбивать по отделам сотрудников, за основу взяли рабочие группы. Т.е. не важно в каком отделе работает сотрудник, но если у него есть документы, с которыми работает кто-то еще, то их объединяли в рабочую группу.
3. В каждой пользовательской папке должны быть ярлыки на группы, в которых он состоит.
4. Пользователь должен иметь права на отправку файлов в другие отделы. Индивидуально можно и по почте отправить, а вот рассылка группе по почте крупных файлов заставляет быстрее разбухать ящики пользователей.

Структура папок на сервере простейшая, три расшаренные папки:

  • user — поименные папки пользователей, создавались автоматически и с нужными правами;
  • group — создавались вручную, параллельно с созданием рабочей группы, права для группы на изменение;
  • send — папка для отправки документов в другие рабочие группы, чистим ежедневно.

А теперь по пунктам подробно, как это было реализовано.

1. Папки пользователей

Через GPO поменяли места хранения. Но т.к. после применения все добро из моих документов начинает копироваться на сервер, у некоторых это >20Gb, то мы прибегли к фильтру безопасности. Создали объект, связали со всем доменом, почистили фильтр безопасности и добавляли по одному пользователю. Так смогли разгрузить сеть.

2. Папки рабочих груп


Для этого в AD создали подразделение, для своего удобства. Внутри подразделения на создавали группы соответствующие нашим рабочим группам. Параллельно создавали одноименные папки в папке group и нарезали права. В каждой папке есть ссылка на папку из send где будут лежать входящие документы.

3. Единая точка входа через Мои документы


В моих документов у пользователей не только их файлы но и ярлыки на рабочие группы и папку отправку больших файлов. Вот листинг скрипта на создание ярлыков:

OU=Рабочие группы — объект где хранятся наши рабочие группы.

Import-Module ActiveDirectory
$Groups=Get-ADGroup -Filter * -SearchBase "OU=Рабочие группы,DC=domain,DC=local" -Properties *|Select Name,Members #получаем список групп, нам нужно тольок её имя и список членов
foreach ($Group in $Groups) {
$GroupFolders='\\имя сервера\group\'+$Group.Name #формируем путь ссылки

$LinkGroupFolders=$GroupFolders+"\_Входящие документы.lnk" #в папке группы создаем ярлык на папку входящих документов для отдела, именно там появляются aqks переданные от другого отдела

# Создание ссылки и назначение правка на папку входящие документы
$oShell1 = New-Object -COM WScript.Shell
$oShortcut1 = $oShell1.CreateShortcut($LinkGroupFolders)
$oShortcut1.TargetPath = '\\имя сервера\send\'+$Group.Name
$oShortcut1.Description = "Входящие документы для "+$Group.Name
$oShortcut1.Save()
$acl1 = Get-Acl $LinkGroupFolders
$addacl1 = New-Object System.Security.AccessControl.FileSystemAccessRule($Group.Name, "FullControl", "Allow")
$acl1.AddAccessRule($addacl1)
$acl1 | Set-Acl $LinkGroupFolders
#  Создание ссылки и назначение правка на папку входящие документы

$User="" #обнуляем переменную после предыдущего прогона
$User=Get-ADGroupMember -Identity $Group.Name -Recursive |Select SamAccountName #Получаем список пользователей группы
if($User.count){ #Если пользователей меньше 2х то папка рабочих групп и не нужна
foreach ($Users in $User) {
#Ссылки на группы
$UserFolder='\\имя сервера\user\'+$Users.SamAccountName+"\Мои документы\_Группа "+$Group.Name+".lnk" #тут создать ссылку
$oShell = New-Object -COM WScript.Shell
$oShortcut = $oShell.CreateShortcut($UserFolder)
$oShortcut.TargetPath = $GroupFolders
$oShortcut.Description = "Совместная рабочая группа "+$Group.Name
$oShortcut.Save()
$acl = Get-Acl $UserFolder
$addacl = New-Object System.Security.AccessControl.FileSystemAccessRule($Users.SamAccountName, "FullControl", "Allow")
$acl.AddAccessRule($addacl)
$acl | Set-Acl $UserFolder

#Создание ярлыка на отправка документов, со списко всех рабочих групп
$UserFolder='\\имя сервера\user\'+$Users.SamAccountName+"\Мои документы\_Отправка документов.lnk" #тут создать ссылку
$oShell = New-Object -COM WScript.Shell
$oShortcut = $oShell.CreateShortcut($UserFolder)
$oShortcut.TargetPath = '\\имя сервера\send\'
$oShortcut.Description = "Передача документов по отделам"
$oShortcut.Save()
$acl = Get-Acl $UserFolder
$addacl = New-Object System.Security.AccessControl.FileSystemAccessRule($Users.SamAccountName, "FullControl", "Allow")
$acl.AddAccessRule($addacl)
$acl | Set-Acl $UserFolder
}
}
}

4. Отправка файлов


Папку send необходимо чистить ежедневно т.к. она очень быстро превратится в помойку. Мы перестраховались, ту папку что есть переносим на сервер резервных копий и создаем по новой папку.

Import-Module ActiveDirectory
$Groups=Get-ADGroup -Filter * -SearchBase "OU=Рабочие группы,DC=domain,DC=local" -Properties *|Select Name,Members #получаем список групп, нам нужно тольок её имя и список членов
foreach ($Group in $Groups) {
$CreateSendFolders="\\имя сервера\send\"+$Group.Name
$BackupFolderst=Get-Date -Format "yyyy.MM.dd HH-mm-ss"
$BackupFolderst2="\\Имя сервера резервных копий\e$\send\"+$Group.Name

Move-Item -Path $CreateSendFolders -Destination $BackupFolderst2"_"$BackupFolderst #Переносим папку, переименовав её, добавив в конец дату формирования копии
New-Item -Path $CreateSendFolders -ItemType "directory" #Создаем новую пустую папку

#Назначаем права
$aclSendFolders = Get-Acl $CreateSendFolders
$addaclSendFolders2 = New-Object System.Security.AccessControl.FileSystemAccessRule($Group.Name, "CreateDirectories,DeleteSubdirectoriesAndFiles,ExecuteFile,ListDirectory,ReadData,ReadExtendedAttributes,ReadPermissions", "Allow")
$aclSendFolders.AddAccessRule($addaclSendFolders2)
$addaclSendFolders = New-Object System.Security.AccessControl.FileSystemAccessRule($Group.Name, "CreateDirectories,DeleteSubdirectoriesAndFiles,ExecuteFile,ListDirectory,ReadData,ReadExtendedAttributes,ReadPermissions","ContainerInherit,ObjectInherit","InheritOnly", "Allow")
$aclSendFolders.AddAccessRule($addaclSendFolders)
$aclSendFolders | Set-Acl $CreateSendFolders

#Пользователям домена даем права на добавление файлов и просмотр структуры
$aclSendFoldersAll = Get-Acl $CreateSendFolders
$addaclSendFoldersAll = New-Object System.Security.AccessControl.FileSystemAccessRule("Пользователи домена", "CreateDirectories,CreateFiles,ListDirectory", "Allow")
$aclSendFoldersAll.AddAccessRule($addaclSendFoldersAll)
$aclSendFoldersAll | Set-Acl $CreateSendFolders
}

#Удаляем старый копии, старее одного месяца
$OldDate = (Get-Date).AddMonths(-1)
Get-ChildItem -Path  \\Имя сервера резервных копий\e$\send\ -Recurse | Where {$_.LastWriteTime -le "$OldDate"} | Remove-Item -Recurse

Всё, задача решена, теперь для экономии места включаем дедубликацию, т.к. пользователи очень любят хранить одинаковые файлы. И после окончательного переноса всех пользователей можно настраивать квоты в Диспетчере ресурсов файлового сервера. У нас были грабли тут, мы изначально поставили жесткие квоты на типы файлов, и при переносе пользовательской папки у нас вываливался алярм и приходилось вручную докопировать файлы. Лучше в начале поставить просто уведомление на почту.

В следующей стать расскажу как мы организовали дальше резервное копирование и с использованием дедубликации храним историю файлов.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.