El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script VBScript Para Cambiar La Contraseña A Un Usuario Local En Uno O Varios Equipos

Posted by urpiano en viernes 25 \25\+01:00 julio \25\+01:00 2008

Es conveniente cambiar la contraseña del administrador local de los equipos de vez en cuando, de forma que no se "enrancie". Hacer esto en un solo equipo es algo que no es laborioso, pero hacerlo en muchos equipos es otra cosa. Cuando se está en un entorno de dominio, se suele hacer por medio de un script VBScript que se asigna en una GPO como script de inicio de equipo; una forma cómoda de hacer esta tarea. Si embargo tiene dos principales debilidades: si el equipo no es reiniciado en algún momento (pensemos en un servidor por ejemplo, o en ese usuario que nunca apaga su equipo), no recibirá la nueva contraseña, por otra parte, el script deberá estar situado en un recurso de red y tendrá que tener la nueva contraseña escrita en él, con lo que se convierte en fácil capturar esa contraseña para un usuario medinamente "espabiladillo"; se puede encriptar el script con SCRENC.EXE pero eso no es, ni mucho menos algo demasiado seguro, pues es muy fácil saltarse esa encriptación, como se ve aquí. Otra estrategia es el hacerlo de forma interactiva, desde un equipo en el que lanzamos el script desde una ventana de comandos que hemos abierto con RunAs como administrador del dominio; de esta manera, el script no está a disposición de todo el mundo, con lo que nadie se entera de cuál es la nueva contraseña. La pega de esta otra estrategia es que se debe ir haciendo un recuento de los equipos a los que se ha podido o no cambiar la contraseña, pues si un equipo está apagado, la contraseña no se le cambiará, mientras que con la estrategia de la GPO eso no importa, pues en el momento en que sea iniciado el equipo, se le cambiará la contraseña. Por ello, cuando no se opta por la estrategia de ejecutar el script desde una GPO, es conveniente saber a qué equipos no se les pudo cambiar la contraseña y reintentarlo más adelante, e ir así reduciendo la lista de equipos a los que no se aplicó. En esta estrategia de no usar la GPO está basado el presente script.

Este script permite cambiar la contraseña a un usuario local en uno o varios equipos. Ideal para cambiar la contraseña al administrador local de los equipos de un dominio. El script permite cambiar la contraseña de un usuario específico o del administrador local si no se establece a qué usuario se cambiará la contraseña. Dado que como nombre del usuario administrador local del equipo podríamos tener diferentes nombres de usuario, por tratarse sistemas operativos en diferentes idiomas o por haber sido cambiado en la directiva «Configuración de equipo\Configuración de Windows\Configuración de seguridad\Directivas locales\Opciones de seguridad\Cuentas: cambiar el nombre de la cuenta del administrador», ya sea en las políticas locales (gpedit.msc) o por GPO, el script averiguará en cada equipo qué nombre tiene el usuario administrador local, para así cambiar su contraseña sea cual sea su nombre. El script deberá ser lanzado por un usuario que tenga los permisos necesarios para realizar esta tarea (un administrador de dominio, por ejemplo).

Sintaxis

