'
' Copyright (c) Microsoft Corporation.  All rights reserved.
'
' VBScript Source File 
'
' Script Name: IIsBack.vbs
'

Option Explicit
On Error Resume Next

' Error codes
Const ERR_OK                         = 0
Const ERR_GENERAL_FAILURE            = 1

'''''''''''''''''''''
' Messages
Const L_SwitchNeedArg_ErrorMessage = "Не указан аргумент ключа."

Const L_Created_Text         = "Создан архив %1 версии %2."
Const L_Restored_Text        = "Восстановлен архив %1 версии %2."
Const L_Deleted_Text         = "Удален архив %1 версии %2."
Const L_BackupName_Text      = "Имя архива"
Const L_BackupVersion_Text   = "# версии"
Const L_DateTime_Text        = "Дата и время"

Const L_Error_ErrorMessage             = "Ошибка &H%1: %2"
Const L_OperationRequired_ErrorMessage = "Укажите операцию перед аргументами."
Const L_MinInfoNeeded_ErrorMessage     = "Требуется по крайней мере <имя_архива>."
Const L_NeedNameVersion_ErrorMessage   = "Требуется по крайней мере <имя_архива> и <версия_архива>."
Const L_NotEnoughParams_ErrorMessage   = "Недостаточно параметров."
Const L_OnlyOneOper_ErrorMessage       = "В каждый момент времени следует указывать только одну операцию."
Const L_ComputerObj_ErrorMessage       = "Не удается получить объект компьютера."
Const L_Backup_ErrorMessage            = "Не удается выполнить архивацию метабазы."
Const L_Restore_ErrorMessage           = "Не удается восстановить метабазу."
Const L_Delete_ErrorMessage            = "Не удается удалить архив метабазы."
Const L_List_ErrorMessage              = "Не удается перечислить архивы метабазы."
Const L_NoBackups_Message              = "Нет существующих архивов."
Const L_ScriptHelper_ErrorMessage      = "Не удается создать экземпляр"
Const L_ScriptHelperp2_ErrorMessage    = "объекта IIsScriptHelper."
Const L_ChkScpHelperReg_ErrorMessage   = "Зарегистрируйте компонент" 
Const L_ChkScpHelperRegp2_ErrorMessage = "Microsoft.IIsScriptHelper."
Const L_CmdLib_ErrorMessage            = "Не удается создать экземпляр объекта CmdLib."
Const L_ChkCmdLibReg_ErrorMessage      = "Зарегистрируйте компонент Microsoft.CmdLib."
Const L_PassWithoutUser_ErrorMessage   = "Перед использованием ключа /p укажите ключ /u."
Const L_WMIConnect_ErrorMessage        = "Не удается подключиться к поставщику данных WMI."
Const L_BackupNotFound_ErrorMessage    = "Архив не существует."
Const L_VersionTooBig_ErrorMessage     = "Слишком большой номер версии."
Const L_LastVersionTooBig_ErrorMessage = "Уже существует архив с этим именем и"
Const L_LastVersionTooBigp2_ErrorMessage="максимальным допустимым номером версии."
Const L_InvalidVersion_ErrorMessage    = "Недопустимый номер версии."
Const L_InvalidBackupName_ErrorMessage = "Недопустимое имя архива."
Const L_IncorrectPassword_ErrorMessage = "Указан неверный пароль."
Const L_BackupExists_ErrorMessage      = "Архив уже существует. Укажите другое имя" 
Const L_BackupExistsp2_ErrorMessage    = "или используйте параметр /overwrite."
Const L_InvalidSwitch_ErrorMessage     = "Недопустимый ключ: %1"
Const L_Admin_ErrorMessage             = "Невозможно выполнить эту команду, так как вы не являетесь"
Const L_Adminp2_ErrorMessage           = "администратором сервера, для которого выполняется настройка."

'''''''''''''''''''''
' Help
' General help messages
Const L_SeeHelp_Message          = "Для получения справки введите ''IIsBack /?''."
Const L_SeeBackupHelp_Message    = "Для получения справки введите ''IIsBack /backup /?''."
Const L_SeeRestoreHelp_Message   = "Для получения справки введите ''IIsBack /restore /?''."
Const L_SeeDeleteHelp_Message    = "Для получения справки введите ''IIsBack /delete /?''."
Const L_SeeListHelp_Message      = "Для получения справки введите ''IIsBack /list /?''."

