Sunday, April 17, 2011

VirtualBox, Windows 2008 y wbadmin

Para volverse loco. Cada vez que empezaba un backup obtenía el siguiente error:


c:\#> wbadmin start systemstatebackup -backupTarget:e:

This would backup the system state from volume(s) Local Disk(C:) to e:.
Do you want to start the backup operation?
[Y] Yes [N] No Y

Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Creating the shadow copy of volumes requested for backup.
Identifying system state files to backup (This may take a few minutes)...

Summary of backup:
------------------

Backup of system state failed [17/04/2011 16:47]

Log of files successfully backed up
'C:\Windows\Logs\WindowsServerBackup\SystemStateBackup 17-04-2011 16-45-11.log'

Log of files for which backup failed
'C:\Windows\Logs\WindowsServerBackup\SystemStateBackup_Error 17-04-2011 16-45-11
.log'

Enumeration of the files failed.
The parameter is incorrect.

La respuesta a este error está en este link:
http://forums.virtualbox.org/viewtopic.php?f=7&t=23151

Un problema con el servicio vboxservice.

La solución, modificar la clave de registro
HKLM\System\CurrentControlSet\Services\VboxService

y modificar la ruta de system32\vboxservice.exe a c:\windows\system32\vboxservice.exe



Una vez hecho, el backup funciona sin problemas.

Monday, January 17, 2011

Mapa intereractivo del kernel de linux

Leo en esta entrada de muylinux sobre la existencia de un mapa interactivo del kernel de linux:
http://www.muylinux.com/2011/01/17/sumergete-en-el-kernel-2-6-36-con-su-mapa-interactivo/comment-page-1/#comment-47256.

El link directo al mapa: http://www.makelinux.net/kernel_map.shtml

Y para muestra un botón:

¡¡Impresionante!!

Wednesday, January 12, 2011

Monday, September 27, 2010

Introducción a VBScript


Introducción a VBScript

VBScript es un lenguaje de programación horrible, pero extremadamente útil
en el entorno de sistemas ya que durante años ha sido el lenguaje que por
excelencia se ha usado para la administración/automatización de Windows.

Se trata de un lenguaje interpretado, no compilado. Otros lenguajes interpretados
son JavaScript, perl, y salvando las distancias Python. El proceso que ejecuta los vbs es el WScript.exe


Seis cosas sobre VBS:

1. Los comentarios empiezan por '
2. Al iniciar el script decidimos si es necesario o no declarar las variables
  antes de usarlas: Option Explicit
3. El script se interrumpe ante cualquier error, a no ser que declaremos:
On Error Resume Next
4. Una instrucción es una línea (no ";" final)
5. Las variables se declaran con la expresión Dim
 Algunas consideraciones sobre variables:
- se puede declarar más de una a la vez separándolas por ","
- por convención, aquellas que apuntan a objetos empiezan por "obj"
         y las otras tienen nombres representativos.
6. Para asignar valor a una variable NO objeto: var = <valor>



' SCript de prueba que muestra una frase en un msgBox
Option Explicit

On Error Resume Next
Dim frase
frase="Bienvenido"

MsgBox frase



Probar:
1. Comentando la declaración de la variable (Dim frase)
2. Comentando la declaración de la variable y además el Resume Next
3. Todo lo anterior + el Option Explicit




Arrays:

0. Es necesario DECLARARLOS

1. La primera posición de una matriz es la 0. Así un Array de 10 elementos empieza
en el 0 y acaba en el 9

2. Pueden tener varias dimensiones, y contener diferentes tipos de datos.

3. Para añadir un elemento a un array indicamos en qué posición queremos añadirlo

Ejemplo: programa que declara un array de 2x10, y asigna valores. Luego muestra dos de ellos
Dim arrUsuarios(1,9)
arrUsuarios(0,0)= "Alex"
arrUsuarios(0,1)= "Garcia"
arrUsuarios(1,0)= "Jose"
arrUsuarios(1,1)= "Garrido"

