Недавно у меня на работе начался процесс переорганизации существующих виртуальных машин, в следствии чего, роли этих машин нужно перемещать, сокращать и добавлять. Эта участь постигла и наш маленький бухгалтерский сервер где тихо-мирно крутился сервер бухгалтерской софтинки M.E.Doc. потребовалось перенести эту софтинку на другую виртуалку. Процесс этот у меня разделился на несколько этапов:
- Обновляем существующий сервер до последней версии (дабы позднее переносить данные между одинаковыми версиями Медка)
- Делаем резервную копию данных предприятия
- Устанавливаем сервер на новую машинку и обновляем его снова таки до последней версии.
- Заходим в Медок локально (с той машины на которую установили новый сервер) и восстанавливаем предприятие с Резервной Копии, можно пойти попить чай ибо восстанавливается очень долго, дольше чем делался бэкап.
- UPD 2013-10-18 Как оказалось бэкап не переносит пользователей, поэтому мне пришлось их создавать руками, если у кого есть более интересная идея как перенести пользователей - пишите в комментариях.
- Самая интересная часть - изменить настройки всех клиентов (у меня их было около 10), чтобы они подключались уже к новому серверу. Тех Саппорт рекомендовал в тупую переставить Клиентскую Часть на всех машинах, но мы не ищем легких путей. Экспериментально было установлено что на выбор сервер для подключения влияют настройки из файла %ProgramData%\Medoc\station.exe.config Это XML документ ближе к концу которого можно увидеть прописанный сервер и порт для подключения. Далее дело техники поменять эти настройки на всех клиентах, например при помощи GPO. Мне оказалось проще всего сделать это выполнив скрипт при входе пользователя. Скрипт прилагается.
' MEDoc Switcher v0.3 2013-10-18' ' Программа переключает настройки клиента MEDoc на другой сервер ' ' в программе используется разбор XML файла ' Option Explicit Dim strServer, strMEDocPath ' Управляющие параметры не менять' Const CONFIG_STATION = "station.exe.config" ' Файлы конфигурации' Const CONFIG_EZVIT = "ezvit.exe.config" Const MEDOC_DISPLAY_NAME = "m.e.doc.station" ' Имя МЕДка в списке установленных программ' 'Const strServer = GetArgument() strMEDocPath = GetMEDocPath(MEDOC_DISPLAY_NAME) WScript.Echo strMEDocPath If strMEDocPath = "" Then WScript.Echo "ERROR. Cannot find M.E.Doc. Probably M.E.Doc is not installed on your system" WScript.Quit(1) End If ModifyConfig strMEDocPath & "\" & CONFIG_STATION,strServer ModifyConfig strMEDocPath & "\TEMP\" & CONFIG_STATION,strServer ModifyConfig strMEDocPath & "\" & CONFIG_EZVIT,strServer WScript.Echo "OK. Адрес сервера изменён на: " & strServer WScript.Quit(0) Function GetArgument() If WScript.Arguments.Count < 1 Then WScript.Echo "ERROR. Parameter missing. Example:" WScript.Echo "C:\MEDocSwitch.vbs SERVER:PORT" WScript.Quit (1) Else GetArgument = WScript.Arguments(0) End If End Function Function ModifyConfig(strPath, strServer) Dim objXMLDoc, objNodeList Set objXMLDoc = CreateObject("Msxml2.DOMDocument") objXMLDoc.Load(strPath) If(len(objXMLDoc.Text) = 0) Then WScript.Echo "ERROR. Cannot read config file." WScript.Quit (1) End If Set objNodeList = objXMLDoc.SelectSingleNode("//setting[@name='RemoteServer']/value") objNodeList.Text = strServer objXMLDoc.Save(strPath) End Function Function GetMEDocPath(strSoftName) ' Внутренни параметры' Const strCOMPUTER = "." Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE 'Const strREGKEY32 = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" Const strREGKEY64 = "SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall\" Const strNAME = "DisplayName" Const strPATH = "InstallLocation" Dim objReg, arrSubKeys, strSubKey, strValue1, intRet1 Set objReg = GetObject("winmgmts://" & strCOMPUTER & "/root/default:StdRegProv") intRet1 = objReg.EnumKey (HKLM, strREGKEY64, arrSubKeys) If intRet1 <> 0 Then WScript.Echo "Can not read data from Registry" WScript.Quit(1) End If 'WScript.Echo UBound(arrSubkeys) For Each strSubKey In arrSubkeys intRet1 = objReg.GetStringValue(HKLM, strREGKEY64 & strSubKey, strNAME, strValue1) If strValue1 = strSoftName Then intRet1 = objReg.GetStringValue(HKLM, strREGKEY64 & strSubKey, strPATH, strValue1) GetMEDocPath = strValue1 Exit Function End If Next GetMEDocPath = "" End Function
Немає коментарів:
Дописати коментар