Const L_Help_HELP_General01_Text   = "Описание. Архивация или восстановление конфигурации IIS, удаление архивов,"
Const L_Help_HELP_General01p2_Text = "          перечень всех архивов"
Const L_Help_HELP_General02_Text   = "Синтаксис: IIsBack [/s <сервер> [/u <пользователь>"
Const L_Help_HELP_General03_Text   = "           [/p <пароль>]]] /<операция> [аргументы]"
Const L_Help_HELP_General04_Text   = "Параметры:"
Const L_Help_HELP_General06_Text   = "Значение                Описание"
Const L_Help_HELP_General07_Text   = "/s <сервер>             Подключение к компьютеру <сервер>"
Const L_Help_HELP_General07p2_Text = "                        [По умолчанию: данный компьютер]"
Const L_Help_HELP_General08_Text   = "/u <пользователь>       Подключение с именем <домен>\<пользователь> или"
Const L_Help_HELP_General09_Text   = "                        <пользователь>. [По умолчанию: текущий пользователь]"
Const L_Help_HELP_General10_Text   = "/p <пароль>             Пароль для пользователя с именем <пользователь>"
Const L_Help_HELP_General11_Text   = "<операция>              /backup     Архивация сервера IIS"
Const L_Help_HELP_General12_Text   = "                                    (включая все данные узлов"
Const L_Help_HELP_General12p2_Text = "                                    и параметры настройки)."
Const L_Help_HELP_General13_Text   = "                        /restore    Восстановление сервера IIS"
Const L_Help_HELP_General14_Text   = "                                    по архиву (перезапись всех"
Const L_Help_HELP_General14p2_Text = "                                    данных узлов и параметров настройки)."
Const L_Help_HELP_General15_Text   = "                        /delete     Удаление архива."
Const L_Help_HELP_General16_Text   = "                        /list       Список всех архивов."
Const L_Help_HELP_General17_Text   = "Сведения об использовании:"
Const L_Help_HELP_General18_Text   = "IIsBack /backup /?"
Const L_Help_HELP_General19_Text   = "IIsBack /restore /?"
Const L_Help_HELP_General20_Text   = "IIsBack /delete /?"
Const L_Help_HELP_General21_Text   = "IIsBack /list /?"

' Common to all status change commands
Const L_Help_HELP_Common17_Text   = "/b <имя_архива>         Описание файла архива."
Const L_Help_HELP_Common17p1_Text = "                        [Default: ""SampleBackup""]"
Const L_Help_HELP_Common11_Text   = "Примеры:"

' Backup help messages
Const L_Help_HELP_Backup01_Text   = "Описание. Архивация сервера IIS (включая все данные узлы" 
Const L_Help_HELP_Backup01p2_Text = "          и параметры настройки)."
Const L_Help_HELP_Backup02_Text   = "Синтаксис: IIsBack [/s <сервер> [/u <пользователь> [/p <пароль>]]]"
Const L_Help_HELP_Backup02p1_Text = "           /backup [/b <имя_архива>] [/v <номер_версии>]"
Const L_Help_HELP_Backup02p2_Text = "           [/e <пароль_архива>] [/overwrite]"
Const L_Help_HELP_Backup18_Text   = "/v <номер_версии>       Номер версии, который назначается"
Const L_Help_HELP_Backup18p1_Text = "                        архиву. Может представлять собой любое"
Const L_Help_HELP_Backup18p2_Text = "                        целое число, HIGHEST_VERSION или"
Const L_Help_HELP_Backup18p3_Text = "                        NEXT_VERSION. [По умолчанию: NEXT_VERSION]"
Const L_Help_HELP_Backup19_Text   = "/e <пароль_архива>      Шифрование файла архива с"
Const L_Help_HELP_Backup19p2_Text = "                        помощью указанного пароля"
Const L_Help_HELP_Backup20_Text   = "/overwrite              Архивация, даже если архив с теми же"
Const L_Help_HELP_Backup20p1_Text = "                        именем и номером версии существует"
Const L_Help_HELP_Backup20p2_Text = "                        в указанном расположении; перезапись архива"
Const L_Help_HELP_Backup20p3_Text = "                        при необходимости. [По умолчанию: отключено]"
Const L_Help_HELP_Backup21_Text   = "IIsBack /backup"
Const L_Help_HELP_Backup22_Text   = "IIsBack /s Server1 /u Administrator /p p@ssW0rd /backup /b NewBackup"

