'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~* '*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°* '* 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