"Después del juego es antes del juego"
Sepp Herberger

miércoles, 9 de julio de 2014

Mover perfiles de usuarios Windows a otra unidad de disco

Esta va de Windows: en Linux es muy fácil cambiar de sitio un perfil de usuario cuando el disco o partición donde está ya no da más de sí. Simplemente tenemos que cambiar la ruta de su home en el fichero /etc/passwd y mover el home preservando los permisos y propietarios de los archivos a la nueva ubicación y ya está. En Windows XP es un pelín mas complicado, pero como veremos también se puede hacer.

Para ello uso un script hecho con la potente herramienta de scripting kix32 y la excelente utilidad de copiado Robocopy. Debemos descargar ambos programas y ponerlos en algun directorio del path de nuestro sistema, por ejemplo en c:\windows\system32.

Los scripts son dos:

moverperfil.bat:

 @echo off
 kix32 moverperfil.kix $usuario=%1 $nuevaruta=%2
 rem kix32 moverperfil.kix $usuario=usuario $nuevaruta=K:\USUARIOS\usuario

moverperfil.kix:

 Function Name2SID(Optional $userid,Optional $domain)
  If $userid = "" $userid = @USERID EndIf
  If $domain = "" $domain = @LDOMAIN EndIf
  Dim $objWMIService
  $objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  $Name2SID = $objWMIService.Get("Win32_Account.Name='"+$userid+"',Domain='"+$domain+"'").SID
  If @ERROR EXIT @ERROR EndIf
 EndFunction
 if not isdeclared($usuario) or not isdeclared($nuevaruta)
   "Uso: kix32 moverperfil.kix "+chr(36)+"usuario=<usuario> "+chr(36)+"nuevaruta=<ruta-nuevo-perfil>" ?
   exit 1
 endif
 $pos=instrrev($nuevaruta,"\")
 $basenuevaruta=left($nuevaruta,$pos-1)
 ;poner permisos a $basenuevaruta como los de c:documents and settings. Usar setacl o icacls
 If not Exist($basenuevaruta)
   "ERROR: El directorio "+$basenuevaruta+" no existe."?
   "    Debe crearlo antes con los mismos permisos que c:\documents and settings" ?
   exit 1
 else
   "AVISO: No olvide verificar permisos en "+$basenuevaruta ?
   if exist($nuevaruta)
     "ERROR: El directorio "+$nuevaruta+" no puede existir previamente."?
     "    Se crea automaticamente en en el proceso." ?
      exit 1
   endif
 EndIf
 $sid=Name2SID($usuario)
 if @ERROR
   "ERROR: SID usuario no encontrada." ?
   exit 1
 else
   "INFO: SID usuario encontrado: "+$sid ?
 endif
 $rutaregistro="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"+$sid
 $viejaruta=readvalue($rutaregistro,"ProfileImagePath")
 "INFO: Ruta actual de su perfil: "+$viejaruta ?
 "INFO: Copiando perfil a nueva ruta" ?
 SHELL '%COMSPEC% /e:1024 /c ROBOCOPY.EXE "'+$viejaruta+'" "'+$nuevaruta+'" /MIR /COPYALL /E /R:0'
 ; "añadir > nul a la anterior linea para ocultar la salida"
 if @ERROR<>1
   "ERROR: fallo en el copiado" ?
   exit 1
 else
   "INFO: Copiado" ?
 endif
 "INFO: Modificando registro para nuevo perfil" ?
 if writevalue($rutaregistro,"ProfileImagePath",$nuevaruta,"REG_EXPAND_SZ")
   "ERROR: Error en modificacion registro: "+@ERROR+"-"+"@SERROR ?
 else
   "INFO: Hecho, puede probar a entrar con perfil nuevo." ?
   "INFO: Si todo funciona, no olvide borrar "+$viejaruta ?
 endif  
Imaginemos que tenemos un usuario llamado "carla", que tiene su carpeta de perfil en c:\documents and settings\carla, pero la unidad c: está ya llena y no cabe nada más. Tenemos otra unidad k: (que puede ser otro disco o una partición distinta dentro del mismo disco) con suficiente espacio y queremos mover el perfil de carla a k:.

Para ello primero debemos crear en k: una carpeta, por ejemplo "usuarios", de la cual colgará el nuevo perfil. Dicha carpeta debe tener el mismo propietario y permisos que "c:\documents and settings".

Una vez hecho esto, lo que debemos es ejecutar moverperfil.bat desde un terminal de Windows, que a su vez llama a moverperfil.kix. El script debe ejecutarse desde un usuario distinto de "carla", con permisos de administrador, para evitar problemas de bloqueo y/o de acceso. El uso sería:

 moverperfil.bat carla k:\usuarios\carla
El script comprueba que existe k:\usuarios y que no existe k:\usuarios\carla, que hay un usuario llamado "carla" y copia mediante robocopy todo el contenido de c:\documents and settings\<perfil de carla> sobre k:\usuarios\carla. Robocopy copia todos los ficheros que puede sin interrupción, aún cuando falle en algunos ficheros concretos (normalmente ficheros temporales o del sistema) que no afectan al funcionamiento del nuevo perfil.

Finalmente modifica la clave de registro "HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<perfil de carla>/ProfileImagePath" para que apunte a k:\usuarios\carla.

Es aconsejable reiniciar el equipo e iniciar sesión con el usuario "carla" para probar que todo está en orden. Una vez verificado esto podemos eliminar el viejo perfil de carla en c:\documents and settings\ y liberar espacio en c:

La próxima será de Linux o le cambio el nombre al blog....

No hay comentarios:

Publicar un comentario