cscript [//nologo] cambiar-password.vbs [/E:equipos] [/F:fichero] [/D:dominio] [/N:equipos] [/T:fichero] [/U:usuario] [/?] contraseña

Siendo

Etiqueta Dato ¿Requerido? Descripción
  contraseña
Nueva contraseña a establecer.
E equipos No
Lista de equipos a los que se cambiará la contraseña del usuario local.
F fichero No
Fichero con los nombres de los equipos a los que se cambiará la contraseña del usuario local, un nombre de equipo por línea.
D dominio No
Nombre DNS (dominio.com) del dominio al que se cambiará la contraseña del usuario local de sus equipos.
N equipos No
Lista de equipos a los que se excluirá del proceso. Necesaria cuando se ha establecido el argumento D, nombre de dominio, pues en ese caso el script procesa todos los equipos del dominio y podríamos desear que no lo haga en determinados equipos..
T fichero No
Fichero de texto, de valores separados por tabulador (ideal para ser abierto con Excel), con los resultados obtenidos en la ejecución del script. Si se omite este argumento, la información se mostrará por pantalla.
U usuario No
Nombre de usuario de equipo local al que se quiere cambiar la contraseña. Si se omite, se cambiará al administrador local del equipo.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Cambia a «nueva contraseña» la contraseña del usuario administrador local de los equipos del dominio bichosmalos.mordor.gov, excluyendo los equipos troll,wargo de este cambio.:

cscript //nologo cambiar-password.vbs /D:bichosmalos.mordor.gov /N:troll,wargo "nueva contraseña"

– Cambia a «nueva contraseña» la contraseña del usuario administrador local de los equipos snaug,grima,balrog, guardando los resultados en el fichero separado por tabuladores c:listadoscambiar.txt:

cscript //nologo cambiar-password.vbs /E:snaug,grima,balrog /T:c:listadoscambiar.txt "nueva contraseña"

– Cambia a «nueva contraseña» la contraseña del usuario administrador local de los equipos listados en el fichero c:mordorcambiar.txt, guardando los resultados en el fichero separado por tabuladores c:listadoscambiar.txt:

cscript //nologo cambiar-password.vbs /F:c:mordorcambiar.txt /T:c:listadoscambiar.txt "nueva contraseña"

– Cambia a «nueva contraseña» la contraseña del usuario local smeagol de los equipos listados en el fichero c:mordorcambiar.txt, mostrando por pantalla los resultados:

cscript //nologo cambiar-password.vbs /F:c:mordorcambiar.txt /U:smeagol "nueva contraseña"

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* cambiar-password.vbs                                                *
'*                                                                     *
'* Este script permite cambiar la contraseña a un usuario local en uno *
'* o varios equipos. Ideal para cambiar la contraseña al administrador *
'* local de los equipos de un dominio. El script permite cambiar la    *
'* contraseña de un usuario específico o del administrador local si no *
'* se establece a qué usuario se cambiará la contraseña. Dado que como *
'* nombre del usuario administrador local del equipo podríamos tener   *
'* diferentes nombres de usuario, por tratarse sistemas operativos en  *
'* diferentes idiomas o por haber sido cambiado en la directiva        *
'* "Configuración de equipo\Configuración de Windows\Configuración de  *
'* seguridad\Directivas locales\Opciones de seguridad\Cuentas: cambiar *
'* el nombre de la cuenta del administrador", ya sea en las políticas  *
'* locales (gpedit.msc) o por GPO, el script averiguará en cada equipo *
'* qué nombre tiene el usuario administrador local, para así cambiar   *
'* su contraseña sea cual sea su nombre. El script deberá ser lanzado  *
'* por un usuario que tenga los permisos necesarios para realizar esta *
'* tarea (un administrador de dominio, por ejemplo).                   *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] cambiar-password.vbs [/E:equipos]                *
'* [/F:fichero] [/D:dominio] [/N:equipos] [/T:fichero] [/U:usuario]    *
'* [/?] contraseña                                                     *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - contraseña (Requerido):                                           *
'*         Nueva contraseña a establecer.                              *
'*                                                                     *
'* - /E: equipos (Opcional):                                           *
'*         Lista de equipos a los que se cambiará la contraseña del    *
'*         usuario local.                                              *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         Fichero con los nombres de los equipos a los que se         *
'*         cambiará la contraseña del usuario local, un nombre de      *
'*         equipo por línea.                                           *
'*                                                                     *
'* - /D: dominio (Opcional):                                           *
'*         Nombre DNS (dominio.com) del dominio al que se cambiará la  *
'*         contraseña del usuario local de sus equipos.                *
'*                                                                     *
'* - /N: equipos (Opcional):                                           *
'*         Lista de equipos a los que se excluirá del proceso.         *
'*         Necesaria cuando se ha establecido el argumento D, nombre   *
'*         de dominio, pues en ese caso el script procesa todos los    *
'*         equipos del dominio y podríamos desear que no lo haga en    *
'*         determinados equipos..                                      *
'*                                                                     *
'* - /T: fichero (Opcional):                                           *
'*         Fichero de texto, de valores separados por tabulador (ideal *
'*         para ser abierto con Excel), con los resultados obtenidos   *
'*         en la ejecución del script. Si se omite este argumento, la  *
'*         información se mostrará por pantalla.                       *
'*                                                                     *
'* - /U: usuario (Opcional):                                           *
'*         Nombre de usuario de equipo local al que se quiere cambiar  *
'*         la contraseña. Si se omite, se cambiará al administrador    *
'*         local del equipo.                                           *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Cambia a "nueva contraseña" la contraseña del usuario             *
'* administrador local de los equipos del dominio                      *
'* bichosmalos.mordor.gov, excluyendo los equipos troll,wargo de este  *
'* cambio.:                                                            *
'*                                                                     *
'* cscript //nologo cambiar-password.vbs /D:bichosmalos.mordor.gov     *
'* /N:troll,wargo "nueva contraseña"                                   *
'*                                                                     *
'* - Cambia a "nueva contraseña" la contraseña del usuario             *
'* administrador local de los equipos snaug,grima,balrog, guardando    *
'* los resultados en el fichero separado por tabuladores               *
'* c:\listados\cambiar.txt:                                            *
'*                                                                     *
'* cscript //nologo cambiar-password.vbs /E:snaug,grima,balrog         *
'* /T:c:\listados\cambiar.txt "nueva contraseña"                       *
'*                                                                     *
'* - Cambia a "nueva contraseña" la contraseña del usuario             *
'* administrador local de los equipos listados en el fichero           *
'* c:\mordor\cambiar.txt, guardando los resultados en el fichero       *
'* separado por tabuladores c:\listados\cambiar.txt:                   *
'*                                                                     *
'* cscript //nologo cambiar-password.vbs /F:c:\mordor\cambiar.txt      *
'* /T:c:\listados\cambiar.txt "nueva contraseña"                       *
'*                                                                     *
'* - Cambia a "nueva contraseña" la contraseña del usuario local       *
'* smeagol de los equipos listados en el fichero                       *
'* c:\mordor\cambiar.txt, mostrando por pantalla los resultados:       *
'*                                                                     *
'* cscript //nologo cambiar-password.vbs /F:c:\mordor\cambiar.txt      *
'* /U:smeagol "nueva contraseña"                                       *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Julio De 2008                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim str_NuevaClave 'As String
Dim arr_Equipos 'As String
Dim str_Excluidos 'As String
Dim str_TXT 'As String
Dim str_UsuarioACambiar 'As String
Dim str_Mensaje 'As String
Dim str_Equipos 'As String
Dim int_Equipo 'As Integer
Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream

'Validando los argumentos y almacenando
'sus valores
If f_RevisarArgumentos( _
                       str_Error, _
                       int_Error) Then

    Call s_Ayuda(str_Error)
    WScript.Quit int_Error

End If

'Establecemos los encabezados del listado con los resultados
str_Mensaje = "Equipo" & vbTab & _
              "Resultado" & vbTab & _
              "Nº Error" & vbTab & _
              "Error" & vbTab & _
              "Usuario" & vbCrLf

'Recorremos uno a uno los equipos a procesar
For int_Equipo = LBound(arr_Equipos) To UBound(arr_Equipos)

    'Procesamos el equipo. Si el array de equipos contiene
    'algún elemento vacío, lo evitamos
    If Len(arr_Equipos(int_Equipo)) > 0 Then _
        Call s_ProcesarEquipo(arr_Equipos(int_Equipo), _
                              str_UsuarioACambiar, _
                              str_NuevaClave)

    'Añadimos un salto de línea al mensaje de salida
    str_Mensaje = str_Mensaje & vbCrLf 

Next 'int_Equipo

'Si se debe volcar la salida en un fichero...
If Len(str_TXT) > 0 Then

	'Creamos un objeto FileSystemObject y un objeto
	'TextStream, éste último en la ruta y nombre recibidos
	'como parámetro /T
	Set obj_FS = CreateObject("scripting.filesystemobject")
	Set obj_TS = obj_FS.CreateTextFile(str_TXT)
	
	'Escribimos los resultados en el fichero
	obj_TS.Write str_Mensaje
	
	'Cerramos el fichero
	obj_TS.Close
	
	'Limpieza de culete :-)
	Set obj_TS = Nothing
	Set obj_FS = Nothing
	
Else

	'Mostramos los resultados por pantalla
	WScript.Echo str_Mensaje

End If

Sub s_ProcesarEquipo(str_Equipo, _
                          str_Usuario, str_Clave) 'As Boolean
'***********************************************************************
'* Procedimiento: s_ProcesarEquipo                                     *
'* Tipo         : Sub                                                  *
'* Devolución   :                                                      *
'* Fecha y Hora : 23/07/2007 14:01:57                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe como parámetros el nombre de un   *
'*                equipo, el nombre de un usuario (o nada, en cuyo     *
'*                caso busca cuál es el nombre del usuario             *
'*                administrador del equipo) y una contraseña. El       *
'*                método cambiará la contraseña al usuario local de    *
'*                ese equipo.                                          *
'***********************************************************************

    Dim obj_Usuario 'As IADsUser
    
    'Guardamos el nombre del equipo en el mensaje de salida
    str_Mensaje = str_Mensaje & str_Equipo
    
	'Si el equipo responde al ping...
	If f_EquipoResponde(str_Equipo) Then

        'Establecemos control de errores
        On Error Resume Next
        
        'Si no ha sido pasado el usuario al que cambiar
    	'la contraseña, se le cambiará al administrador
    	'local del equipo; obtenemos su nombre
        If Len(str_Usuario) = 0 Then _
        	str_Usuario = f_NombreAdministrador(str_Equipo)
        
        'Obtenemos el objeto de usuario con el proveedor WinNT
        Set obj_Usuario = GetObject("WinNT://" & str_Equipo & "/" & _
                                              str_Usuario & ",user")
        
        'Si no se ha producido error
        If Err.Number = 0 Then
        
    	   	
            'Cambiamos la contraseña
            obj_Usuario.SetPassword str_Clave
            obj_Usuario.SetInfo
            
            'Si no se ha producido error al cambiar la contraseña...
            If Err.Number = 0 Then

    	        'Almacenamos el éxito en el mensaje
    	        str_Mensaje = str_Mensaje & vbTab & _
    	                      "Contraseña Cambiada" & vbTab & _
    	                      "0" & vbTab & _
    	                      "Sin Error" & vbTab & _
    	                      str_Usuario
    	                       
    	    Else
    	    
    	       'Reflejamos el fracaso
    	       str_Mensaje = str_Mensaje & vbTab & _
    	                     "No se ha podido cambiar" & vbTab & _
    	                     Err.Number & vbTab & _
    	                     Err.Description & vbTab & _
    	                     str_Usuario
    	                     
    	    End If
	        
	    'Si se ha producido algún error...
	    Else
	    
	    	'Almacenamos el fracaso en el mensaje, junto con su
	    	'número y descripción de error
	    	str_Mensaje = str_Mensaje & vbTab & _
	    	              "No se ha podido cambiar" & vbTab & _
	    	              Err.Number & vbTab & _
	    	              f_IIf(Len(Err.Description)>0, _
	    	                    Err.Description, _
	    	                    "Usuario no encontrado") & _
	    	                vbTab & _
	    	              str_Usuario

	   	End If
	   	
	   	'Devolvemos el control de errores al intérprete
	   	On Error Goto 0
	   	
	'En caso de no responder al ping...
	Else
	
	    'Reflejamos esta circunstancia en el mensaje
	    str_Mensaje = str_Mensaje & vbtab & _
	                   "No Responde al Ping"
	    
	End If

End Sub 's_ProcesarEquipo



Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 23/07/2007 13:09:49                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función revisa los argumentos recibidos,        *
'*                recogiendo los posibles fallos por falta de          *
'*                argumentos requeridos y almacenando en las           *
'*                variables correspondientes los argumentos            *
'*                recibidos. recibe dos parámetros cuyo fin es ser de  *
'*                salida: una cadena que almacenará los errores        *
'*                detectados y un entero que almacenará el código de   *
'*                los errores detectados. Hay tres tipos de error;     *
'*                error 1 para los argumentos sin nombre requeridos y  *
'*                no encontrados, error 2 para los argumentos con      *
'*                nombre requeridos y no encontrados, por último,      *
'*                error 4 para los combos de argumentos opcionales     *
'*                (un combo de argumentos opcionales es aquel          *
'*                conjunto de argumentos opcionales que es requerido   *
'*                que se pase al menos uno de ellos y que si se pasa   *
'*                más de uno se ignorarán aquellos que estén detrás    *
'*                en la prioridad entre ellos; una característica      *
'*                clara de lo que es un combo de argumentos es cuando  *
'*                dos omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1 'As Boolean
    Dim bol_Error2 'As Boolean
    Dim bol_Error4 'As Boolean
    Dim obj_FS 'As Scripting.FileSystemObject
    Dim obj_TS 'As Scripting.TextStream
    Dim str_Dominio 'As String

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False

	'Si hay que mostrar la ayuda, lo hacemos y terminamos
	'la ejecución
	If WScript.Arguments.Named.Exists("?") Then
	
		Call s_Ayuda("********************" & vbCrLf & _
		             "*       AYUDA      *" & vbCrLf & _
		             "********************")
		             
		WScript.Quit 0
		
	End If
 
    'Revisamos si están todos los argumentos
    'sin nombre requeridos
    If WScript.Arguments.Unnamed.Count < 1 Then

        str_Error = "Error 1, falta/n argumento/s sin " & _
                    "nombre requerido/s" & vbCrLf
        bol_Error1 = True

    Else

    'Guardamos los argumentos en las variables
    'correspondientes
        If _
          WScript.Arguments.Unnamed.Count - 1 _
          >= 0 Then _
               str_NuevaClave = _
                       WScript.Arguments.Unnamed(0)


    End If

    'Revisamos que esté el argumento
    '/T (fichero)
    If WScript.Arguments.Named.Exists("T") Then

        str_TXT = _
            WScript.Arguments.Named("T")

    End If

    'Revisamos que esté el argumento
    '/U (usuario)
    If WScript.Arguments.Named.Exists("U") Then

        str_UsuarioACambiar =  _
               WScript.Arguments.Named("U")
               

    End If

    'Revisamos si ha sido pasado el argumento
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then

        Set obj_FS = CreateObject( _
               "Scripting.FileSystemObject")
        Set obj_TS = obj_FS.OpenTextFile( _
                             Wscript.Arguments.Named("F"))

        arr_Equipos = Split(obj_TS.ReadAll,vbCrLf)

    'Revisamos si ha sido pasado el argumento
    '/E (equipos)
    Elseif WScript.Arguments.Named.Exists("E") Then

        arr_Equipos = _
               Split(WScript.Arguments.Named("E"),",")

    'Revisamos si ha sido pasado el argumento
    '/D (dominio)
    Elseif WScript.Arguments.Named.Exists("D") Then

         'Revisamos que esté el argumento
        '/N (equipos)
        If WScript.Arguments.Named.Exists("N") Then

            str_Excluidos =  _
                    Join(Split( _
                            WScript.Arguments.Named("N"), _
                            ","),"")

        End If

        'Definimos variables para poder hacer una consulta
        'que nos devuelva los nombres de los equipos del
        'dominio
        
        'Constante para consultar el árbol de dominio
        'completo
        Const ADS_SCOPE_SUBTREE = 2
        
        'Variables para la consulta
        Dim obj_Conexion 'As ADODB.Connection
        Dim obj_Comando 'As ADODB.Command
        Dim rs_Equipos 'As ADODB.Recordset
        
        'Contador de equipos
        Dim int_Equipo 'As Integer
        
        'Obtenemos el nombre del dominio en formato
        'LDAP
        str_Dominio = "DC=" & _
               Replace(WScript.Arguments.Named("D"), _
                       ".", _
                       ",DC=")
                       
        'Creamos una conexión ADO
        Set obj_Conexion = CreateObject("ADODB.Connection")
        
        'Creamos un objeto comando de ADO
        Set obj_Comando =   CreateObject("ADODB.Command")
        
        'Establecemos el proveedor ADSI
        obj_Conexion.Provider = "ADsDSOObject"
        
        'Abrimos la conexión
        obj_Conexion.Open "Active Directory Provider"
        
        'Asignamos al objeto comando la conexión
        Set obj_Comando.ActiveConnection = obj_Conexion
        
        'Establecemos la consulta 
        obj_Comando.CommandText = _
            "Select Name, Location from 'LDAP://" & _
                    str_Dominio & "' " _
                & "Where objectClass='computer'"
                 
        'Establecemos el tamaño de página
        obj_Comando.Properties("Page Size") = 1000
        
        'Estabecemos que se realice la búsqueda en todo el árbol
        obj_Comando.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
        
        'Creamos el recordset con la consulta
        Set rs_Equipos = obj_Comando.Execute
        
        'Nos situamos en el primer registro
        rs_Equipos.MoveFirst
        
        'Iniciamos la variable donde almacenaremos los nombres
        'de los equipos
        str_Equipos = ""
        
        'Recorremos el recordset hasta llegar al final
        Do Until rs_Equipos.EOF
            
            'Si no está en la lista de excluidos o no hay lista
            'de excluidos
            If InStr(1,str_Excluidos, _
                      rs_Equipos.Fields("Name").Value, _
                      1) = 0  _
            Or Len(str_Excluidos) = 0 Then
            
                'Añadimos el equipo al conjunto
                str_Equipos = str_Equipos & _
                              rs_Equipos.Fields("Name").Value & _
                              ","
                                              
            End If
            
            'Vamos al siguiente registro
            rs_Equipos.MoveNext
        
        Loop
        
        'Si hemos encontrado algún equipo, str_Equipos no está vacío
        If Len(str_Equipos) > 0 Then
        
            'Quitamos la coma final de str_Equipos
            str_Equipos = Left(str_Equipos, _
                              Len(str_Equipos) - 1)         
                              
            'Cargamos arr_Equipos haciendo Split a str_Equipos con
            'la coma como separador
            arr_Equipos = Split(str_Equipos,",")
            
        End If

    Else

        'No ha aparecido ninguno de los argumentos integrantes de
        'un combo de argumentos. Almacenamos el mensaje y el
        'número de error (error 4)
        str_Error = str_Error & _
                    "Error 4: No se ha pasado " & _
                    "ninguno de los argumentos" & _
                    " integrantes de un combo " & _
                    "de argumentos. En un comb" & _
                    "o de argumentos todos los" & _
                    " argumentos son opcionale" & _
                    "s, sin embargo debe ser p" & _
                    "asado uno al menos; si se" & _
                    " pasa más de uno, sólo se" & _
                    " tendrá en cuenta uno, el" & _
                    " primero en el orden de a" & _
                    "rgumentos del combo. En e" & _
                    "ste caso los argumentos q" & _
                    "ue integran el combo son " & _
                    "(en orden de prioridad): "
        str_Error = str_Error & _
                    """/F""" & _
                    ", ""/E""" & _
                    " y ""/D""" & vbCrLf
        bol_Error4 = True

    End If

    'Preparamos las variables de devolucion:
    'el entero como suma de los posibles errores 1, 2 y 4
    int_Error = Abs(bol_Error1) + _
                (2 * Abs(bol_Error2)) + _
                (4 * Abs(bol_Error4))
    'La devolucion de la función será True en caso de
    'haber alguno de los errores
    bol_Devolucion = (bol_Error1 Or bol_Error2 Or bol_Error4)

    'Hacemos la devolución de la función
    f_RevisarArgumentos = bol_Devolucion

End Function 'f_RevisarArgumentos

Sub s_Ayuda(str_Error)
'***********************************************************************
'* Procedimiento: s_Ayuda                                              *
'* Tipo         : Sub                                                  *
'* Devolución   :                                                      *
'* Fecha y Hora : 23/07/2007 19:12:15                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si no viene   *
'*                será mostrado antes de la línea; pensado para que    *
'*                se muestre un error que se haya detectado.           *
'***********************************************************************

    'Si hay que mostrar algún texto previo a la ayuda, lo hacemos
    If Len(str_Error) > 0 Then

        WScript.Echo str_Error & vbCrLf & vbCrLf

    End If

    'A continuación, mostramos la ayuda por pantalla
    WScript.Echo "Este script permite cambiar la contraseña a un us" & _
                 "uario local en uno o varios"
    WScript.Echo "equipos. Ideal para cambiar la contraseña al admi" & _
                 "nistrador local de los equipos"
    WScript.Echo "de un dominio. El script permite cambiar la contr" & _
                 "aseña de un usuario específico"
    WScript.Echo "o del administrador local si no se establece a qu" & _
                 "é usuario se cambiará la"
    WScript.Echo "contraseña. Dado que como nombre del usuario admi" & _
                 "nistrador local del equipo"
    WScript.Echo "podríamos tener diferentes nombres de usuario, po" & _
                 "r tratarse sistemas operativos"
    WScript.Echo "en diferentes idiomas o por haber sido cambiado e" & _
                 "n la directiva ""Configuración"
    WScript.Echo "de equipoConfiguración de WindowsConfiguración " & _
                 "de seguridadDirectivas"
    WScript.Echo "localesOpciones de seguridadCuentas: cambiar el" & _
                 " nombre de la cuenta del"
    WScript.Echo "administrador"", ya sea en las políticas locales " & _
                 "(gpedit.msc) o por GPO, el"
    WScript.Echo "script averiguará en cada equipo qué nombre tiene" & _
                 " el usuario administrador"
    WScript.Echo "local, para así cambiar su contraseña sea cual se" & _
                 "a su nombre. El script deberá"
    WScript.Echo "ser lanzado por un usuario que tenga los permisos" & _
                 " necesarios para realizar esta"
    WScript.Echo "tarea (un administrador de dominio, por ejemplo)."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] cambiar-password.v" & _
                 "bs [/E:equipos] [/F:fichero]"
    WScript.Echo "[/D:dominio] [/N:equipos] [/T:fichero] [/U:usuari" & _
                 "o] [/?] contraseña"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- contraseña (Requerido):"
    WScript.Echo "Nueva contraseña a establecer."
    WScript.Echo ""
    WScript.Echo "- /E: equipos (Opcional):"
    WScript.Echo "Lista de equipos a los que se cambiará la contras" & _
                 "eña del"
    WScript.Echo "usuario local."
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "Fichero con los nombres de los equipos a los que " & _
                 "se cambiará la"
    WScript.Echo "contraseña del usuario local, un nombre de equipo" & _
                 " por línea."
    WScript.Echo ""
    WScript.Echo "- /D: dominio (Opcional):"
    WScript.Echo "Nombre DNS (dominio.com) del dominio al que se ca" & _
                 "mbiará la"
    WScript.Echo "contraseña del usuario local de sus equipos."
    WScript.Echo ""
    WScript.Echo "- /N: equipos (Opcional):"
    WScript.Echo "Lista de equipos a los que se excluirá del proces" & _
                 "o. Necesaria"
    WScript.Echo "cuando se ha establecido el argumento D, nombre d" & _
                 "e dominio,"
    WScript.Echo "pues en ese caso el script procesa todos los equi" & _
                 "pos del"
    WScript.Echo "dominio y podríamos desear que no lo haga en dete" & _
                 "rminados"
    WScript.Echo "equipos.."
    WScript.Echo ""
    WScript.Echo "- /T: fichero (Opcional):"
    WScript.Echo "Fichero de texto, de valores separados por tabula" & _
                 "dor (ideal"
    WScript.Echo "para ser abierto con Excel), con los resultados o" & _
                 "btenidos en la"
    WScript.Echo "ejecución del script. Si se omite este argumento, la"
    WScript.Echo "información se mostrará por pantalla."
    WScript.Echo ""
    WScript.Echo "- /U: usuario (Opcional):"
    WScript.Echo "Nombre de usuario de equipo local al que se quier" & _
                 "e cambiar la"
    WScript.Echo "contraseña. Si se omite, se cambiará al administr" & _
                 "ador local del"
    WScript.Echo "equipo."
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Cambia a ""nueva contraseña"" la contraseña del" & _
                 " usuario administrador local de"
    WScript.Echo "los equipos del dominio bichosmalos.mordor.gov, e" & _
                 "xcluyendo los equipos"
    WScript.Echo "troll,wargo de este cambio.:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-password.vbs /D:bichosma" & _
                 "los.mordor.gov /N:troll,wargo"
    WScript.Echo """nueva contraseña"""
    WScript.Echo ""
    WScript.Echo "- Cambia a ""nueva contraseña"" la contraseña del" & _
                 " usuario administrador local de"
    WScript.Echo "los equipos snaug,grima,balrog, guardando los res" & _
                 "ultados en el fichero separado"
    WScript.Echo "por tabuladores c:\listados\cambiar.txt:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-password.vbs /E:snaug,gr" & _
                 "ima,balrog"
    WScript.Echo "/T:c:\listados\cambiar.txt ""nueva contraseña"""
    WScript.Echo ""
    WScript.Echo "- Cambia a ""nueva contraseña"" la contraseña del" & _
                 " usuario administrador local de"
    WScript.Echo "los equipos listados en el fichero c:mordorcamb" & _
                 "iar.txt, guardando los"
    WScript.Echo "resultados en el fichero separado por tabuladores" & _
                 " c:\listados\cambiar.txt:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-password.vbs /F:c:\mordo" & _
                 "r\cambiar.txt"
    WScript.Echo "/T:c:\listados\cambiar.txt ""nueva contraseña"""
    WScript.Echo ""
    WScript.Echo "- Cambia a ""nueva contraseña"" la contraseña del" & _
                 " usuario local smeagol de los"
    WScript.Echo "equipos listados en el fichero c:\mordor\cambiar." & _
                 "txt, mostrando por pantalla"
    WScript.Echo "los resultados:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo cambiar-password.vbs /F:c:\mordo" & _
                 "r\cambiar.txt /U:smeagol"
    WScript.Echo """nueva contraseña"""
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_EquipoResponde(str_Equipo) 'As Boolean
'***********************************************************************
'* Procedimiento: f_EquipoResponde                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo (ya sea      *
'*                nombre en sí o IP) y, por medio de PING, revisa si   *
'*                el equipo responde o no                              *
'***********************************************************************

    Dim obj_SH 'As wshShell
    Dim obj_FS 'As Scripting.FileSystemObject
    Dim obj_TS 'As Scripting.TextStream
    Dim str_ContenidoFichero 'As String
    Dim str_FicheroTemporal 'As String

    'Creamos los objetos FileSystem y Shell
    Set obj_SH = CreateObject("WScript.Shell")
    Set obj_FS = CreateObject("Scripting.FileSystemObject")

    'Establecemos el fichero temporal, con el nombre
    '"temp.txt", en la ruta de de la carpeta que indique
    'la variable de entorno TEMP
    str_FicheroTemporal = _
             obj_SH.ExpandEnvironmentStrings( _
                                 "%TEMP%\temp.txt")

    'Ejecutamos el ping volcando la salida en el
    'fichero temporal. Sólo esperaremos un eco ("-n 1")
    obj_SH.Run "cmd /c ping -n 1 " & str_Equipo & " > """ & _
                  str_FicheroTemporal & """", 0, True

    'Abrimos el fichero temporal sobre el objeto fichero
    Set obj_TS = obj_FS.OpenTextFile( _
                              str_FicheroTemporal, 1, False)

    'Volcamos el contenido del fichero temporal
    'en str_ContenidoFichero
    str_ContenidoFichero = obj_TS.ReadAll

    'Cerramos el fichero temporal y vaciamos su variable
    obj_TS.Close
    Set obj_TS = Nothing

    'Borramos el fichero temporal y vaciamos
    'los objetos Shell y FileSystem
    obj_FS.DeleteFile (str_FicheroTemporal)
    Set obj_FS = Nothing
    Set obj_SH = Nothing

    'Si encontramos la cadena "TTL=" significa
    'que el equipo respondió y por tanto la función
    'devuelve True, en caso contrario significa que
    'no respondió el equipo y por tanto devuelve
    'False
    If InStr(str_ContenidoFichero, "TTL=") > 0 Then
    
        f_EquipoResponde = True
        
    Else
    
        f_EquipoResponde = False
        
    End If

End Function 'f_EquipoResponde

Function f_NombreAdministrador(str_Equipo) 'As String
'***********************************************************************
'* Procedimiento: f_NombreAdministrador                                *
'* Tipo         : Función                                              *
'* Devolución   : Cadena                                               *
'* Fecha y Hora : 23/07/2007 16:10:04                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo y devuelve   *
'*                el nombre de su usuario administrador. Para ello     *
'*                conecta con el servicio WMI del equipo, lista los    *
'*                SIDs de los usuarios locales y busca aquel que       *
'*                empiece por "S-1-5-" y termine por "-500",           *
'*                características propias de la cuenta de              *
'*                administrador local de un equipo. Es útil cuando     *
'*                hay equipos en diferentes idiomas o se ha            *
'*                establecido la directiva "Configuración de           *
'*                equipo\Configuración de Windows\Configuración de     *
'*                seguridad\Directivas locales\Opciones de             *
'*                seguridad\Cuentas: cambiar el nombre de la cuenta    *
'*                del administrador", ya sea en las directivas         *
'*                locales del equipo (gpedit.msc) o por medio de una   *
'*                GPO. Una vez localizado el SID, se obtiene el        *
'*                nombre y es devuelto por la función.                 *
'***********************************************************************

	Dim obj_ServicioWMI 'As sWbemService
	Dim obj_Usuario     'As IADsUser
	Dim col_Usuarios    'As IAdsUsers
	Dim str_Consulta    'As String

	'Creamos un objeto sWbemService
	Set obj_ServicioWMI = GetObject( _
	             "winmgmts:{impersonationLevel=impersonate}!\" & _
					str_Equipo & "root\CIMV2")
					
	'Establecemos la consulta que devolverá las cuentas de usuario
	'locales de equipo
	str_Consulta = "SELECT * FROM Win32_Account WHERE Domain = '" & _
				   str_Equipo & "'"
				   
	'Ejecutamos la consulta, obteniendo una colección de usuarios
	Set col_Usuarios = obj_ServicioWMI.ExecQuery(str_Consulta)
	
	'Recorremos la colección de usuarios
	For Each obj_Usuario in col_Usuarios
	
		'Si el usuario es el administrador local...
		If (Left(obj_Usuario.SID, 6) = "S-1-5-" _
		And Right(obj_Usuario.SID,4) = "-500") Then
		
			'Devolvemos su nombre y salimos del bucle
			f_NombreAdministrador = obj_Usuario.Name
			Exit For
			
		End If
		
	Next
	
	'Limpieza de la parte posterior saliente :-)
	Set obj_Usuario = Nothing
	Set col_Usuarios = Nothing
	Set obj_ServicioWMI = Nothing

End Function 'f_NombreAdministrador

Function f_IIf(bol_Expresion, _
               var_Verdadero, _
               var_Falso)
'***********************************************************************
'* Procedimiento: f_IIf                                                *
'* Tipo         : Función                                              *
'* Devolución   : Variant                                              *
'* Fecha y Hora : Julio de 2007                                        *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función emula la función Iif de VBA.Recibe una  *
'*                booleana, que será el resultado de una expresión     *
'*                que se ponga como parámetro al llamar la función,    *
'*                tal y como se hace en la función IIf de VBA, y       *
'*                devolverá lo que se pase como parámetro              *
'*                var_Verdadero, si la booleana es verdadera o lo que  *
'*                se pase como parámetro var_Falso si la booleana es   *
'*                falsa.                                               *
'***********************************************************************

    if bol_Expresion Then

        f_IIF = var_Verdadero

    Else

        f_IIf = var_Falso

    End If

End Function 'f_IIf

 

 

50 respuestas to “Script VBScript Para Cambiar La Contraseña A Un Usuario Local En Uno O Varios Equipos”

  1. natalia said

    quiero cambiar la comtraseña de micorreohoy mismo

  2. urpiano said

    Natalia,

    Este script es para cambiar las contraseña de usuario de Windows, no del correo. Las del correo deberás cambiarlas en la página de adminsitración de tu correo, que si es de tu ISP, suele haber algúna parte en su sitio Web donde puedas hacer esto.

  3. Damian said

    GRacias funciono correctamente.

    SAludos

  4. GABO said

    DE PURA CASUALIDAD SABRIAS COMO SACAR DE DOMINIO UNA PC POR MEDIO DE UN VBSCRIPT ?

    ligacb@terra.com.mx
    ligacb@prodigy.net.mx

    GRACIAS ESPERO RESPUESTA.

  5. urpiano said

    Gabo,

    En el propio Script Center de Microsoft tienes un ejemplo:

    Unjoin a Computer from a Domain

    Por cierto, no te recomiendo que pongas cuentas de correo válidas en una página web, foro o comentarios de un blog, pues las puede captar un robot de los que usan los spamers y verte inundado de spam a partir de ese momento. Deberías haberlas enmascarado, algo así como:

    ligacb.quitaesto@yestotambien.terra.com.mx
    ligacbarrobaprodigypuntonetpuntomx

  6. Carlos said

    Equipo Resultado Nº Error Error Usuario
    mindway No se ha podido cambiar -2147022651 admin

  7. urpiano said

    Carlos,

    Ese error lo que dice es que la contraseña no cumple con los requerimientos de complejidad (longitud,etc.).

  8. Carlos said

    cual es su correo urpiano , usted es lo maximo.

    dejeme probar y le aviso

  9. urpiano said

    Carlos,

    La filosofía de esto es que los problemas que tengas los expongas aquí, de esa manera o te los soluciono yo o te los soluciona otro visitante y además otra persona con el mismo problema puede ver la solución.

  10. shayro said

    Hola a todos ! Los molesto por lo siguiente necesitaria un Script que la idea es correrlo a traves de una GPO de inicio de sesion , que de una lista de usuarios que yo le de en un archivo.txt me chekeara si el o los usuarios de esa lista pertenecen al grupo local Administradores del pc si esta en la lista y esta en el grupo no los toque , sino esta en la lista y esta en el grupo lo borre, , sera mucho pedir ? si que ne la vuelta hay unos cuantos Mostros capaces de lograrlo , recien estoy arrancando con el tema de los Scripts y no soy capaz todavia de crear algo asi , y lo necesito!!.

    que lo haga solo con usuarios dentro de este grupo local no con grupos , como pueden ser grupos globales estos ultimos que no los toque ya que tengo al grupo domain admins y un grupo de soporte alli tambien

    Gracias por lo que puedan hacer.

  11. Alejandra said

    Hola buenas tardes me podrian ayudar a bar cual es el script para renombrar el password de la Pcs locales del dominio obvio mediante un scriot y pues por me dio de una politica.
    saludos

  12. PILI said

    Hola, a mi me funciona el script bien con clientes XP, pero para clientes con S.O vista no me funciona, no me saca error de mensaje, no pasa nada. Alguien me puede colaborar para el cambio de contraseña para clientes vista? tienen alguna idea de que puede estar faltando?
    Muchas Gracias!
    PILI

  13. PILI said

    Hola Alejandra, yo probe para clientes XP y funciono. Los pasos son asi:
    1-Copia el script que esta en fondo gris a partir de la linea: ‘Exigimos la declaración de variables Option Explicit. lo copias en un archivo block de notas y lo guardas con ext vbs.

    despues te vas al DA en Computer Configuration->Windows Settings->Scripts y en Startup le das click. alli se te abre una ventana, en la parte de abajo en show files le das click y alli copias el script. despues vas al boton add, alli en browse, seleccionas el script, y en parameters escribes-> (ejemplo para el cambio de un equipo)->/E:nombre_pc /D:dominio.com /U:Administrador «contraseñanueva»
    en E: colocas el nombre de l amaquina de la que quieres cambiar.
    D: Es el dominio al que perteneces las maquinas
    U: Usuario local al que se le quiere cambiar la contraseña
    «contraseña nueva»-> password que vas a colocar como nuevo.
    Espero sea mas claro para ti!
    PILI

  14. urpiano said

    PILI,

    Este script no está pensado para ejecutarlo como GPO, la idea es ejecutarlo desde la línea de comandos del propio equipo del administrador.

  15. urpiano said

    Alejandra,

    Mira si esto te puede valer:

    Cambiar Password de Administrador Local de Clientes

  16. pez_pijo said

    YO tome la funcion que trae el nombre del administrado local,y a mi no me devuelve el nombre del administrador, si lo cambiaron. Poque ???? Siempre me devulelve Administrdores. Como lo puedo solucionar??

  17. Christian Castellanos said

    Buenos Dias: Perfecto funcionamiento. Muchas Gracias. Una pregunta…..no hay alguna forma de pasarle como parametro en vez del nombre del pc la ip? He probado pero no lo hace. Es que hay unos equipos que no responde ping por el nombre.

    Muchas Gracias

    • urpiano said

      Christian,

      Requeriría hacer algunas modificaciones, pues para poder acceder a la cuenta del usuario es necesario saber el nombre del equipo, y si eso no es capaz de hacerlo tu red, será necesario obtener el nombre conectando al WMI del equipo y mirando en su clase Win32_OperatingSystem la propiedad CSName. Así que habría que modificar el script para que mirase si se le ha pasado una IP en lugar de un nombre y en ese caso conectar al servicio WMI del equipo y mirar CSName de la clase Win32_OperatingSystem, para así ya poder cambiar la contraseña. A ver si tengo un rato y lo hago…

  18. Adriana said

    Hola. Me puedes ayudar a obtener un reporte de todos los administradores locales de las máquinas de mi red, y de acuerdo a ese reporte se pueden eliminar las cuentas que no deban tener ese privilegio?

  19. Rafael Sabater said

    Buenas, ante todo agradecer este script que me ha solucionado un gran problema.

    Quisiera hacer una propuesta de mejora para este script, ya que para dominios más o menos grandes como pudiera ser el que administro, los cuales tengan varias delegaciones y demás, tenemos el AD separado en diferentes OU según la distribución geográfica y un número de servidores considerable, lo cual hace que usar el parámetro /n: pueda reslutar algo engorroso ya que la lista es bastante larga, y a la vez hace que ejecutar este comando en modo remoto (a equipos del dominio que están en otra franja horaria/geográfica y nos conectamos a ellos a través de VPN’s) pueda resultar realmente engorroso (lanzarlo a más de 500 equipos puede ser algo muy lento), motivo por el cual con mis escasos conocimientos de vbscript me han llevado a cambiar este código:

    str_Dominio = «OU=Mexico,OU=Caribe,DC=» & _
    Replace(WScript.Arguments.Named(«D»), _
    «.», _
    «,DC=»)

    Por este otro:

    str_Dominio = «OU=Mexico,OU=Caribe,DC=» & _
    Replace(WScript.Arguments.Named(«D»), _
    «.», _
    «,DC=»)

    Por lo que opino que estaría bien poder disponer de otro parámetro ( /O: ) por ejemplo, para poder pasarle las OU en las que queremos que se ejecute. Ya que sino tengo que tener diferentes vbs por cada delegación (Que por otra parte no me dan ningún problema, es más para unificar vbs)

    Una vez mas agradecer enormemente la ayuda que me han prestado.

    Un cordial saludo.

    PD: ¿Dispone de algún script para hacer que un usuario de dominio se agregue al grupo administradores locales de las máquinas clientes? gracias.

  20. Carlos said

    Hola.

    Estoy intentando modificar el password del admor (dejarlo si password), pero no me deja. Que debo hacer?

  21. manga said

    muchas gracias por el aporte.

  22. urpiano said

    Carlos,

    Revisa las políticas de contraseña de ese equipo, vaya a ser que no permita esa configuración que dices. Eso lo haces con gpedit.msc, situándote en el panel del árbol en el nodo «Configuración del equipo\Configuración de usuario\Configuración de seguridad\Directivas de cuenta\Directiva de contraseñas»

  23. Mario said

    Estimado,

    Me aparece este error:
    Equipo Resultado Nº Error Error Usuario
    WinXP01 No se ha podido cambiar -2147463168 Usuario no encontrado

    Ejecuto lo siguiente:
    cscript //nologo cambiar-password.vbs /D:dominio /F:c:\cambiar.txt /T:c:\log.txt «Password»

    Por qué?. Me ayudan?.

    Saludos,

    • urpiano said

      Mario,

      Me temo que he vuelto a ser víctima de WordPress y su manía de cambiar lo que escribes. En concreto habían desaparecido algunas barras de división entera (\) del código. Prueba ahora.

      • Jose Maria said

        Hola Urpiano, enhorabuena por el script, esta muy trabajado, aunque me temo que yo tambien he sido victima del WordPress y eso que no lo uso, y al copiar y ejecutar el codigo me da el mismo error que a Mario ¿Podrias pasarmelo con los (\)?
        Un saludo

  24. ALEXANDER said

    Hola me pueden ayudar con lo siguiente
    1, tengo totaol duda de como hacer un script, haber si es asi, copio a un archivo bloc de notas y lo guardo con extension vbs?? luego en la linea de comados copio ese archivo vbs y se ejecuta solo?? como es???

    quisiera hacer un script para listar todas las cuentas del directotio activo

    Gracias

  25. Alejandro said

    Buenos dias a tod@s,

    quería decirte Urpiano que estoy aprendiendo mucho de ti. Y me alegra ver que segun que cosas las hago igual que tu. Eso me enorgullece, pues esta mas que claro que eres un crack!!

    suerte! que sigas teniendo tan buenas ideas!

  26. Alejandro said

    weee… equivoqué el email.

  27. Mio said

    Muchísimas gracias!! Miy, muy completo y sencillo de entender.

  28. Fabo said

    Bueno, el script esta muy elaborado, funciona chevere cuando las maquinas cliente no tienen activo el firewall de windows, pero estoy intentando ejecutarlo a 2500 clientes y los que tienen FW no responden ping, entonces los omite.

  29. manolo said

    Hola Fernando
    Estoy intentado cambiar la contraseña de dos equipos y los dos me dan el mismo error » No se ha podido cambiar -2147463168 Usuario no encontrado»

    El comando que estoy ejecutando es el siguiente:
    cscript cambiar-password.vbs /E:sistemas-red,czc7091thn /T:C:\cambiar-pass\listadoscambiar.txt «123456»

    También he probado con;
    cscript cambiar-password.vbs /E:sistemas-red,czc7091thn /T:C:\cambiar-pass\listadoscambiar.txt /U:Administrador «123456»

    El comando lo ejecuto desde un controlador de domino Win2k como Administrador y los pcs son uno WinXpPro o otro Win2KPro.

    Alguien me puede ayudar.

    • urpiano said

      Manolo,

      ¡Esto me pasa por no tratar con Windows 2000 desde hace tiempo, pues es algo documentado el que pase! A partir de Windows XP ese error ya no se produce, de ahí el que yo no haya tenido, y por tanto detectado, ese problema.

      Binding with the WinNT provider may generate error 0x80005000
      http://support.microsoft.com/default.aspx?scid=kb;en-us;321210

      Es decir es algo tan tonto como que donde pone en el código:

              Set obj_Usuario = GetObject("WinNT://" & str_Equipo & "/" & _
                                                    str_Usuario & ", user")
      

      Debería poner:

              Set obj_Usuario = GetObject("WinNT://" & str_Equipo & "/" & _
                                                    str_Usuario & ",user")
      
  30. Jose said

    Por favor como haría para cambiar la contraseña de todos los equipos dentro de una OU y no de todo el dominio???

    • urpiano said

      Para hacer eso, podrías agregar un nuevo parámetro que fuese el nombre distinguido de la OU, de manera que si este parámetro está presente, se ignora el parámetro D, de forma que la variable str_Dominio tenga como valor el nombre distinguido de la OU en lugar del dominio y así que la consulta se ejecute sobre la OU. Pongamos que al parámetro le llamamos OU, sería modificar en la función f_RevisarArgumentos que donde dice:

          'Revisamos si ha sido pasado el argumento
          '/D (dominio)
          Elseif WScript.Arguments.Named.Exists("D") Then
      
      Pase a poner:
      
      
          'Revisamos si ha sido pasado el argumento
          '/D (dominio) o el argumento OU (UnidadOrganizativa)
          Elseif WScript.Arguments.Named.Exists("D") Or WScript.Arguments.Named.Exists("OU") Then
      
      Y que donde pone:
      
      
              'Obtenemos el nombre del dominio en formato
              'LDAP
              str_Dominio = "DC=" & _
                     Replace(WScript.Arguments.Named("D"), _
                             ".", _
                             ",DC=")
      
      
      Ponga en su lugar:
      
      
              If WScript.Arguments.Named.Exists("OU") Then
                  'Asignamos el nombre distinguido de la OU como dominio
                  str_Dominio = WScript.Arguments.Named("OU")
              Else
                  'Obtenemos el nombre del dominio en formato
                  'LDAP
                  str_Dominio = "DC=" & _
                         Replace(WScript.Arguments.Named("D"), _
                                 ".", _
                                 ",DC=")
      
      
  31. Mary said

    hola Urpiano…he probado el script desde un DC en windows server 2008 r2, para hacer el cambio de contraseña de adm local en un equipo Windows 7 entrerprise q esta dentro del dominio y me sale el siguiente error: -2147463168 usuario no encontrado. El comando q ejecute fue el siguiente: C:\>cscript //nologo cambiar-pass.vbs /E:nombreequipo /D:dominio U/: administrator «nuevacontraseña» ..Porfavor ayuda para dar con la solucion a este error!!!

  32. evil said

    buenas tardes
    esto funciona para windows 7?

  33. Argenis said

    Esto es lo que estaba buscando, estoy a punto de comenzar un proyecto en la empresa donde estoy ya que es tiempo de realizar el cambio de contraseña de los casi 300 server que tenemos y el año pasado los hice de forma manual…. Lo probare pero desde ya altamente agradecido… Eres lo máximo… un Guru… jejeje

  34. xulub said

    Hola esta super el script !! yo no tengo dominio en active directory sin emabrgo si tengo mis equipos en un DNS pero al tratar de cambiar me aparece el siguiente error

    Equipo Resultado Nº Error Error Usuario
    x1.dns No se ha podido cambiar 70 Permission denied Administrator
    x2.dns No se ha podido cambiar 70 Permission denied Administrator

    Muchas gracias por el aporte Urpiano

  35. Laura said

    Perfecto!!! Muchas gracias, esta genial el script, estoy segura que le daré mucho uso.

  36. Buenas Tardes.

    estoy usando el script por que me parece de gran ayuda solo que al ejecutarlo en un equipo de prieba con win10 al ejecutar el script solo devuelve lo siguiente.

    cscript //nologo cambio.vbs /e VH94Y0G2 «patito2512»
    Equipo Resultado Nº Error Error Usuario

    y no realiza el cambio.

  37. Ana said

    Genial!!! Muchas Gracias por tu Script!! me ha ayudado muchísimo!!! un trabajo enorme!!!

  38. Jose said

    Gracias Urpiano, tenia rato tratando de aplicar cambio de nombre y clave a Admimistrador local por GPO y nada funciono, hasta ahora con tu script me funciona para cambio de clave por comando directo desde el servidor, lastima que no funciona con la modificacion que posteaste de las OU.

    Tengan presente que no funciona con el firewall activo el los equipos

  39. Jose said

    Post data: a mi me funciono con Win10

  40. MARIO BORGES said

    Said, el script cambia la contraseña de mi usuario «administrator» en mi Win SRVR 2012 ??, claro también a los equipos que se indique

  41. MARIO BORGES said

    Al ejecutar el script en mi equipo con Win 8.1., siempre obtengo el resultado que el Equipo No Responde al Ping.

Replica a Adriana Cancelar la respuesta