' Restore help messages
Const L_Help_HELP_Restore01_Text   = "Описание. Восстановление сервера IIS из архива (перезапись"
Const L_Help_HELP_Restore01p1_Text = "             всех данных узлов и параметров настройки)."
Const L_Help_HELP_Restore02_Text   = "Синтаксис: IIsBack [/s <сервер> [/u <пользователь> [/p <пароль>]]]"
Const L_Help_HELP_Restore02p1_Text = "        /restore /b <имя_восстановл> [/v <номер_версии>]"
Const L_Help_HELP_Restore02p2_Text = "        [/e <пароль_архива>]"
Const L_Help_HELP_Restore18_Text   = "/v <номер_версии>       Номер версии, назначенный"
Const L_Help_HELP_Restore18p1_Text = "                        архиву.  Может представлять собой любое целое число или"
Const L_Help_HELP_Restore18p2_Text = "                        HIGHEST_VERSION."
Const L_Help_HELP_Restore19_Text   = "/e <пароль_архива>      Если архив был зашифрован с помощью"
Const L_Help_HELP_Restore19p1_Text = "                        пароля, заданного пользователем, следует"
Const L_Help_HELP_Restore19p2_Text = "                        указать правильный пароль для"
Const L_Help_HELP_Restore19p3_Text = "                        восстановления архива."
Const L_Help_HELP_Restore21_Text   = "IIsBack /restore /b MyBackup /v HIGHEST_VERSION"
Const L_Help_HELP_Restore22_Text   = "IIsBack /s Server1 /u Administrator /p p@ssW0rd /restore /b MyBackup /v 2"

' Delete help messages
Const L_Help_HELP_Delete01_Text   = "Описание. Удаление существующего файла архива."
Const L_Help_HELP_Delete02_Text   = "Синтаксис: IIsBack [/s <сервер> [/u <пользователь> [/p <пароль>]]]"
Const L_Help_HELP_Delete02p1_Text = "           /delete /b <имя_архива> /v <номер_версии>"
Const L_Help_HELP_Delete18_Text   = "/v <номер_версии>       Номер версии, которую требуется"
Const L_Help_HELP_Delete18p1_Text = "                        удалить.  Может представлять собой целое число или"
Const L_Help_HELP_Delete18p2_Text = "                        HIGHEST_VERSION."
Const L_Help_HELP_Delete19_Text   = "IIsBack /delete /b MyBackup /v HIGHEST_VERSION"
Const L_Help_HELP_Delete20_Text   = "IIsBack /s Server1 /u Administrator /p p@ssWOrd /delete /b MyBackup /v 2"

' List help messages
Const L_Help_HELP_List01_Text   = "Описание. Перечень всех файлов архива."
Const L_Help_HELP_List02_Text   = "Синтаксис: IIsBack [/s <сервер> [/u <пользователь> [/p <пароль>]]]"
Const L_Help_HELP_List02p2_Text = "        /list"
Const L_Help_HELP_List18_Text   = "IIsBack /list"
Const L_Help_HELP_List19_Text   = "IIsBack /s Server1 /u Administrator /p p@ssW0rd /list"


''''''''''''''''''''''''
' Operation codes
Const OPER_BACKUP   = 1
Const OPER_RESTORE  = 2
Const OPER_DELETE   = 3
Const OPER_LIST     = 4

' Backup/Restore contants
Const BACKUP_DEFAULT_NAME       = "SampleBackup"
Const MD_BACKUP_HIGHEST_VERSION = &HFFFFFFFE   ' Backup, Restore, Delete
Const MD_BACKUP_NEXT_VERSION    = &HFFFFFFFF   ' Backup
Const MD_BACKUP_OVERWRITE       = 1            ' Backup
Const MD_BACKUP_SAVE_FIRST      = 2            ' Backup
Const MD_BACKUP_MAX_VERSION     = 9999         ' Limit
Const MD_BACKUP_MAX_LEN         = 100          ' Limit
Const MD_BACKUP_NO_MORE_BACKUPS = &H80070103   ' EnumBackups

Const INVALID_VERSION           = -3

'
' Main block
'
Dim oScriptHelper, oCmdLib
Dim strServer, strUser, strPassword
Dim strName, strBackPassword
Dim intOperation, intResult, intVersion
Dim aArgs, arg
Dim bOverwrite
Dim strCmdLineOptions
Dim oError

' Default values
strServer = "."
strUser = ""
strPassword = ""
intOperation = 0
strName = BACKUP_DEFAULT_NAME
strBackPassword = ""
bOverwrite = False

' Instantiate the CmdLib for output string formatting
Set oCmdLib = CreateObject("Microsoft.CmdLib")
If Err.Number <> 0 Then
    WScript.Echo L_CmdLib_ErrorMessage
    WScript.Echo L_ChkCmdLibReg_ErrorMessage    
    WScript.Quit(ERR_GENERAL_FAILURE)
End If
Set oCmdLib.ScriptingHost = WScript.Application

' Instantiate script helper object
Set oScriptHelper = CreateObject("Microsoft.IIsScriptHelper")
If Err.Number <> 0 Then
    WScript.Echo L_ScriptHelper_ErrorMessage
    WScript.Echo L_ScriptHelperp2_ErrorMessage
    WScript.Echo L_ChkScpHelperReg_ErrorMessage    
    WScript.Echo L_ChkScpHelperRegp2_ErrorMessage    
    WScript.Quit(ERR_GENERAL_FAILURE)
End If

