exit status codes de robocopy

0: no se hizo copia ni hubo errores. el origen y el destino están sincronizados.
1: copia exitosa.
2: se encontraron archivos en el destino que no estan en el origen
3: copia exitosa, ademas se encontraron archivos en el destino que no estan en el origen.
4 o mayor: error (hay codigos de error especificos, pero lo importante es saber que ha fallado)

recorrer un archivo de texto sin cargarlo en memoria

Para recorrer un archivo de texto, podemos hacerlo de la siguiente manera
$archivo = get-content archivo.txt
y luego para recorrerlo
foreach ($linea in $archivo){
"muestro la linea: $linea"
}


el problema, es que get-content carga el archivo entero en memoria, y si bien, el archivo ocupa pocos megas, no es problema, pero en el caso de un archivo que mide gigas (como un log), nos va a cargar el archivo entero en memoria, por lo tanto, podemos ocupar .NET para recorrerlo sin que lo cargue, de la siguiente manera:

$archivo = [System.IO.File]::OpenText("archivo.txt")

while ($archivo.peek() -ne -1){
$linea = $archivo.ReadLine()
"muestro la linea: $linea"
}
$archivo.Close()

Habilitar y deshabilitar un usuario en Active Directory

$cn = "CN=Jorge Mestre,OU=Users,DC=ar,DC=lugsaju,DC=com"
$usuario = new-object DirectoryServices.DirectoryEntry("LDAP://$cn")

$usuario.userAccountControl=66050 # deshabilitar
$usuario.setinfo()

$usuario.userAccountControl=66048 # habilitar
$usuario.setinfo()

"Mover" propiedades entre objetos en Active Directory

Teniendo dos DNs, creamos los objetos correspondientes:

$cnA = ""CN=grupoA,OU=Groups,DC=ar,DC=lugsaju,DC=com"
$cnB = ""CN=grupoB,OU=Groups,DC=ar,DC=lugsaju,DC=com"

$grupoA = new-object DirectoryServices.DirectoryEntry("LDAP://$cnA")
$grupoB = new-object DirectoryServices.DirectoryEntry("LDAP://$cnB")


una vez que tenemos los objetos ADSI ($grupoA,$grupoB), vamos a mover el campo "info" desde el $grupoA al $grupoB:

$grupoA.info
esto es un texto informativa
$grupoB.info
$


primero, guardamos el info en una var:
$infoTemp = $grupoA.info

luego, asignamos a $grupoB el contenido de la var:
$grupoB.psbase.InvokeSet("info","$info")
$grupoB.psbase.CommitChanges()


entonces, eliminamos el contenido del campo info del $grupoA
$grupoA.putEx(1,"info",0) # es un cero
$grupoA.setInfo()


y comprobamos:
$grupoA.info
$
$grupoB.info
esto es un texto informativa
$


Ahora lo vamos a complicar un poco mas, al mover el Manager del grupoA al grupoB

el campo ManagedBy contiene un objeto de AD (no es solo texto), por lo tanto, tenemos que obtener 1º este objeto y luego, realizar lo mismo que antes, por lo tanto

$MgrDN = $grupoA.managedBy
$Mgr= new-object DirectoryServices.DirectoryEntry("LDAP://$MgrDN")
$Manager = $Mgr.distinguishedName


asignamos el managedBy al grupoB

$grupoB.psbase.invokeSet("managedBy","$Manager")
$grupoB.psbase.CommitChanges()


Eliminamos el Manager del grupoA
$grupoA.PutEx(1,"managedBy",0)
$grupoA.setInfo()

Eliminar propiedades de objetos en Active Directory

vamos a crear el objeto que nos conecta con el grupo:

$cn = "CN=GRUPO_G,OU=Groups,DC=ar,DC=lugsaju,DC=com"
$grupo = new-object DirectoryServices.DirectoryEntry("LDAP://$cn")

