четвер, 17 жовтня 2013 р.

0x02 Миграция M.E.Doc (Сетевая версия)

Недавно у меня на работе начался процесс переорганизации существующих виртуальных машин, в следствии чего, роли этих машин нужно перемещать, сокращать и добавлять. Эта участь постигла и наш маленький бухгалтерский сервер где тихо-мирно крутился сервер бухгалтерской софтинки M.E.Doc. потребовалось перенести эту софтинку на другую виртуалку. Процесс этот у меня разделился на несколько этапов:

  1. Обновляем существующий сервер до последней версии (дабы позднее переносить данные между одинаковыми версиями Медка)
  2. Делаем резервную копию данных предприятия
  3. Устанавливаем сервер на новую машинку и обновляем его снова таки до последней версии.
  4. Заходим в Медок локально (с той машины на которую установили новый сервер) и восстанавливаем предприятие с Резервной Копии, можно пойти попить чай ибо восстанавливается очень долго, дольше чем делался бэкап.
  5. UPD 2013-10-18 Как оказалось бэкап не переносит пользователей, поэтому мне пришлось их создавать руками, если у кого есть более интересная  идея как перенести пользователей - пишите в комментариях.
  6. Самая интересная часть - изменить настройки всех клиентов (у меня их было около 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

Немає коментарів:

Дописати коментар