Mittwoch, 25. September 2013

Migration von Benutzerdaten zur Umstellung von Windows XP zu Windows 7 2/2

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:
  • 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