Set oScriptHelper.ScriptHost = WScript

' Check if we are being run with cscript.exe instead of wscript.exe
oScriptHelper.CheckScriptEngine

' Minimum number of parameters must exist
If WScript.Arguments.Count < 1 Then
    WScript.Echo L_NotEnoughParams_ErrorMessage
	WScript.Echo L_SeeHelp_Message
    WScript.Quit(ERR_GENERAL_FAILURE)
End If

strCmdLineOptions = "[server:s:1;user:u:1;password:p:1];[backup::0;overwrite::0];restore::0;" & _
                    "delete::0;list::0;backupname:b:1;version:v:1;bkpasswd:e:1"
Set oError = oScriptHelper.ParseCmdLineOptions(strCmdLineOptions)

If Not oError Is Nothing Then
    If oError.ErrorCode = oScriptHelper.ERROR_NOT_ENOUGH_ARGS Then
        ' Not enough arguments for a specified switch
        WScript.Echo L_NotEnoughParams_ErrorMessage
       	WScript.Echo L_SeeHelp_Message
    Else
        ' Invalid switch
        oCmdLib.vbPrintf L_InvalidSwitch_ErrorMessage, Array(oError.SwitchName)
      	WScript.Echo L_SeeHelp_Message
    End If
        
        WScript.Quit(ERR_GENERAL_FAILURE)
End If

If oScriptHelper.GlobalHelpRequested Then
    DisplayHelpMessage
    WScript.Quit(ERR_OK)
End If

For Each arg In oScriptHelper.Switches
    Select Case arg
        Case "server"
            ' Server information
            strServer = oScriptHelper.GetSwitch(arg)

        Case "user"
            ' User information
            strUser = oScriptHelper.GetSwitch(arg)

        Case "password"
            ' Password information
            strPassword = oScriptHelper.GetSwitch(arg)
        
        Case "backup"
            If (intOperation <> 0) Then
                WScript.Echo L_OnlyOneOper_ErrorMessage
                WScript.Echo L_SeeHelp_Message
                WScript.Quit(ERR_GENERAL_FAILURE)
            End If

            intOperation = OPER_BACKUP

           	If oScriptHelper.IsHelpRequested(arg) Then
            	DisplayBackupHelpMessage
            	WScript.Quit(ERR_OK)
            End If

            If oScriptHelper.Switches.Exists("backupname") Then
                strName = oScriptHelper.GetSwitch("backupname")
                If strName = "" Then
                    Err.Raise &H5
                End If
            Else
                strName = BACKUP_DEFAULT_NAME
            End If

            If oScriptHelper.Switches.Exists("version") Then
                intVersion = oScriptHelper.GetSwitch("version")
            Else
                intVersion = "NEXT_VERSION"
            End If

            strBackPassword = CStr(oScriptHelper.GetSwitch("bkpasswd"))
            If oScriptHelper.Switches.Exists("overwrite") Then
                bOverwrite = True
            End If
            
        Case "restore"
            If (intOperation <> 0) Then
                WScript.Echo L_OnlyOneOper_ErrorMessage
                WScript.Echo L_SeeHelp_Message
                WScript.Quit(ERR_GENERAL_FAILURE)
            End If
        
            intOperation = OPER_RESTORE

        	If oScriptHelper.IsHelpRequested(arg) Then
        		DisplayRestoreHelpMessage
        		WScript.Quit(ERR_OK)
        	End If

            strName = oScriptHelper.GetSwitch("backupname")
            If strName = "" Then
                WScript.Echo L_MinInfoNeeded_ErrorMessage
                WScript.Echo L_SeeRestoreHelp_Message
                WScript.Quit(ERR_GENERAL_FAILURE)
            End If

            If oScriptHelper.Switches.Exists("version") Then
                intVersion = oScriptHelper.GetSwitch("version")
            Else
                intVersion = "HIGHEST_VERSION"
            End If

            strBackPassword = CStr(oScriptHelper.GetSwitch("bkpasswd"))

        Case "delete"
            If (intOperation <> 0) Then
                WScript.Echo L_OnlyOneOper_ErrorMessage
                WScript.Echo L_SeeHelp_Message
                WScript.Quit(ERR_GENERAL_FAILURE)
            End If
        
            intOperation = OPER_DELETE

        	If oScriptHelper.IsHelpRequested(arg) Then
        		DisplayDeleteHelpMessage
        		WScript.Quit(ERR_OK)
        	End If

            strName = oScriptHelper.GetSwitch("backupname")
            If strName = "" Or Not oScriptHelper.Switches.Exists("version") Then
                WScript.Echo L_NeedNameVersion_ErrorMessage
                WScript.Echo L_SeeDeleteHelp_Message
                WScript.Quit(ERR_GENERAL_FAILURE)
            End If

            intVersion = oScriptHelper.GetSwitch("version")

        Case "list"
            If (intOperation <> 0) Then
                WScript.Echo L_OnlyOneOper_ErrorMessage
                WScript.Echo L_SeeHelp_Message
                WScript.Quit(ERR_GENERAL_FAILURE)
            End If
        
            intOperation = OPER_LIST

        	If oScriptHelper.IsHelpRequested(arg) Then
        		DisplayListHelpMessage
        		WScript.Quit(ERR_OK)
        	End If
    End Select
