Migración de perfiles en Windows Vista

Cuando proponemos un cambio de dominio dentro del plan de migración encontramos distintas tareas que acometer y la complejidad de cada una de ellas.

La migración de perfiles, evitando pérdidas de información y configuración de los usuarios es uno de los hitos que normalmente son más costosos de acometer. Este script que os propongo ha sido probado y utilizado para realizar las copia de perfiles para usuarios que han sido migrados de dominio. Este método necesita de 3 a 10 segundos por perfil (en función de la máquina en la que lo realicemos).

El script espera como argumentos el nombre de los dominios afectados, origen y destino.

Primero busca en el registro que perfiles tiene creados en la máquina identificando el SID de cada uno de ellos. Por cada SID se realiza la consulta para determinar si el SID encontrado pertenece a un usuario del dominio origen y de ser así, buscaremos el SID del usuario en el dominio destino\usuario.

Si el usuario existe en el dominio destino conseguiremos su SID y lo aplicaremos al perfil. De esta forma realizamos la migración de perfiles en un simple paso.

Este script se puede publicar en la política de máquina usando una política de grupo, afectando a las máquinas de la correspondiente Unidad Organizativa. Mezclando este este script con otro para el cambio de membresía de dominio para la máquina realizará todo el trabajo para cada máquina en dos simples pasos.

NOTA: Para poder usar este script es necesario instalar un parche para añadir el proveedor WMI Win32_UserProfile. Este parche será añadido en el Service Pack 1, previo Service Pack podemos instalar el parche para añadir esta funcionalidad.

Os dejo el enlace a la Knowledge Base de Microsoft en el que habla de esta nueva funcionalidad http://support.microsoft.com/kb/930955/es-es.

