Начиная с Windows Server 2008, powershell настолько плотно входит в сферу администрирования серверов Windows (а также других продуктов Microsoft), что незнание этой оболочки автоматом возводит системного администратора в разряд дилетантов. К стыду своему, вынужден признаться, что до последнего времени имел об этом средстве автоматизации самое поверхностное представление. Хотя, меня несколько оправдывает факт, что непосредственно администрированием я не занимался уже несколько лет (примерно с тех пор как появился powershell). На новом месте работы, однако, навык его использования крайне полезен (если не необходим), так что осваиваю. И первой задачей, которую довелось решать — миграция файлового сервера.
Подробно о миграции написано на Microsoft Technet. Однако там много информации, я выдернул оттуда наиболее типовой вариант — миграция с одного сервера на другой сервер, не осложнённая технологиями и фичами типа DFS, BrunchCache и автономными файлами, и упорядочил его до нескольких скриптов.
Итак, исходные данные:
2 сервера Windows 2008 R2 ENU — исходный и сервер назначения.
Время на обоих синхронизировано, открыт 7000 порт (TCP/UDP) на файрволе (или он отключен).
Разрешён запуск скриптов powershell ( Set-ExecutionPolicy Unrestricted -Force )
Исходный сервер:
скрипт FSMig-Prep.ps1 (подготовка — установка средств миграции, подключение надстройки)
Import-Module ServerManager Add-WindowsFeature Migration Add-PSSnapin Microsoft.Windows.ServerManager.Migration
скрипт FSMig-UGExport.ps1 (экспорт локальных пользователей и групп. Нужно передать в виде параметров локальный путь и пароль. Например FSMig-UGExport.ps1 c:\change Password1)
# $folder - папка, в которую выкладываются экспортные данные; $pass - пароль для шифрования этих данных Param($folder,$pass) # Создаём папку назначения. Md $folder # Расшариваем её для всех - чтение. "&" в начале, т.к. NET - не коммандлет powershell, а внешняя команда. &net share Change=$folder /GRANT:Everyone`,Read # Пароль надо преобразовать в шифрованную строку, для чего используюм переменную $SecStr. На неё впоследствии ссылается и следующий скрипт $SecStr = ConvertTo-SecureString -AsPlainText -Force -String $pass #Экспорт пользователей и групп. Отключенные пользователи (disabled) экспортированы не будут. Чтобы экспортировать всех, надо указать All вместо Enabled. Export-SmigServerSetting -User Enabled -Group -Path $folder -Password $SecStr -Verbose
Скрипт FSMig-Send.ps1 (отправка данных. Нужно передать в виде параметров локальный путь, сервер назначения и локальный путь на сервере назначения.)
# $source - исходная директория файл-сервера # $comp - имя сервера назначения # $dest - путь на сервере назначения, куда сложить Param($source,$comp,$dest) Send-SmigServerData -Include All -ComputerName $comp -SourcePath $source -DestinationPath $dest -Recurse -Password $SecStr
Сервер назначения:
скрипт FSMig-Prep.ps1 (подготовка — установка средств миграции, подключение надстройки)
Import-Module ServerManager Add-WindowsFeature Migration Add-PSSnapin Microsoft.Windows.ServerManager.Migration
скрипт FSMig-Dest.ps1 (Импорт локальных пользователей и групп исходного сервера, приём данных ФС. Нужно указать UNC-путь к папке с экспортированными данными о пользователях и пароль, которым они шифровались)
# $source_ex - UNC путь к директории, в которой лежат экспортированные данные о пользователях и группах; # $pass - пароль для шифрования этих данных (должен совпадать) Param($source_ex,$pass) &Net Use g: $source_ex $SecStr = ConvertTo-SecureString -AsPlainText -Force -String $pass Import-SmigServerSetting -User All -Group -Path G:\ -Password $SecStr -Verbose Receive-SmigServerData -Password $SecStr
Засим всё. Два нюанса:
1. Локальные пользователи после переезда становятся заблокированными и получают опцию «требовать смену пароля». Думаю, что и пароль теряют. Однако, для доменной среды это не должно представлять проблемы.
2. Промежуток между запусками скриптов на исходном и целевом серверах (между отправкой и приёмом данных) должен быть меньше 5 минут. ПРичём можно сначала приём на целевом запустить, а потом отправку на исходном.