David A. Stewart brings us File_Server_Fail-over.cmd, which contains:
REM Purpose: and Bring the Backup System Online impersonating the Primary REM Operating System @ECHO OFF REM ****************************************************************** REM Name: File_Server_Fail-over.cmd REM Author: David A. Stewart [email protected] REM Purpose: To Replicate File Service Configuration to a Back-up File Server REM Purpose: and Bring the Backup System Online impersonating the Primary REM Operating System: NT4 and Above REM Dependencies: NOW.EXE from the W2K Reskit REM Dependencies: CHOICE.EXE from the W2K Reskit REM Dependencies: REGDMP.EXE from the W2K Reskit REM Dependencies: REGINI.EXE from the W2K Reskit REM Dependencies: REM Version: 2.22 REM Creation Date: 5-27-2003 REM Last Modified: 8-11-2003 REM Additional Information: REM REM REM ****************************************************************** @TITLE File Server Fail-over Script GOTO START REM This is Organizational Workspace REM End of Organizational Workspace :START SETLOCAL REM CScript //H:CScript :Set_Variables SET SourceServerName= SET FailoverServerName= SET Chronstamp= SET OSType= SET VER= SET RunFunction= SET OnlineState= SET SourceServerIP= SET CURRENTPATH= SET ShareLogFile= SET ActionLogFile= SET FailoverServerName= SET REPLICATE_VARIABLE= SET RegDmpState= SET RegIniState= SET Quit= SET RunAs=x :LOGIC_SECTION :TEST OS Type IF NOT "%OS%"
"Microsoft Windows 2000 \[Version 5.00.2195\]" SET OSType=W2K IF "%VER%"
2 GOTO START_TIME_AND_DATE SET RunAs=1 ECHO. ECHO. ECHO Enter the new account you want to "Run As" SET /P NewDomain=Local Machine or Domain Name of the account: SET /P NewName=Account Name: ECHO. :START_TIME_AND_DATE FOR /F "Tokens=1*" %%f IN ('TIME /T') DO ( FOR /F "Delims=: Tokens=1-2" %%y in ('ECHO %%f') DO SET StartTime=%%y-%%z ) FOR /F "Tokens=1,2*" %%f IN ('DATE /T') DO ( FOR /F "Tokens=1-3 Delims=/" %%x IN ('ECHO %%g') DO SET StartDate=%%x-%%y-%%z ) CALL :CHRONSTAMP GOTO DESIRED_FUNCTION_QUESTION :CHRONSTAMP FOR /F "Tokens=1-5" %%a IN ('NOW.EXE') DO SET Chronstamp=%%a_%%b_%%c_%%d_%%e FOR /F "Delims=: Tokens=1-3" %%a IN ('ECHO %Chronstamp%') DO SET Chronstamp=%%a_%%b_%%c FOR /F "Delims=_ Tokens=1-7" %%a IN ('ECHO %Chronstamp%') DO SET Chronstamp=%%b_%%c_%%g____%%d_%%e_%%f GOTO :EOF :DESIRED_FUNCTION_QUESTION FOR /F "Tokens=*" %%a IN ('CD') DO SET CURRENTPATH=%%a IF NOT EXIST "%CURRENTPATH%\log_files\." MD "log_files" SET ActionLogFile="%CURRENTPATH%\log_files\Action_log_file____%Chronstamp%.txt" IF NOT EXIST %ActionLogFile% ECHO Created %StartDate% at %StartTime%>%ActionLogFile% CALL :WINDOWHEADER TIME /T>NUL ECHO Do you: ECHO. ECHO 1. Want to CAPTURE file share configuration from a server to a RECOVERY FILE? ECHO. ECHO 2. Perform a RESTORE to a Fail-over server from a Recovery File? ECHO. ECHO 3. REPLICATE shares to a Fail-over Server? ECHO. ECHO 4. Quit? ECHO. CHOICE /C:1234 "Pick " IF %ERRORLEVEL%
1 SET RunFunction=capture IF %ERRORLEVEL%
2 SET RunFunction=restore IF %ERRORLEVEL%
3 SET RunFunction=replicate IF %ERRORLEVEL%
4 GOTO :EOF IF "%RunFunction%"
"capture" GOTO CAPTURE_FILE_SERVER_INFO IF "%RunFunction%"
"restore" GOTO RESTORE_FILE_SERVER_INFO IF "%RunFunction%"
"%COMPUTERNAME%" GOTO END_WARNING_NOTICE :WARNING_NOTICE CLS CALL :WINDOWHEADER ECHO WARNING: Running this script from a local drive on the source server ECHO will prevent access to the capture file in the event of failure ECHO of the storage system on the source server. ECHO. ECHO. ECHO Do you: ECHO. ECHO 1. Want to continue? ECHO. ECHO 2. Quit? ECHO. CHOICE /C:12 "Pick " IF %ERRORLEVEL%
1 GOTO END_WARNING_NOTICE IF %ERRORLEVEL%
2 SET Quit=1 :END_WARNING_NOTICE IF "%Quit%"
" bytes" SET OnlineState=ONLINE ) IF "%OnlineState%"
"1" ECHO %Chronstamp% User is running under the security context of %NewDomain%\%NewName%>>%ActionLogFile% IF NOT "%RunAs%"
"ONLINE" ECHO The server %SourceServerName% is Unreachable, Quitting. &GOTO :DESIRED_FUNCTION_QUESTION REM Find Source Server's Primary IP Address FOR /F "Delims=\[\] Tokens=2 Skip=1" %%a IN ('PING -n 1 %SourceServerName%') DO SET SourceServerIP=%%a ECHO The IP for %SourceServerName% is %SourceServerIP% ECHO. ECHO %Chronstamp% The IP for %SourceServerName% is %SourceServerIP%>>%ActionLogFile% CALL :CHRONSTAMP IF NOT EXIST "%CURRENTPATH%\recovery_files\." MD "recovery_files" &ECHO %Chronstamp% Created missing recovery_files directory>>%ActionLogFile% SET ShareLogFile="%CURRENTPATH%\recovery_files\%SourceServerName%_ShareList_%Chronstamp%.TXT" REM ECHO ShareLogFile=%ShareLogFile% ECHO %Chronstamp% ShareLogFile=%ShareLogFile%>>%ActionLogFile% ECHO. ECHO Processing, Please wait.... ECHO. ECHO %Chronstamp% Begining configuration collection>>%ActionLogFile% REM Write the source servers configuration to a configuration capture file using the REGDMP.EXE command. SET RegDmpState=x IF "%RunAs%"
"1" GOTO REGDMP_RUNAS IF /I NOT "%SourceServerName%"
"%COMPUTERNAME%" GOTO REGDMP_REMOTE REGDMP.EXE "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares">%ShareLogFile% SET RegDmpState=%ERRORLEVEL% GOTO REGDMP_END :REGDMP_REMOTE REGDMP.EXE -m \\%SourceServerName% "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares">%ShareLogFile% SET RegDmpState=%ERRORLEVEL% :REGDMP_END CALL :CHRONSTAMP IF NOT "%RegDmpState%"
"0" ECHO Capture completed successfully.&ECHO %Chronstamp% Capture completed successfully.>>%ActionLogFile% GOTO BOTTOM :REGDMP_RUNAS ECHO @ECHO OFF>RUNASBAT.BAT ECHO SET RegDmpState=X>>RUNASBAT.BAT ECHO IF /I NOT "%%SourceServerName%%"
"0" ECHO There was a problem with the capture. Verify that you have proper access and permissions to perform a remote registry read on the target server.^&ECHO %%Chronstamp%% There was a problem with the capture. Verify that you have proper access and permissions to perform a remote registry read on the target server.^>^>%ActionLogFile% ^&DEL %ShareLogFile%>>RUNASBAT.BAT ECHO IF "%%RegDmpState%%"
" bytes" SET OnlineState=ONLINE ) IF "%OnlineState%"
"ONLINE" ECHO %FailoverServerName% is %OnlineState% CALL :CHRONSTAMP IF "%RunAs%"
"1" ECHO %Chronstamp% User is running under the security context of %NewDomain%\%NewName%>>%ActionLogFile% IF NOT "%RunAs%"
"ONLINE" ECHO The server %FailoverServerName% is Unreachable, Quitting. &GOTO :DESIRED_FUNCTION_QUESTION REM Find Restore Server's Primary IP Address FOR /F "Delims=\[\] Tokens=2 Skip=1" %%a IN ('PING -n 1 %FailoverServerName%') DO SET RestoreServerIP=%%a ECHO The IP for %FailoverServerName% is %RestoreServerIP% ECHO. CALL :CHRONSTAMP ECHO %Chronstamp% The IP for %FailoverServerName% is %RestoreServerIP%>>%ActionLogFile% :VERIFY_RESTORE_LOG_FILE_NAME IF "%REPLICATE_VARIABLE%"
"YES" GOTO BEGIN_RESTORE_PROCESS IF \["%ShareLogFile%"\]
\[""\] SET /P ShareLogFile=Enter the EXACT \\path\name of the Restore Log File : IF \["%ShareLogFile%"\]
1 GOTO BEGIN_RESTORE_PROCESS IF %ERRORLEVEL%
2 SET ShareLogFile= IF %ERRORLEVEL%
2 GOTO VERIFY_RESTORE_LOG_FILE_NAME GOTO VERIFY_RESTORE_LOG_FILE_NAME :BEGIN_RESTORE_PROCESS REM ** Note this will not work unless Identical drive letters and directory structures are present on the fail-over system ** @TITLE Restoring File Shares to the Failover Server \[ %FailoverServerName% \] ECHO %Chronstamp% Restore Log File: %ShareLogFile%>>%ActionLogFile% CALL :WINDOWHEADER ECHO. ECHO Beginning File Share Replication from log file... ECHO. REM Create Shares on the Fail-over Server using REGINI.EXE CALL :CHRONSTAMP ECHO %Chronstamp% Trying to Create Shares on the Fail-over Server>>%ActionLogFile% SET RegIniState=x IF /I "%FailoverServerName%"
"%COMPUTERNAME%" GOTO PERFORM_ON_SELF IF "%RunAs%"
"1" GOTO REGINI_RUNAS CALL :WINDOWHEADER ECHO. CHOICE "Do you want to remove any existing file shares stored in the registry of the target server before entering the new shares " IF \[%ERRORLEVEL%\]
"0" ECHO *** There was a problem with the restore. *** Verify that you have proper access and permissions to perform a remote registry write on the target server.&ECHO %Chronstamp% *** There was a problem with the restore. *** Verify that you have proper access and permissions to perform a remote registry write on the targeted server.>>%ActionLogFile% &GOTO BOTTOM IF "%RegIniState%"
\[1\] REG DELETE HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares \\%%FailoverServerName%% /FORCE>>RUNASBAT.BAT ECHO ECHO.>>RUNASBAT.BAT ECHO REGINI.EXE -m "\\%FailoverServerName%" %ShareLogFile%>>RUNASBAT.BAT ECHO SET RegIniState=%%ERRORLEVEL%%>>RUNASBAT.BAT ECHO CALL :CHRONSTAMP>>RUNASBAT.BAT ECHO IF NOT "%%RegIniState%%"
"0" ECHO Done replicating the Share log, %ShareLogFile%, to server, "%FailoverServerName%"^&ECHO %%Chronstamp%% Done replicating the Share log, %ShareLogFile%, to server, "%FailoverServerName%"^>^>%ActionLogFile%>>RUNASBAT.BAT ECHO ECHO.>>RUNASBAT.BAT ECHO ECHO.>>RUNASBAT.BAT ECHO ECHO NOTE: Once ALL the drives(or LUNS) are functional on the Fail-over server,>>RUNASBAT.BAT ECHO ECHO You MUST Restart the server service or Reboot %FailoverServerName%>>RUNASBAT.BAT ECHO ECHO to activate the file share replication changes. Shares will not be>>RUNASBAT.BAT ECHO ECHO available until this occurs.>>RUNASBAT.BAT ECHO ECHO.>>RUNASBAT.BAT ECHO ECHO.>>RUNASBAT.BAT ECHO :BOTTOM>>RUNASBAT.BAT ECHO PAUSE>>RUNASBAT.BAT ECHO GOTO :EOF>>RUNASBAT.BAT ECHO :CHRONSTAMP>>RUNASBAT.BAT ECHO FOR /F "Tokens=1-5" %%%%a IN ('NOW.EXE') DO SET Chronstamp=%%%%a_%%%%b_%%%%c_%%%%d_%%%%e>>RUNASBAT.BAT ECHO FOR /F "Delims=: Tokens=1-3" %%%%a IN ('ECHO %%Chronstamp%%') DO SET Chronstamp=%%%%a_%%%%b_%%%%c>>RUNASBAT.BAT ECHO FOR /F "Delims=_ Tokens=1-7" %%%%a IN ('ECHO %%Chronstamp%%') DO SET Chronstamp=%%%%b_%%%%c_%%%%g____%%%%d_%%%%e_%%%%f>>RUNASBAT.BAT ECHO GOTO :EOF>>RUNASBAT.BAT RUNAS /ENV /NETONLY /USER:%NewDomain%\%NewName% "RUNASBAT.BAT" ECHO Once activity has completed in the pop-up window PAUSE GOTO BOTTOM :PERFORM_ON_SELF IF "%RunAs%"
\[1\] REG DELETE HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\Shares /FORCE ECHO. REGINI.EXE %ShareLogFile% CALL :WINDOWHEADER SET RegIniState=%ERRORLEVEL% CALL :CHRONSTAMP IF NOT "%RegIniState%"
"0" ECHO Done replicating the Share log, %ShareLogFile%, to server, "%FailoverServerName%"&ECHO %Chronstamp% Done replicating the Share log, %ShareLogFile%, to server, "%FailoverServerName%">>%ActionLogFile% ECHO. ECHO. ECHO NOTE: Once ALL the drives(or LUNS) are functional on the Fail-over server, ECHO You MUST Restart the server service or Reboot %FailoverServerName% ECHO to activate the file share replication changes. Shares will not be ECHO available until this occurs. ECHO. ECHO. GOTO BOTTOM :REGINI_PERFORM_ON_SELF_RUNAS IF EXIST "RUNASBAT.BAT" DEL "RUNASBAT.BAT" ECHO @ECHO OFF>RUNASBAT.BAT ECHO SET RegIniState=x>>RUNASBAT.BAT ECHO ECHO.>>RUNASBAT.BAT ECHO CHOICE "Do you want to remove any existing file shares stored in the registry of the target server before entering the new shares ">>RUNASBAT.BAT ECHO IF \[%%ERRORLEVEL%%\]
"0" ECHO *** There was a problem with the restore. *** Verify that you have proper access and permissions to perform a remote registry write on the target server.^&ECHO %%Chronstamp%% *** There was a problem with the restore. *** Verify that you have proper access and permissions to perform a remote registry write on the targeted server.^>^>%ActionLogFile% ^&GOTO BOTTOM>>RUNASBAT.BAT ECHO IF "%%RegIniState%%"
"1" GOTO BOTTOM IF "%RunAs%"
"1" CALL :RUN_AS_TARGET GOTO RESTORE_FILE_SERVER_INFO
:SUB_ROUTINES :RUN_AS_TARGET CALL :WINDOWHEADER SET QUICKVAR= ECHO You are currently running this script as user account %NewDomain%\%NewName% ECHO. ECHO When connecting to the Target Relication Server, Do you: ECHO. ECHO 1. Want to Run this script under the security context of another account ? ECHO. ECHO 2. Continue with security level of account %NewDomain%\%NewName% ? ECHO. ECHO 3. Change to the security level of account %USERDOMAIN%\%USERNAME% ? ECHO. CHOICE /C:123 "Pick " SET QUICKVAR=%ERRORLEVEL% IF \[%QUICKVAR%\]\[2\] GOTO :EOF IF \[%QUICKVAR%\]
\[3\] SET RunAs=0 IF \[%QUICKVAR%\]
\[3\] GOTO :EOF ECHO. ECHO. ECHO Enter the new account you want to "Run As" SET /P NewDomain=Local Machine or Domain Name of the account: SET /P NewName=Account Name: ECHO. GOTO :EOF :WINDOWHEADER CLS ECHO ############################################################ ECHO #### File Server Fail-over Script #### ECHO #### #### ECHO #### Author: David A. Stewart #### ECHO #### Date: 7-23-2003 #### ECHO #### Version: 2.21 #### ECHO #### #### ECHO #### #### ECHO ############################################################ ECHO. ECHO. ECHO. GOTO :EOF :OSERROREND ECHO This is not a compatible OS version. This script should be run from W2K and above systems. PAUSE GOTO :EOF :BOTTOM IF NOT "%REPLICATE_VARIABLE%"=="YES" PAUSE IF EXIST "RUNASBAT.BAT" DEL "RUNASBAT.BAT" ENDLOCAL GOTO :EOF