Next

' Check Parameters
If intOperation = 0 Then
    WScript.Echo L_OperationRequired_ErrorMessage
    WScript.Echo L_SeeHelp_Message
    WScript.Quit(ERR_GENERAL_FAILURE)
End If

' Validate backup name
ValidateBackupName strName
If Err.Number Then
    WScript.Echo L_InvalidBackupName_ErrorMessage
    WScript.Quit(Err.Number)
End If

' Validate version
intVersion = ValidateVersionNumber(intVersion)
If Err.Number Then
    Select Case Err.Number
        Case &H6
            WScript.Echo L_VersionTooBig_ErrorMessage

        Case &H5
            WScript.Echo L_InvalidVersion_ErrorMessage
    End Select
    
    WScript.Quit(Err.Number)
End If

' Check if /p is specified but /u isn't. In this case, we should bail out with an error
If oScriptHelper.Switches.Exists("password") And Not oScriptHelper.Switches.Exists("user") Then
    WScript.Echo L_PassWithoutUser_ErrorMessage
    WScript.Quit(ERR_GENERAL_FAILURE)
End If

' Check if /u is specified but /p isn't. In this case, we should ask for a password
If oScriptHelper.Switches.Exists("user") And Not oScriptHelper.Switches.Exists("password") Then
    strPassword = oCmdLib.GetPassword
End If

' Initializes authentication with remote machine
intResult = oScriptHelper.InitAuthentication(strServer, strUser, strPassword)
If intResult <> 0 Then
    WScript.Quit(intResult)
End If

' Choose operation
Select Case intOperation
    Case OPER_BACKUP
        intResult = BackupMetabase(strName, intVersion, strBackPassword, bOverwrite)
        
    Case OPER_RESTORE
        intResult = RestoreMetabase(strName, intVersion, strBackPassword)
    
	Case OPER_DELETE
		intResult = DeleteBackup(strName, intVersion)

	Case OPER_LIST
		intResult = ListBackups()
End Select

' Return value to command processor
WScript.Quit(intResult)

