Die Migration der Benutzerdaten nach einer Umstellung von Windows XP auf Windows 7 ist sehr zeitaufwendig, wie ich meinem vorherigen Blog-Post schon beschrieben habe.
Da man in der IT, Gott sei Dank, größtenteils automatisieren kann, habe ich mir diesen Umstand zur Nutze gemacht und passend zum Sicherungs-Skript, natürlich auch ein Wiederherstellungs-Skript gebaut.
Features:
Da man in der IT, Gott sei Dank, größtenteils automatisieren kann, habe ich mir diesen Umstand zur Nutze gemacht und passend zum Sicherungs-Skript, natürlich auch ein Wiederherstellungs-Skript gebaut.
Features:
- Außenstandorte werden unterstützt => wenn ein bestimmtes Default Gateway gesetzt ist, wird keine Wiederherstellung durchgeführt
- Konfigurierbares Home-Laufwerk
- Wiederherstellung nur, wenn Betriebssystem Windows7
- Wiederherstellung nur, wenn Computername ein bestimmtes Muster hat (z.B: INVW700001)
- Wiederherstellung von Ordnern
- Vorbereitung für Start/Stop von Prozessen
- Error-Handling
- Migration von OpenOffice zu LibreOffice
- Warten auf etwaige, laufende Softwarverteilung (Frontrange DSM: Niinst32.exe)
- Nach Wiederherstellung automatische Abmeldung
- Flag bei erfolgte Wiederherstellung (in %APPDATA%)
Hier der Code:
'#####################################################
' Wiederherstellungsscript
' Author: Oliver Skibbe oliskibbe (at) gmail.com
' Date: 2013-09-25
'#####################################################
' Constants
' Windows Version
Const Win2k = "5.0"
Const WinXP = "5.1"
Const Win2k3 = "5.2"
Const WinVista = "6.0"
Const Win7 = "6.1"
Const Win2k8 = "6.2"
' Stuff
Const Target = "INVW7"
Const HomeDrive = "Z:\"
' Objects
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:\\localhost\root\cimv2")
TargetVersion = Win7
' Get Windows Version
Set colOperatingSystem = objWMIService.ExecQuery("Select Version from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystem
Version = objOperatingSystem.Version
Next
' Quit if target pc name is not XXX or uses other Version than Windows 7
strComputerName = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
If InStr(1, strComputerName, Target, VbTextCompare) = 0 Then
WScript.Quit
Else
' If computer name is valid, check OS version
If Not Mid(Version,1,3) = TargetVersion Then
WScript.Quit
End If
End If ' end check valid target pc
' paths
strProfileDir = WshShell.ExpandEnvironmentStrings("%USERPROFILE%")
strProgramFilesDir = WshShell.ExpandEnvironmentStrings("%PROGRAMFILES%")
strAppDataDir = strProfileDir + "\AppData"
strLocalAppDataDir = strAppDataDir + "\Local"
strRoamingAppDataDir = strAppDataDir + "\Roaming"
' quit if restore already completed
RestoreFlag = strAppDataDir + "\Restore_done.flag"
If objFSO.FileExists(RestoreFlag) Then
WScript.Quit
End If
' Get Default GW
Set colNetworkConfiguration = objWMIService.ExecQuery("Select DefaultIPGateway from Win32_NetworkAdapterConfiguration Where IPEnabled = TRUE")
For Each objNetworkConfiguration in colNetworkConfiguration
If Not IsNull(objNetworkConfiguration.DefaultIPGateway) Then
DefaultGateway = Join(objNetworkConfiguration.DefaultIPGateway, ",")
End If
Next
' no restore in hannover so far
If DefaultGateway = "10.10.1.1" Then
Wscript.Quit
End If
' sleep if dsm net install is currently running
ProcToWatch = "NIInst32.exe"
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name ='" & ProcToWatch & "'")
Do Until colProcesses.Count = 0
WScript.Sleep 10000
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name ='" & ProcToWatch & "'")
Loop
' Quit if home drive is not available / writable or wrong type
CheckDrive(HomeDrive)
WshShell.Popup "Die Rück-Sicherung der eigenen Dateien wurde gestartet", 3
' Source
SourceBase = HomeDrive + "\Sicherung"
If Not objFSO.FolderExists(SourceBase) Then
MsgBox("Es wurde keine sicherung in " + SourceBase + " gefunden!")
WScript.Quit
End If
' Targets
TargetDesktop = strProfileDir & "\Desktop"
TargetOwnFiles = strProfileDir + "\Documents"
TargetFavorites = strProfileDir & "\Favorites"
TargetLOfficeBase = strLocalAppDataDir + "\LibreOffice\4\user"
TargetRoamingMSOffice = strRoamingAppDataDir + "\Microsoft"
TargetLocalMSOffice = strLocalAppDataDir + "\Microsoft"
' Restore Desktop
Restore SourceBase + "\Desktop", TargetDesktop, "Desktop", "dir", False
' Restore own files
Restore SourceBase + "\Eigene Dateien", TargetOwnFiles, "Eigene Dateien", "dir", False
' Restore Favorites
Restore SourceBase + "\Favoriten", TargetFavorites, "Favoriten", "dir", False
' Restore / Migrate OpenOffice to LibreOffice
Restore SourceBase + "\OpenOffice", TargetLOfficeBase, "LibreOffice", "dir", False
' Restore AppData Local MS Office
Restore SourceBase + "\Local\MSOffice", TargetLocalMSOffice, "MS Office", "dir", False
' Restore AppData Roaming MS Office
Restore SourceBase + "\Roaming\MSOffice", TargetRoamingMSOffice, "MS Office", "dir", False
' touch restore flag
objFSO.CreateTextFile(RestoreFlag)
WshShell.Popup "Die Rück-Sicherung der eigenen Dateien wurde beendet"
' log off
WScript.Sleep 5000
WshShell.run "shutdown /l /t 0"
' End of Main
''' Functions
' control processes
Function ProcessControl(proc, state, CheckState)
If state = "stop" Then ' stop process
cmd = "taskkill.exe /F /IM " + proc
Else ' start process
cmd = proc
End If ' end start / stop state
ExitCode = WshShell.run (cmd, 1, true)
If CheckState = True Then
If ExitCode > 0 Then
MsgBox "Fehler beim " + state + " von " + proc, vbCritical
WScript.Quit
End If ' end exit code
End If ' end check state
End Function
Function Restore(Source, Target, Label, PathType, Required)
' try to copy folder
If PathType = "dir" Then
If objFSO.FolderExists(Source) Then
If Not objFSO.FolderExists(Target) Then
CreateFolderRecursive Target
End If
objFSO.CopyFolder Source, Target
Else
' If required but does not exist: Quit!
If Required = True Then
MsgBox("Fehler bei der Rücksicherung von " + Label)
WScript.Quit
End If ' End Required Output
End If ' end check source and target folder
' try to copy file
Elseif PathType = "file" Then
' try to copy file, source file name and target directory
If objFSO.FileExists(Source) And objFSO.FolderExists(Target) Then
objFSO.CopyFile Source, Target
Else
' If required but does not exist: Quit!
If Required = True Then
MsgBox("Fehler bei der Rücksicherung von " + Label)
WScript.Quit
End If ' End Required Output
End If ' end check source and target file
' not supported
Else
MsgBox("Typ wird nicht unterstützt, wählen Sie: dir, file")
WScript.Quit
End If
End Function
' Check target drive
Function CheckDrive(Drive)
If objFSO.DriveExists(Drive) Then
Set DriveState = objFSO.GetDrive(Drive)
' Check home drive
If Not DriveState.IsReady = True Then
ErrorText = "Laufwerk " + Drive + " ist nicht erreichbar, bitte starten Sie den PC neu!"
ErrorOccured = True
Else
' 0: unkown, 1: Removable, 2: Fixed, 3: Network, 4: CD-Rom, 5: RAM-Disk
If Not DriveState.DriveType = 1 And Not DriveState.DriveType = 2 And Not DriveState.DriveType = 3 Then
ErrorText = Drive + ": ist kein gültiger Laufwerkstyp, mögliche Typen: Netzwerk, Festplatte, Wechseldatenträger"
ErrorOccured = True
End If ' end check valid drive type
End If
Else
ErrorText = "Laufwerk " + Drive + " existiert nicht, bitte starten Sie den PC neu!"
ErrorOccured = True
End If ' End Drive exists
If ErrorOccured = True Then
MsgBox(ErrorText)
WScript.Quit
End If
End Function
Function CreateFolderRecursive(FullPath)
arr = split(FullPath, "\")
path = ""
For Each dir In arr
If path <> "" Then
path = path & "\"
End If
path = path & dir
If Not objFSO.FolderExists(path) Then
objFSO.CreateFolder(path)
End If
Next
End Function
' EOF
Das Skript sollte angepasst, getestet und im NETLOGON Verzeichnis abgelegt werden, anschließend kann es im Login-Skript verankert werden und stellt ab diesem Zeitpunkt automatisch bei der ersten Anmeldung die Daten wieder her.
Zum Download
Bei Fragen bitte melden!