Auf der Arbeit sind wir gerade dabei, von einer NT4-Domäne (von Samba bereitgestellt) zu einer Active Directory-Domäne zu wechseln. Natürlich müssen auch alle Clients umgestellt werden und die lokalen Windows-Benutzerprofile migriert werden, damit die Anwender ihre gewohnten Umgebung behalten und keine Daten verloren gehen.

Microsoft stellt dazu das Befehlszeilenprogramm moveuser.exe zur Verfügung, womit man ein lokales Profil einem anderen Benutzer zuweisen kann. Um uns die Arbeit zu erleichtern, habe ich ein kleines VBScript geschrieben, was auf einem Client sämtliche Benutzerprofile der alten Domäne den Benutzern in der neuen Domäne zuordnet. Profile vom Benutzer Administrator klammert das Script allerdings aus.

Vorrausetzungen

  • Vertrauensstellung zwischen der alten und der neuen Domäne
  • moveuser.exe aus den Windows Server 2003 Resource Kit Tools
  • Benutzerkonto in beiden Domänen
  • Lokale Administrationsrechte zum Ausführen des Scripts

Unser Vorgehen

  1. Als ALT\Administrator am Client anmelden
  2. Rechner in die Domäne NEU holen
  3. Als NEU\Administrator anmelden
  4. LokaleBenutzerprofileMigrieren.vbs ausführen
  5. Fertig! ;)

LokaleBenutzerprofileMigrieren.vbs

'-------------------------------------------------------------------------------
' An die eigenen Bedürfnisse anpassen...
'-------------------------------------------------------------------------------
Private Const COMPUTER = "."
Private Const OLD_DOMAIN = "ALT"
Private Const NEW_DOMAIN = "NEU"
Private Const MOVEUSER_PATH = "\\server\ordner\moveuser.exe"
'-------------------------------------------------------------------------------

Private Const TemporaryFolder = 2
Private Const ForReading = 1
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const REG_KEY_PROFILELIST = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
Private Const LOG_FILENAME = "moveuser.log"

Dim iChoice, oFSO, oWshShell, oRegistry, sLogFilePath, vSubkeys, vSubkey, oAccount, sStdOut, oTextFile

On Error Resume Next

iChoice = MsgBox("Sollen wirklich alle lokalen Benutzerprofile der Domäne """ & OLD_DOMAIN & """ nach """ & NEW_DOMAIN & """ migrieren werden?", vbQuestion + vbYesNo , "Migration der Benutzerprofile")
If (iChoice = vbYes) Then 'Wenn "Ja" gewählt wurde...
  sStdOut = ""

  Set oFSO = CreateObject("Scripting.FileSystemObject")
  sLogFilePath = oFSO.GetSpecialFolder(TemporaryFolder) & "" & LOG_FILENAME
  oFSO.DeleteFile sLogFilePath, True

  Set oWshShell = CreateObject("WScript.Shell")
  Set oRegistry = GetObject("winmgmts:\" & COMPUTER & "\root\default:StdRegProv")
  oRegistry.EnumKey HKEY_LOCAL_MACHINE, REG_KEY_PROFILELIST, vSubkeys
  For Each vSubkey In vSubkeys 'Für alle SIDs...
    If (Len(vSubkey) > 8) Then 'Wenn KEINE System-SID...
      Set oAccount = GetAccountObjectFromSID(vSubkey, COMPUTER)
      If (oAccount.ReferencedDomainName = OLD_DOMAIN) Then 'Wenn alte Domäne...
        If (LCase(oAccount.AccountName) <> "administrator") Then 'Wenn KEIN Administrator...
          oWshShell.Run "%comspec% /c " & MOVEUSER_PATH & " " & OLD_DOMAIN & "" & oAccount.AccountName & " " & NEW_DOMAIN & "" & oAccount.AccountName & " >> """ & sLogFilePath & """", , True
        End If
      End If
    End If
  Next

  If (oFSO.FileExists(sLogFilePath) = True) Then 'Wenn die Log-Datei vorhanden ist...
    Set oTextFile = oFSO.OpenTextFile(sLogFilePath, ForReading)
    sStdOut = oTextFile.ReadAll
    oTextFile.Close
    oFSO.DeleteFile sLogFilePath, True
  End If

  If (sStdOut <> "") Then 'Wenn migriert...
    MsgBox sStdOut, vbOKOnly, "Migration der Benutzerprofile"
  Else 'Wenn NICHT migriert...
    MsgBox "Es wurden keine lokalen Benutzerprofile migriert.", vbOKOnly, "Migration der Benutzerprofile"
  End If
End If

'...
Function GetAccountObjectFromSID(ByVal sSID, ByVal sComputer)
  Dim oWMIService

  If (sComputer = "") Then sComputer = "."

  Set oWMIService = GetObject("winmgmts:\" & sComputer & "\root\cimv2")
  Set GetAccountObjectFromSID = oWMIService.Get("Win32_SID.SID='" & sSID & "'")
End Function

Download

Meine erste Variante von dem Script fand ich durch die Benutzung von WScript.Shell.Exec zwar besser, aber dazu braucht man Version 5.6 von den Windows Script – Technologien und die sind bei Windows 2000 Rechnern nicht standardmäßig installiert. :-/