'''''''''''''''''''''''''
' End Of Main Block
'''''''''''''''''''''

'''''''''''''''''''''''''''
' DisplayHelpMessage
'''''''''''''''''''''''''''
Sub DisplayHelpMessage()
    WScript.Echo L_Help_HELP_General01_Text
    WScript.Echo L_Help_HELP_General01p2_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General02_Text
    WScript.Echo L_Help_HELP_General03_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General04_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General06_Text
    WScript.Echo L_Help_HELP_General07_Text
    WScript.Echo L_Help_HELP_General07p2_Text
    WScript.Echo L_Help_HELP_General08_Text
    WScript.Echo L_Help_HELP_General09_Text
    WScript.Echo L_Help_HELP_General10_Text
    WScript.Echo L_Help_HELP_General11_Text
    WScript.Echo L_Help_HELP_General12_Text
    WScript.Echo L_Help_HELP_General12p2_Text
    WScript.Echo L_Help_HELP_General13_Text
    WScript.Echo L_Help_HELP_General14_Text
    WScript.Echo L_Help_HELP_General14p2_Text
    WScript.Echo L_Help_HELP_General15_Text
    WScript.Echo L_Help_HELP_General16_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General17_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General18_Text
    WScript.Echo L_Help_HELP_General19_Text
    WScript.Echo L_Help_HELP_General20_Text
    WScript.Echo L_Help_HELP_General21_Text
End Sub

Sub DisplayBackupHelpMessage()
    WScript.Echo L_Help_HELP_Backup01_Text
    WScript.Echo L_Help_HELP_Backup01p2_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Backup02_Text
    WScript.Echo L_Help_HELP_Backup02p1_Text
    WScript.Echo L_Help_HELP_Backup02p2_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General04_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General06_Text
    WScript.Echo L_Help_HELP_General07_Text
    WScript.Echo L_Help_HELP_General07p2_Text
    WScript.Echo L_Help_HELP_General08_Text
    WScript.Echo L_Help_HELP_General09_Text
    WScript.Echo L_Help_HELP_General10_Text
    WScript.Echo L_Help_HELP_Common17_Text
    WScript.Echo L_Help_HELP_Common17p1_Text
    WScript.Echo L_Help_HELP_Backup18_Text
    WScript.Echo L_Help_HELP_Backup18p1_Text
    WScript.Echo L_Help_HELP_Backup18p2_Text
    WScript.Echo L_Help_HELP_Backup18p3_Text
    WScript.Echo L_Help_HELP_Backup19_Text
    WScript.Echo L_Help_HELP_Backup19p2_Text
    WScript.Echo L_Help_HELP_Backup20_Text
    WScript.Echo L_Help_HELP_Backup20p1_Text
    WScript.Echo L_Help_HELP_Backup20p2_Text
    WScript.Echo L_Help_HELP_Backup20p3_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Common11_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Backup21_Text
    WScript.Echo L_Help_HELP_Backup22_Text
End Sub

Sub DisplayRestoreHelpMessage()
    WScript.Echo L_Help_HELP_Restore01_Text
    WScript.Echo L_Help_HELP_Restore01p1_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Restore02_Text
    WScript.Echo L_Help_HELP_Restore02p1_Text
    WScript.Echo L_Help_HELP_Restore02p2_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General04_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General06_Text
    WScript.Echo L_Help_HELP_General07_Text
    WScript.Echo L_Help_HELP_General07p2_Text
    WScript.Echo L_Help_HELP_General08_Text
    WScript.Echo L_Help_HELP_General09_Text
    WScript.Echo L_Help_HELP_General10_Text
    WScript.Echo L_Help_HELP_Common17_Text
    WScript.Echo L_Help_HELP_Common17p1_Text
    WScript.Echo L_Help_HELP_Restore18_Text
    WScript.Echo L_Help_HELP_Restore18p1_Text
    WScript.Echo L_Help_HELP_Restore18p2_Text
    WScript.Echo L_Help_HELP_Restore19_Text
    WScript.Echo L_Help_HELP_Restore19p1_Text
    WScript.Echo L_Help_HELP_Restore19p2_Text
    WScript.Echo L_Help_HELP_Restore19p3_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Common11_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Restore21_Text
    WScript.Echo L_Help_HELP_Restore22_Text
End Sub

Sub DisplayDeleteHelpMessage()
    WScript.Echo L_Help_HELP_Delete01_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Delete02_Text
    WScript.Echo L_Help_HELP_Delete02p1_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General04_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General06_Text
    WScript.Echo L_Help_HELP_General07_Text
    WScript.Echo L_Help_HELP_General07p2_Text
    WScript.Echo L_Help_HELP_General08_Text
    WScript.Echo L_Help_HELP_General09_Text
    WScript.Echo L_Help_HELP_General10_Text
    WScript.Echo L_Help_HELP_Common17_Text
    WScript.Echo L_Help_HELP_Common17p1_Text
    WScript.Echo L_Help_HELP_Delete18_Text
    WScript.Echo L_Help_HELP_Delete18p1_Text
    WScript.Echo L_Help_HELP_Delete18p2_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Common11_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Delete19_Text
    WScript.Echo L_Help_HELP_Delete20_Text
End Sub

Sub DisplayListHelpMessage()
    WScript.Echo L_Help_HELP_List01_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_List02_Text
    WScript.Echo L_Help_HELP_List02p2_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General04_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_General06_Text
    WScript.Echo L_Help_HELP_General07_Text
    WScript.Echo L_Help_HELP_General07p2_Text
    WScript.Echo L_Help_HELP_General08_Text
    WScript.Echo L_Help_HELP_General09_Text
    WScript.Echo L_Help_HELP_General10_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_Common11_Text
    WScript.Echo 
    WScript.Echo L_Help_HELP_List18_Text
    WScript.Echo L_Help_HELP_List19_Text
End Sub


'''''''''''''''''''''''''''
' BackupMetabase
'''''''''''''''''''''''''''
Function BackupMetabase(strName, intVersion, strBackPassword, bOverwrite)
    Dim ComputerObj
    Dim intFlags
    Dim strVersion
    
    On Error Resume Next
    
    oScriptHelper.WMIConnect
    If Err Then
        WScript.Echo L_WMIConnect_ErrorMessage
        oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
        BackupMetabase = Err.Number
        Exit Function
    End If

    ' Grab the computer object
    Set ComputerObj = oScriptHelper.ProviderObj.Get("IIsComputer='LM'")
    If Err.Number Then
        Select Case Err.Number
            Case &H80070005
                WScript.Echo L_Admin_ErrorMessage
                WScript.Echo L_Adminp2_ErrorMessage
            Case Else
                WScript.Echo L_ComputerObj_ErrorMessage
                oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
            End Select

        BackupMetabase = Err.Number
        Exit Function
    End If
    
    ' Build backup flags
    intFlags = MD_BACKUP_SAVE_FIRST
    If bOverwrite Then
        intFlags = intFlags Or MD_BACKUP_OVERWRITE
    End If
    
    ' Call Backup method
    ComputerObj.BackupWithPassword strName, intVersion, intFlags, strBackPassword
    If Err.Number Then
        Select Case Err.Number
            Case &H8007007B
                WScript.Echo L_LastVersionTooBig_ErrorMessage
                WScript.Echo L_LastVersionTooBigp2_ErrorMessage
                 
            Case &H80070002
                WScript.Echo L_BackupNotFound_ErrorMessage
                
            Case &H80070050
                WScript.Echo L_BackupExists_ErrorMessage
                WScript.Echo L_BackupExistsp2_ErrorMessage
            
            Case Else
                WScript.Echo L_Backup_ErrorMessage
                WScript.Echo Err.Description
        End Select
        
        BackupMetabase = Err.Number
        Exit Function
    End If

    ' Pretty print
    If (intVersion = MD_BACKUP_NEXT_VERSION) Then
        strVersion = "NEXT_VERSION"
    Else
        If (intVersion = MD_BACKUP_HIGHEST_VERSION) Then
            strVersion = "HIGHEST_VERSION"
        Else
            strVersion = CStr(intVersion)
        End If
    End If
    
    oCmdLib.vbPrintf L_Created_Text, Array(strName, strVersion)
    
    ' Release object
    Set ComputerObj = Nothing
    
    BackupMetabase = 0
End Function


'''''''''''''''''''''''''''
' RestoreMetabase
'''''''''''''''''''''''''''
Function RestoreMetabase(strName, intVersion, strBackPassword)
    Dim ComputerObj
    Dim strVersion
    
    On Error Resume Next

    oScriptHelper.WMIConnect
    If Err Then
        WScript.Echo L_WMIConnect_ErrorMessage
        oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
        RestoreMetabase = Err.Number
        Exit Function
    End If

    ' Grab the computer object
    Set ComputerObj = oScriptHelper.ProviderObj.Get("IIsComputer='LM'")
    If Err.Number Then
        Select Case Err.Number
            Case &H80070005
                WScript.Echo L_Admin_ErrorMessage
                WScript.Echo L_Adminp2_ErrorMessage
            Case Else
                WScript.Echo L_ComputerObj_ErrorMessage
                oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
            End Select

        RestoreMetabase = Err.Number
        Exit Function
    End If
    
    ' Call Restore method
    ComputerObj.RestoreWithPassword strName, intVersion, 0, strBackPassword
    If Err.Number Then
        Select Case Err.Number
            Case &H80070057
                WScript.Echo L_BackupNotFound_ErrorMessage

            Case &H8007052B
                WScript.Echo L_IncorrectPassword_ErrorMessage

            Case Else
                WScript.Echo L_Restore_ErrorMessage
                oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
        End Select
        
        RestoreMetabase = Err.Number
        Exit Function
    End If

    ' Pretty print
    If (intVersion = MD_BACKUP_NEXT_VERSION) Then
        strVersion = "NEXT_VERSION"
    Else
        If (intVersion = MD_BACKUP_HIGHEST_VERSION) Then
            strVersion = "HIGHEST_VERSION"
        Else
            strVersion = CStr(intVersion)
        End If
    End If

    oCmdLib.vbPrintf L_Restored_Text, Array(strName, strVersion)
    
    ' Release object
    Set ComputerObj = Nothing
    
    RestoreMetabase = 0
End Function


'''''''''''''''''''''''''''
' DeleteBackup
'''''''''''''''''''''''''''
Function DeleteBackup(strName, intVersion)
    Dim ComputerObj
    Dim strVersion
    
    On Error Resume Next

    oScriptHelper.WMIConnect
    If Err Then
        WScript.Echo L_WMIConnect_ErrorMessage
        oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
        DeleteMetabase = Err.Number
        Exit Function
    End If

    ' Grab the computer object
    Set ComputerObj = oScriptHelper.ProviderObj.Get("IIsComputer='LM'")
    If Err.Number Then
        Select Case Err.Number
            Case &H80070005
                WScript.Echo L_Admin_ErrorMessage
                WScript.Echo L_Adminp2_ErrorMessage
            Case Else
                WScript.Echo L_ComputerObj_ErrorMessage
                oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
            End Select

        DeleteBackup = Err.Number
        Exit Function
    End If
    
    ' Call Delete method
    ComputerObj.DeleteBackup strName, intVersion
    If Err Then
        WScript.Echo L_Delete_ErrorMessage
        Select Case Err.Number
            Case &H80070002
                WScript.Echo L_BackupNotFound_ErrorMessage

            Case &H8007052B
                WScript.Echo L_IncorrectPassword_ErrorMessage

            Case Else
                WScript.Echo Err.Description
        End Select
        DeleteBackup = Err.Number
        Exit Function
    End If

    ' Pretty print
    If (intVersion = MD_BACKUP_NEXT_VERSION) Then
        strVersion = "NEXT_VERSION"
    Else
        If (intVersion = MD_BACKUP_HIGHEST_VERSION) Then
            strVersion = "HIGHEST_VERSION"
        Else
            strVersion = CStr(intVersion)
        End If
    End If

    oCmdLib.vbPrintf L_Deleted_Text, Array(strName, strVersion)
    
    ' Release object
    Set ComputerObj = Nothing
    
    DeleteBackup = 0
End Function


'''''''''''''''''''''''''''
' ListBackups
'''''''''''''''''''''''''''
Function ListBackups()
    Dim ComputerObj
    Dim strName, strVersion, strDateTime, strFmtDateTime
    Dim dtDate, dtTime
    Dim intIndex
    Dim firstLen, verLen
    
    On Error Resume Next

    oScriptHelper.WMIConnect
    If Err.Number Then
        WScript.Echo L_WMIConnect_ErrorMessage
        oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
        ListBackups = Err.Number
        Exit Function
    End If

    ' Grab the computer object
    Set ComputerObj = oScriptHelper.ProviderObj.Get("IIsComputer='LM'")
    If Err.Number Then
        Select Case Err.Number
            Case &H80070005
                WScript.Echo L_Admin_ErrorMessage
                WScript.Echo L_Adminp2_ErrorMessage
            Case Else
                WScript.Echo L_ComputerObj_ErrorMessage
                oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
            End Select

        ListBackups = Err.Number
        Exit Function
    End If
    
    intIndex = 0
    Do While True
        ' Call EnumBackups method
        strName = ""
        computerObj.EnumBackups strName, intIndex, strVersion, strDateTime
        If (Err.Number <> 0) Then
            If (Err.Number = MD_BACKUP_NO_MORE_BACKUPS) Then
                Exit Do
            End If
            
            WScript.Echo L_List_ErrorMessage
            oCmdLib.vbPrintf L_Error_ErrorMessage, Array(Hex(Err.Number), Err.Description)
            Set computerObj = Nothing
            ListBackups = ERR_GENERAL_FAILURE
            Exit Function
        End If
        
        If intIndex = 0 Then
            WScript.Echo L_BackupName_Text & Space(35 - Len(L_BackupName_Text)) & L_BackupVersion_Text & _
                Space(15 - Len(L_BackupVersion_Text)) & L_DateTime_Text
            WScript.Echo "========================================================================"
        End If
        
        ' Format DateTime
        dtDate = DateSerial(Mid(strDateTime, 1, 4), Mid(strDateTime, 5, 2), Mid(strDateTime, 7, 2))
        dtTime = TimeSerial(Mid(strDateTime, 9, 2), Mid(strDateTime, 11, 2), Mid(strDateTime, 13, 2))
        strFmtDateTime = FormatDateTime(dtDate) & " " & FormatDateTime(dtTime, vbLongTime)
        
        verLen = 15 - Len(strVersion)
        firstLen = 35 - Len(strName)
        If (firstLen < 1) Then
            firstLen = 1
            verLen = 1
        End If

        WScript.Echo strName & Space(firstLen) & strVersion & Space(verLen) & strFmtDateTime
        
        intIndex = intIndex + 1
    Loop

    ' Print message in case we don't have any backups to list
    If intIndex = 0 Then
        WScript.Echo L_NoBackups_Message
    End If

    ' Release object
    Set ComputerObj = Nothing
    
    ListBackups = 0
End Function


''''''''''''''''''''''''''''''''''''
' Helper Functions
'''''''''''''''''''''''''''
Function ValidateVersionNumber(Version)
    If IsNumeric(Version) Then
        Version = CInt(Version)
        
        If Version > MD_BACKUP_MAX_VERSION Then
            Err.Raise &H6
        End If
        
        If Version < 0 Then
            Err.Raise &H5
        End If
        
        ValidateVersionNumber = Version
    Else
        Select Case Version
            Case "HIGHEST_VERSION"
                ValidateVersionNumber = MD_BACKUP_HIGHEST_VERSION
                
            Case "NEXT_VERSION"
                ValidateVersionNumber = MD_BACKUP_NEXT_VERSION
                
            Case Else
                Err.Raise &H5
        End Select
    End If
End Function

Sub ValidateBackupName(strName)
    Dim i
    
    For i = 1 to Len(strName)
        If AscW(Mid(strName, i, 1)) >= 33 And AscW(Mid(strName, i, 1)) <= 47 Or _
           AscW(Mid(strName, i, 1)) >= 58 And AscW(Mid(strName, i, 1)) <= 64 Then
            
            Err.Raise &H5
        End If
    Next
End Sub