MsgBox "El primer usuario es " & arrUsuarios(0,0) & " y el segundo " & arrUsuarios (1,0)

4. Hay arrays dinámicos, se declaran sin especificar sus elementos. P.e.
        Dim arrUsuarios()
y se les asigna un tamaño mediante las sentencias "ReDim" y "Redim Preserve"
        Redim arrUsuarios(9) 'la primera vez
        Redim Preserve arrUsuarios(10) 'para añadirle una fila más

5. Se pueden declarar/asignar mediante el uso de la función Array()
de esta otra forma:

Ejemplo:
 Dim arrUsuarios
 arrUsuarios = Array("valor1","valor2","valor3")
 ReDim Preserve arrUsuarios(10)


Convirtiendo Strings en Arrays gracias a la función Split(cad,separador)

 str = "alex,jose,maria,carla"
 arrNombres= Split(str,",")
 MsgBox arrstr(3)

Convirtiendo Arrays en Strings gracias a la función Join(array,separador)

 dim arrNombres
 arrNombres = Array("alex","jose","maria","carla")
 str = Join(arrNombres,";")
 MsgBox str




Tipos de datos

Ésta es la lista de los tipos de datos que tenemos en VBScript, y a continuación está la lista de las funciones para pasar de un tipo a otro.

Tipos de datos:


Funciones de conversión entre datos:



STATEMENTS y FUNCTIONS

En castellano también se habla como de Procedimientos y de Funciones. Ambos son una forma de reutilizar y ordenar el código, y ambos permiten el paso de parámetros. La diferencia entre ellos es:

Statements:
  1. no devuelven nada
  2. sus parámetros se pasan sin paréntesis
Functions:
  1. devuelven un valor, que por lo tanto habrá que recoger en una variable y procesar
  2. sus parámetros se pasan entre paréntesis

Para comprobar la diferencia entre uno y otro tipo de subrutina vamos a tomar como ejemplo el “MsgBox”, que es una subrutina que tanto puede ser un Statement como una Function según se invoque.
Cuando se usa la función MsgBox, el valor que devuelve es un número u otro en función del botón que se pulse en el cuadro de diálogo.

MsgBox "vbscript is in linguiji sicriti", 48 , "mensaje secreto"

(Poner captura)

Los parámetros que admite son:
1. String: que será el cuerpo del mensaje que se mostrará
2. Integer: que identifica el tipo de iconos/recuadro que aparecerá
3. String: que aparecerá en la barra de título

Ejemplo de MsgBox como Function primero, y como Statement posteriormente en el If ... Then

Dim valorElegido
valorElegido = MsgBox ("Desea continuar" & VbCrLf &  _
                        "en caso negativo lo tiene muy mal", _
                   vbYesNo , "Seguimos?")

If valorElegido = vbYes Then
        MsgBox ("Buena elección, continuemos")
Else MsgBox ("Ha pulsado NO, en junio su elección se verá cumplida")
End If

Ejemplo de la función InputBox que permite recoger texto introducido por el usuario:

Dim loginName
Dim confirmacion

loginName = InputBox ("Nombre del usuario a dar de alta")
confirmacion = MsgBox ("El nombre de usuario que introdujo es: " &  _
            loginName & VbCrLf & " es correcto?", _
            vbYesNo , "Continuar?")

If confirmacion = vbYes Then
        MsgBox  "Usted ha decidido continuar",0,"titulo"
Else
           MsgBox  "Usted ha decidido NO continuar"
End If

Notas:
  1. VbCrLf es una Constante definida en VBS que corresponde al valor de salto de línea y retorno de carro en un texto
  2. El “_” a final de línea indica que la instrucción sigue en la línea siguiente.
  3. vbYesNo es una constante númerica igual a 4, y que corresponde con el cuadro con Yes y No cuando se pasa como segundo parámetro de MsgBox