vamos a eliminar el campo ManagedBy del grupo:
$grupo.ManagedBy
CN=Jorge Daniel Mestre,OU=People,DC=ar,DC=lugsaju,DC=com

$grupo.PutEx(1,"managedBy",0) # cero al final, el 1 es el que "limpia" la propiedad.
$grupo.setInfo() # ejecutamos realmente el cambio en AD.

$grupo.ManagedBy
$

Ahora eliminaremos el campo "Notas" (info)

$grupo.info
esto es una nota en el campo notas

$grupo.PutEx(1,"info",0)
$grupo.SetInfo()
$grupo.Info
$

Buscando grupos en Active Directory segun el type y scope

Para buscar un grupo en Active Directory con Powershell, primero, indicamos el servidor en el que vamos a buscar:
$raiz = "LDAP://ar.lugsaju.com.ar"
$buscador = new-object DirectoryServices.DirectorySearcher($raiz)

Una vez creado el objeto, definimos algunas propiedades:

$buscador.PageSize = 10000
$buscador.CacheResults = $false
$buscador.Filter = '(objectClass=group)'
$buscador.FindAll()

Ahora, si queremos buscar grupos por tipo, debemos referirnos a esta tabla:

scope

Tipo de grupo

Valor “GroupType”

Universal

Security

-2147483640

Global

Security

-2147483646

Domain Local

Security

-2147483644

Universal

Distribution

8

Global

Distribution

2

Domain Local

Distribution

4


Entonces, para buscar todos los grupos globales de seguridad,

$buscador.Filter = '(&(objectClass=group)(groupType=-2147483646))'

o para buscar los grupos Domain local de Distribución, que comiencen con la palabra "LUG"

$buscador.Filter = '(&(objectClass=group)(groupType=4)(name=LUG*))'

Vim preparado para Powershell

Vim es un editor excelente, si bien su curva de aprendizaje es MORTAL (ejemplo abajo :D)


Pues, vamos a configurar nuestro Vim para editar Powershell:

01) Instalar Vim 7.0 seleccionando "Self-installing Executable" desde aqui

02) Una vez instalado, en la carpeta de la instalación (supongamos c:\vim) editamos el archivo c:\vim\_vimrc

agregar las siguientes lineas:
colorscheme desert
set tabstop=4

03) Bajar la sintaxis de PS desde aqui

04) copiar el archivo ps1.vim a c:\vim\vim70\syntax\

05) editar el archivo c:\vim\vim70\filetype.vim y agregar

" Powershell
au BufNewFile,BufRead *.ps1 setf ps1

y listo, con esto, cada vez que editemos un .ps1 se coloreará automaticamente.

dividir strings en Powershell

dividir un string por un caracter:

$a = "powershell,jorge,windows"
$a.split(",")
powershell
jorge
windows

Seleccionar un elemento
$a.split(",")[1]
jorge

Dividir por un caracter, y limpiar los espacios en blanco:
$a = "powershell2 jorge2 windows"
$a.split("2")
powershell
jorge
windows

$a.split("2",[StringSplitOptions]::RemoveEmptyEntries)
powershell
jorge
windows

en Powershell

inicializar un array sin valores
$array = @()

iniciar con un tamaño de array especifico:
$array = new-object object[] 100

Inicializar un array con 3 valores:
$array = "a",3,"hola"

renombrar archivos con powershell

Jeffrey Snover ha publicado en el blog oficial de powershell como renombrar archivos masivamente.
http://blogs.msdn.com/powershell/archive/2007/03/06/renaming-files.aspx

Sumatra, visor PDF ligero

Sumatra es un pequeño visor de archivos pdf para Windows que puede resultar útil para los usuarios que no dispongan de mucha máquina y necesitan ahorrar todos los recursos posibles. Se trata de una herramienta muy básica con sólo unas cuantas opciones de visualización. No obstante cumple perfectamente su cometido si no necesitamos muchas opciones.....y es GNU :)

WebSite | Sumatra PDF viewer