Alberto Robledo Cotrina – Windows Tools and Tips

Consejos y Herramientas sobre Tecnologías Microsoft

Archive for the ‘Scripts’ Category

Políticas de Contraseñas Granulares (Password Setting Objects): Automatización (y III)

Posted by Alberto Robledo en noviembre 20, 2008

Como podéis leer en el post anterior, además de utilizar la herramienta ADSI Edit también existe la posibilidad de generar objetos de tipo PSO mediante la importación de ficheros LDF. Este segundo modo es bastante más sencillo de implementar (no requiere tanto uso de ratón), pero es algo complejo de entender debido a ciertos parámetros que veremos a continuación.

Para situarnos, os recuerdo que en nuestro ejemplo contabamos con la siguiente estructura lógica de Directorio Activo:

Generacion de PSO - Estructura Logica de Directorio Activo
Generacion de PSO – Estructura Logica de Directorio Activo

En el anterior post generamos un objeto PSO para «Standard Users». En este caso generaremos vía LDF un objeto PSO adicional para cualquier cuenta ubicada dentro del contenedor «Service Accounts».

Se puede generar un fichero LDF con un contenido similar al siguiente:

dn: CN=Service Accounts PSO,CN=Password Settings Container,CN=System,DC=externalforest,DC=net
changetype: add
objectClass: msDS-PasswordSettings
msDS-MaximumPasswordAge: -9223372036854775808
msDS-MinimumPasswordAge: -864000000000
msDS-MinimumPasswordLength: 15
msDS-PasswordHistoryLength: 24
msDS-PasswordComplexityEnabled: TRUE
msDS-PasswordReversibleEncryptionEnabled: FALSE
msDS-LockoutObservationWindow: -36000000000
msDS-LockoutDuration: -864000000000
msDS-LockoutThreshold: 5
msDS-PasswordSettingsPrecedence: 100
msDS-PSOAppliesTO: CN=Service Accounts Group,OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net

Notad el extraño formato de los parámetros msDS-MinimumPasswordAge, msDS-MaximumPasswordAge, msDS-LockoutObservationWindow y msDS-LockoutDuration. Como podéis ver en el post anterior, debía imputarse algo tipo dias:horas:minutos:segundos, pero… ¿Que significan los números negativos?

Los números negativos significan que Directorio Activo almacena dichos valores en formato I8, o lo que es lo mismo, en múltiplos de -100 nanosegundos. Por tanto, las entidades de tiempo más comunes serán las siguientes:

  • 1 segundo = -1 * (10^7) = -10000000
  • 1 minuto = -60 * (10^7) = -600000000
  • 1 hora = -60 * 60 * (10^7) = -36000000000
  • 1 día = -24 * 60 * 60 * (10^7) = -864000000000

Por tanto basta con multiplicar los valores anteriores por el número de días, horas, minutos o segundos que consideréis necesario.

