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!
Keine Kommentare:
Kommentar veröffentlichen