Código:

  1. Option Explicit
  2.  
  3. On Error Resume Next
  4.  
  5. Dim sComputer, oWMI, oRegistry, sRegistryPath, arrKeys, sSubKey, sKey, sSubPath
  6. Dim sValue, oAccountSID, sDomainOld, sDomainNew, sUser, oAccountOld, oAccountNew
  7. Dim sSIDOld, sSIDNew
  8.  
  9. Const HKEY_LOCAL_MACHINE = &H80000002
  10.  
  11. '''''''''''''''''''''''''''''''''''''''''''''''''''
  12. sComputer = "."
  13.  
  14. If WScript.Arguments.Count <> 2 Then
  15. WScript.Echo "Error: perfiles.vbs <dominio antiguo> <dominio nuevo>"
  16. WScript.Quit
  17. Else
  18. sDomainOld = UCase(WScript.Arguments(0))
  19. sDomainNew = UCase(WScript.Arguments(1))
  20. WScript.Echo "Domain Origen: " & sDomainOld
  21. WScript.Echo "Dominio Destino: " & sDomainNew
  22. WScript.Echo "--"
  23. End If
  24.  
  25. '''''''''''''''''''''''''''''''''''''''''''''''''''
  26.  
  27. Set oWMI = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
  28. Set oRegistry= GetObject("winmgmts:\\" & sComputer & "\root\default:StdRegProv")
  29.  
  30. sRegistryPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
  31. oRegistry.EnumKey HKEY_LOCAL_MACHINE, sRegistryPath, arrKeys
  32.  
  33. For Each sSubkey In arrKeys
  34.  
  35. sKey = "ProfileImagePath"
  36. sSubPath = sRegistryPath & "\" & sSubkey
  37. oRegistry.GetExpandedStringValue HKEY_LOCAL_MACHINE, sSubPath, sKey, sValue
  38.  
  39. ' Buscamos el dominio y usuario en el registro
  40.  
  41. Set oAccountSID = oWMI.Get ("Win32_SID.SID='" & sSubkey &"'")
  42. WScript.Echo "Cuenta:" & Trim(oAccountSID.ReferencedDomainName) & "\" & _
  43. Trim(oAccountSID.AccountName) & _
  44. vbCrLf & "Perfil: " & sValue & _
  45. vbcrlf & "SID : " & sSubKey
  46.  
  47. ' si el dominio encontrado se corresponde con el dominio de referencia ....
  48. If Ucase(oAccountSID.ReferencedDomainName) = UCase(sDomainOld) Then
  49.  
  50. sUser = oAccountSID.AccountName
  51.  
  52. ' Obtenemos el objeto de usuario actual
  53. Set oAccountOld = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
  54. & sComputer & "\root\cimv2:Win32_UserAccount." _
  55. & "Domain='" & Trim(sDomainOld) & "',Name='" & Trim(sUser) & "'")
  56.  
  57. ' Obtenemos el objeto destino
  58. Set oAccountNew = oWMI.Get ("Win32_UserAccount.Name='" & sUser & _
  59. "',Domain='" & sDomainNew & "'")
  60.  
  61. If Err.number <> 0 then
  62. ' Si el error es distinto de 0 significa que o no se ha podido conectar o que el usuario no existe en destino
  63. WScript.Echo "RESULT : Not found on target domain." & vbCrLf & "--"
  64. err.Clear
  65. Else
  66. ' SID de ambas cuentas
  67. sSIDOld = oAccountOld.SID
  68. sSIDNew = oAccountNew.SID
  69.  
  70. ' Cambio de propietario
  71. Set oProfile = GetObject("winmgmts:\\" & sComputer & _
  72. "\root\CIMV2").Get("Win32_UserProfile.SID=""" & sSIDOld & """")
  73. Set oParameters = oProfile.Methods_("ChangeOwner").InParameters.SpawnInstance_()
  74.  
  75. oParameters.Properties_.Item("Flags") = 0
  76. oParameters.Properties_.Item("NewOwnerSID") = sSIDNew
  77.  
  78. Set oOutParams = GetObject("winmgmts:\\" & sComputer & _
  79. "\root\CIMV2").ExecMethod("Win32_UserProfile.SID=""" & _
  80. sSIDOld & """", "ChangeOwner", oParameters)
  81.  
  82. If Err.number <> 0 Then
  83. WScript.Echo "ERROR : Usuario " & sUser & ": " & Err.Number & " - " & Err.Description
  84. Err.Clear
  85. Else
  86. WScript.Echo "RESULT : Usuario modificado." & vbCrLf & "--"
  87. End If
  88.  
  89. End If ' If Err.number <> 0 then
  90. Else
  91. WScript.Echo "RESULT : No se modificará." & vbCrLf & "--"
  92.  
  93. End If ' If Ucase(oAccountSID.ReferencedDomainName) = UCase(sDomainOld) Then
  94.  
  95. Next
  96.  
  97. WScript.Echo vbcrlf & "--Script finalizado."

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

скачать постер к фильму

скачать постер к фильму АМачете (2010) Мачете (2010) постеры The Good Wife TV Show wallpapers download The Good Wife TV Show wallpapers top fonts free fonts ykapral1

Hola, Descubrí tu blog por

Hola,
Descubrí tu blog por casualidad y parece interesante, a ver, tengo un problemilla y lo mismo tu puedes ayudarme o bien orientarme un poco.
Tengo una red, con unos cuantos usuarios, están divididos en distintas isletas, según el trabajo, en algunas zonas, los usuarios siempre rotan, en otros no. El caso es que hace algún tiempo se les maqueto los equipos y se les copio los perfiles, al entrar el usuario, en dominio, este le creaba la carpeta con el usuario + dominio, algo así, para que te hagas una idea, nombreusuario.dominio, con lo que teníamos dos carpetas, la original, la que usaba antes de maquetar y que fue copiada a la nueva instalación y la que creaba el equipo cuando ingresaba el usuario por primera vez, como ya comente. El problema viene ahora que queremos hacer los perfiles móviles y limpiar un poco, necesitaría saber que perfiles son los buenos, de cada usuario, en los que no rotan no tengo mucho problema pero en los que rotan tengo que mirar usuario por usuario y en un par de carpetas como mínimo.
Podrías ayudarme???
Saludos y muchas gracias!

Creo que necesitas algo así

Para saber donde está cada perfil de usuario local puedes consultarlo en el registro. Te paso un script que te devuelve esta información, en formato SID de usuario y ruta de perfil.

Con esta información puedes crear otro script que copie el contenido que necesites al servidor que tendrá los perfiles móviles.

Espero que te sea útil.

En cualquier caso me apunto esto y escribiré en estos días algo sobre este tema.

Un saludo.

  1. Const HKEY_LOCAL_MACHINE = &H80000002
  2.  
  3. Set oRegistro=GetObject("winmgmts:\\.\root\default:StdRegProv")
  4.  
  5. sKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
  6. oRegistro.EnumKey HKEY_LOCAL_MACHINE, sKey, aSubKeys
  7.  
  8. For Each oSubKey In aSubKeys
  9. sValorABuscar = "ProfileImagePath"
  10. sRutaEnRegistro = sKey & "\" & oSubKey
  11. oRegistro.GetExpandedStringValue HKEY_LOCAL_MACHINE,sRutaEnRegistro,sValorABuscar,sValorDevuelto
  12. WScript.Echo oSubKey & " - " & sValorDevuelto
  13. Next

 páginas vistas.