Tipos de MsgBox y constantes asociadas:

Valores devueltos por MsgBox según el botón que se pulse:

Algunas funciones de uso muy común:

De fecha:
Year, Month, Day, WeekDay, Hour, Minute, Second

De conversión de tipo:
Cstr, CBool, ... las que aparecían en el cuadro anterior

De cadena (strings):
Join y Split, que hemos visto al hablar de Arrays
InStr y InStrRev para hacer búsquedas
Len
Replace
LCase y UCase
LTrim, RTrim, Trim
LBound, UBound



Monday, November 23, 2009

VBScript: manejo de cadenas de texto

VBScript: manejo de cadenas de texto



Algunas de las funciones más habituales para manipular cadenas de texto son:


Function
Description
InStr
Returns the position of the first occurrence of
one string within another. The search begins at the first character of the
string
InStrRev
Returns the position of the first occurrence of one string
within another. The search begins at the last character of the string
LCase
Converts a specified string to lowercase
Left
Returns a specified number of characters from
the left side of a string
Len
Returns the number of characters in a string
LTrim
Removes spaces on the left side of a string
RTrim
Removes spaces on the right side of a string
Trim
Removes spaces on both the left and the right side of a
string
Mid
Returns a specified number of characters from a
string
Replace
Replaces a specified part of a string with another string a
specified number of times
Right
Returns a specified number of characters from
the right side of a string
Space
Returns a string that consists of a specified number of
spaces
StrComp
Compares two strings and returns a value that represents
the result of the comparison
String
Returns a string that contains a repeating character of a
specified length
StrReverse
Reverses a string
UCase
Converts a specified string to uppercase

(la fuente es: http://www.w3schools.com/VBscript/vbscript_ref_functions.asp)


A menudo, los ficheros que procesamos tienen líneas con varios campos delimitados por algún tipo de carácter. Todos los lenguajes de programación/scripting poseen algun método para procesar cadenas divididas en campos. En VBScript esta función es:

Split(expression[,delimiter[,count[,compare]]])


La descripción de sus parámetros tal y como la muestran en
http://www.w3schools.com/VBscript/func_split.asp

Parameter
Description
expression
Required. A string expression that contains substrings
and delimiters
delimiter
Optional. A string character used to identify substring
limits. Default is the space character
count
Optional. The number of substrings to be returned. -1
indicates that all substrings are returned
compare
Optional. Specifies the string comparison to use.
Can
have one of the following values:

  • 0 = vbBinaryCompare - Perform a binary comparison
  • 1 = vbTextCompare - Perform a textual comparison

Ejemplo de uso:

Se trata de un script que comprueba la existencia de un fichero de texto, y si existe lo abre y lo recorre línea a línea procesando cada una de ellas. Las líneas contienen campos separados por ";" y el script nos muestra primero la línea y a continuación los campos que contiene.

dim oshell
dim fich, fs

'ubicación del fichero de altas
nombre_fich="c:\tmp\altas.txt"

set oshell=createobject("WScript.shell")
set fs=createobject("scripting.FileSystemObject")

'comprobamos que exista el fichero de altas
if not fs.FileExists(nombre_fich) then
  wscript.echo "no existe el fichero "& nombre_fich
  WScript.Quit 4
end if

'Si hemos llegado hasta aquí es que existe y lo abrimos
set fich=fs.OpenTextFile (nombre_fich, 1, "True" )

'Lo recorremos
Do While fich.atEndOfStream <> True
  linea=fich.ReadLine
' Ahora mostramos la línea leída
  wscript.echo linea
' Parseamos los campos
  campos = split(linea,";")
  for each a in campos
    wscript.echo "valor del campo: "&a
  next
Loop

fich.close



Evidentemente, podríamos hacer algo más útil que mostrar la línea, como por ejemplo usar un objeto de tipo shell para ejecutar dsadd user <usuario> -memberof <grupos>