En el caso anterior los parámetros que nos ocupan son:

  • msDS-LockoutObservationWindow: -36000000000 (1 hora , es decir, 0:01:00:00
  • msDS-LockoutDuration: -864000000000  (1 día, es decir, 1:00:00:00)
  • msDS-MinimumPasswordAge: -864000000000 (1 día, es decir, 1:00:00:00)
  • msDS-MaximumPasswordAge: 9223372036854775808 = Nunca (never)

Observad que en msDS-PSOAppliesTo por claridad he especificado de nuevo el DN del grupo al que se aplica el PSO.

Una vez generado el fichero de texto bastará con importarlo mediante el siguiente comando:

  • Ldifde -i -f <Fichero.ldf>

De este modo se genera un segundo objeto PSO aplicado al grupo que debe contener las Cuentas de Servicio (Service Accounts) ubicadas dentro de la unidad organizativa correspondiente. De nuevo, si se precisa adecuar la pertenencia al grupo con las cuentas existentes dentro de la OU, bastará con ejecutar las siguientes líneas:

  • dsmod group «CN=Service Accounts Group,OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net» -chmbr «CN=Service Account 10,OU=SQL,OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net»
  • dsmod group «CN=Service Accounts Group,OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net» -rmmbr «CN=Service Account 10,OU=SQL,OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net»
  • dsquery user «OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net» | dsmod group «CN=Service Accounts Group,OU=Service Accounts,OU=Password Settings Demo,DC=externalforest,DC=net»  -addmbr

Recordad que las dos primeras sentencias sustituyen la membresía del grupo por un usuario concreto (Service Account 10 en este caso) y eliminan al usuario sustituido del grupo, para posteriormente agregar única y exclusivamente los usuarios ubicados dentro de dicha OU.

Por tanto, entre los dos últimos post habremos generado dos objetos PSO, uno manual mediante ADSI Edit aplicado a «Standard Users», y otro más automático mediante un fichero LDF y aplicado a «Service Accounts», tal como muestra la siguiente imagen:

PSO Generada Mediante Ficheros LDF (y LDIFDE)

PSO Generada Mediante Ficheros LDF (y LDIFDE)

Un saludo,

Alberto Robledo.

Posted in Directorio Activo, Linea de Comandos, Niveles Funcionales, Password Setting Object (PSO), Scripts, Windows 2008 | 1 Comment »

Gestión de Salida en Scripts VBS (StdOut) y PSExec 1.72+

Posted by Alberto Robledo en noviembre 7, 2008

Imagino que en alguna ocasión os habréis encontrado con la necesidad de diseñar Scripts que ejecutan una serie de comandos y gestionan su salida.

En primer lugar, y para ejecutar un comando desde un script VBS se precisa generar un objeto de Shell y otro de Ejecución. Por ejemplo, las siguientes líneas efectúan un IPConfig:

  • strCmd = «C:\Windows\System32\IPConfig.exe /all»
  • set objShell = CreateObject («Wscript.Shell»)
  • set objExec = objShell.Exec(strCmd)

Una vez ejecutada la tercera línea, se puede gestionar cada una de las líneas de la salida del comando anterior, por ejemplo, mediante un bucle While:

  • While Not objExec.StdOut.AtEndOfStream
    • strLine = objExec.StdOut.ReadLine
  • Wend

En el ejemplo anterior se puede trabajar perfectamente con el contenido de cada línea para tratar de localizar cualquier cadena de texto a tratar posteriormente (siguiendo con el ejemplo anterior, se puede detectar la dirección MAC de una tarjeta que disponga de una IP concreta).

Ahora bien… ¿que ocurre con la utilidad PSExec? ¿También permite redirigir su salida como cualquier otro comando?

Desafortunadamente, a partir de la versión 1.72, esto no es así… ya que Microsoft rediseñó dicha utilidad para solventar otros problemas. Por tanto, a raiz de dicha modificación, ya no es posible gestionar la salida StdOut del objeto de ejecución PSExec…

Ahora bien, si aún tenéis la necesidad de ejecutar desde VBS un comando en remoto y tratar su salida debidamente… ¿cual sería la solución?

Lamentablemente la solución pasa por hacer uso del método objShell.Run redirigiendo la salida del comando hacia un fichero de texto, y abriendo el fichero a posteriori para tratar su contenido. En nuestro ejemplo anterior las líneas a ejecutar serían las siguientes:

strCmd = «C:\Temp\PsTools\PSexec.exe \\%Computername% C:\Windows\System32\ipconfig.exe /all > C:\Temp\IPResult.txt»
Set objShell = CreateObject («Wscript.Shell»)
set objFso = CreateObject («Scripting.FileSystemObject»)

objShell.Run(strCmd)

Wscript.Sleep 2000

set objFile = objFso.OpenTextFile(«C:\Temp\IPResult.txt»)

While Not objFile.AtEndOfStream
    strLine = objFile.ReadLine
Wend

De este modo se puede generar un script que ejecute cierto comando en remoto (cambiando el nombre de equipo), y volcar la salida a un fichero para tratarla posteriormente de modo oportuno.

Un saludo,

Alberto Robledo

Posted in Gestion de Salida, objShell.Exec, objShell.Run, PSExec, Scripts, VBS | Leave a Comment »

Ejecucion de NTBackup desde Script con una Lista de Selección de Archivos y/o Carpetas

Posted by Alberto Robledo en noviembre 6, 2008

¿Habéis tenido alguna vez la necesidad de efectuar backups desde la línea de comandos o desde un script?

Cada gestor de backup tiene sus propios métodos… y NTBackup no podía ser menos. Éste permite generar un fichero de lista de selección con extensión BKS en el que se le indicarán, línea por línea, los ficheros o las carpetas a ser respaldados. Ahora bien, tiene truco… ya que el formato de fichero es Unicode.

La sintaxis de NTBackup es la siguiente:

  • NTBackup Backup @»Fichero de Seleccion.BKS» /M «Tipo de Backup» /J «Nombre de Trabajo» /F «Fichero Destino.BKF» /D «Descripción del Backup» /N «Nombre del Dispositivo» /V:YES /R:NO /L:f /RS:NO /HC:ON

Si queréis obtener más información sobre cada uno de los parámetros, podéis consultar la ayuda de NTBackup mediante el comando NTBackup /? (no tiene misterio alguno).

Ahora bien, se debe tener en cuenta que el fichero BKS debe ser generado en formato Unicode. Para ello existen, entre otros, dos modos sencillos de generar este fichero correctamente:

  • Generando el fichero de modo manual desde el Bloc de Notas, y guardando el fichero en formato Unicode (Encoding –> Unicode), y
  • Generando el fichero de modo automático desde un script, generando un fichero de texto de tipo Unicode.

Desde el Bloc de Notas no tiene ninguna complicación… y «el secreto» reside en generar el fichero en modo Unicode. Si os fijáis, la sintaxis del método CreateTextFile es la siguiente:

  • object.CreateTextFile(filename[, overwrite[, unicode]])

 El tercer parámetro de dicho método, cuando se habilita (True), guarda el fichero en formato Unicode… con lo que NTBackup será capaz de interpretar un fichero de selección generado de este modo.

Por ejemplo, un script que respalde de modo normal el directorio C:\Backup Folder, contendría lo siguiente:

Set fso = CreateObject(«Scripting.FileSystemObject»)
set ObjShell = CreateObject(«Wscript.Shell»)

strDestFolder    = «C:\Dest Folder»
strBackupFolder  = «C:\Backup Folder»
strBackupFile    = strDestFolder & «\Backup File.BKF»
strSelectionFile = strDestFolder & «\Selection File.BKS»

set objSelectionFile = fso.CreateTextFile(strSelectionFile,,True) ‘NOTA: Unicode = TRUE

objSelectionFile.WriteLine (strBackupFolder)

strNTBackupCmd = «NTBackup Backup » & Chr(34) & «@» & strSelectionFile & chr(34) & » /M Normal » & _
               » /J » & chr(34) & «Backup Job Name » & chr(34) & _
               » /F » & chr(34) & strBackupFile & chr(34) & _
               » /D » & chr(34) & «Backup Description» & chr(34) & _
               » /N » & chr(34) & «Backup Device Name » & chr(34) & _
               » /V:YES /R:NO /L:f /RS:NO /HC:ON»

‘  Wscript.Echo strNTBackupCmd

set objNTBackupCmd = Wscript.Exec(strNTBackupCMD)

Lo mejor de todo esto es que el contenido del fichero de selección, al ser generado desde un script, puede adaptarse a cualquier necesidad (por ejemplo, respaldando ficheros o carpetas generados en una fecha concreta).

Un saludo,

Alberto Robledo.

Posted in Lista de Seleccion, NTBackup, Scripts, Unicode, VBS | 1 Comment »

Generar Ficheros con Fecha/Hora desde un CMD

Posted by Alberto Robledo en octubre 23, 2008

No se si alguna vez os habréis encontrado con la necesidad de generar un fichero, a modo de log, con la fecha del día correspondiente, o la hora. Hacer esto en VBS es sencillo… pero ¿que ocurre si lo necesitas hacer en un BAT/CMD? ¿Se puede?

La respuesta es que, efectivamente, SE PUEDE… Puedes aprovechar la gestión de texto en cualquier variable de entorno. Yo he encontrado poca información (por no decir ninguna) de esta funcionalidad de la consola de comandos, y siempre que me ha surgido la necesidad, he tenido que volverme loco buscando «aquél CMD que tengo guardado donde hice esto…».

Vamos allá: En nuestro caso, utilizaremos el operador :~a,b, llamándole al final de la variable de entorno, y antes del último %.

Os explico su funcionamiento ya que es bastante complejo: El operador :~a,b se compone, como es evidente, de dos números, ‘a’ y ‘b’, tales que:

  • El número ‘a’ indica el inicio del texto a partir del que se obtiene el valor deseado (la primera posición es ‘0’), y
  • El número ‘b’ indica el número de caracteres que se desean tomar de dicho texto. Cabe destacar que, si ‘b’ es positivo, el texto indica las posiciones  tomadas desde el carácter número ‘a’ (inclusive) en adelante, y si ‘b’ es negativo, indica las posiciones tomadas desde el final del texto, hacia atrás, y hasta el número ‘a’

Como muestra, un botón. Generaremos nuestra variable de entorno del siguiente modo: set Texto=0123456789

Probaremos primero hacia delante:

  • Para obtener dos posiciones desde la quinta (+1 ya que empezamos en 0): echo %Texto:~5,2%, que nos devuelve el texto ‘56‘.
  • Para obtener tres posiciones, escribiremos echo %Texto:~5,3% que nos devuelve el texto ‘567‘…

Y ahora, hacia atrás:

  • Para eliminar los dos últimos carácteres, escribiremos echo %Texto:~5,-2% , lo que devuelve ‘567‘ (se «ha cargado» los dos últimos caracteres, ‘8’ y ‘9’),
  • Para eliminar el último carácter, escribiremos echo %Texto:~5,-1%… que devolverá ‘5678‘ ya que elimina el último carácter, el ‘9’.

Se le puede sacar el máximo jugo al operador anterior con las variables de entorno de hora y tiempo, y sobre todo en scripts de comandos. Por ejemplo, con una variable %Date% con valor 23/10/2008, tendremos que:

  • Echo %Date:~0,2% nos devolverá el día, ‘23‘,
  • Echo %Date:~3,2% nos devolverá el mes, ‘10‘, y
  • Echo %Date:~6,4% nos devolverá el año, ‘2008‘.

Lo mismo es aplicable a la hora: Con una variable %Time% con valor 14:08:09,52 tendremos que:

  • Echo %Time:~0,2% nos devolverá la hora, ‘14‘,
  • Echo %Time:~3,2% nos devolverá los minutos, ‘08‘, y
  • Echo %Time:~6,5% nos devolverá los segundos, ‘09,52‘.

Una vez entendido todo esto, podéis pasar a generar un fichero de texto de nombre, por ejemplo, «Log<FECHA><HORA>.log» de este modo:

  • Set Fecha=%Date:~0,2%%Date:~3,2%
  • Set Hora=%Time:~0,2%%Time:~3,2%
  • Echo «Texto Deseado» > Log%Fecha%%Hora%.log

Con las tres líneas anteriores se debe haber generado un fichero de texto de nombre Log23101408.log.

Puede ser complejo de entender, pero a mí me ha salvado ya de más de una… Con lo que os recomiendo que practiquéis, ya que un simple trozo de texto puede dar una potencia brutal a vuestros CMD.

Un saludo,

Alberto Robledo.

Posted in Fecha, Ficheros, Hora, Linea de Comandos, Scripts | 4 Comments »