Vouchers para examenes de Microsoft

Apurense antes de que se agoten!

Microsoft esta regalando vouchers para 4 examenes (71-532, 70-533, 70-346 y 70-347), y lo unico que tienen que hacer es entrar ACA y llenar sus datos.

Que ganas rindiendo estos examenes?

Con el 71-532 y el 70-533 podes certificarte como Microsoft Certified Specialist en Azure
Con el 70-346 y el 70-347 podes certificarte como Microsoft Certified Solutions Associate en Office 365

Tengan en cuenta que esta oferta es valida hasta que se agoten los vouchers, y que estos vouchers deben ser usados antes del 31 de diciembre del 2014. Para usarlos, tienen que entrar a Prometric y buscar una fecha y lugar donde rendir.
No se cuelguen, yo ya tengo fecha para el 70-346 馃榾

Si te sirvio o conoces alguien que le pueda servir, pasalo! Nunca esta de mas estudiar un poco y aprender tecnologias nuevas.

Hasta la proxima

Chequear version de windows

Hoy me toco meterle mano al bisabuelo de Powershell: Batch.

Me pidieron que un script viejo no se ejecute en versiones Server de windows, y como no tengo manera de evitar la ejecuci贸n, tuve que volver a hacer magia.

Lo que hace este peque帽o pedazo de c贸digo es chequear la versi贸n de windows, verificar si es una versi贸n “normal” de windows y si es as铆, vuelve a la etiqueta SIGUE. Simple y sencillo.

:CHEQUEASERVER
REM Se fija que sea windows XP, Vista, 7 u 8.
REM Si no es, no instala
systeminfo | find "Microsoft Windows" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i
echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto SIGUE
echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto SIGUE
echo %vers% | find "Windows XP" > nul
if %ERRORLEVEL% == 0 goto SIGUE
echo %vers% | find "Windows 8" > nul
if %ERRORLEVEL% == 0 goto SIGUE
REM Si llego hasta aca abajo, no es
REM win xp, vista, 7 ni 8. Por descarte
REM es windows server, y no se instala.
:FIN

Limpiapendrives, o como empeze a scriptear.

Hoy comparto mi primer script, de cuando reci茅n arrancaba.
El 11 de julio del 2011, mi hermana vino a casa con un pendrive infectado con un virus que ocultaba todos los archivos y creaba accesos directos que apuntaban a un .vbs que se copiaba a los dem谩s discos.
B谩sicamente lo que hace es sacarle a todos los archivos del directorio y subcarpetas donde se corre los atributos Hidden, System y Read-Only.

Me hab铆a olvidado de este peque帽o paso, pero hoy me lleve una sorpresita, ya que me entere que todo el curso de mi hermana (y varias personas mas) lo usan casi a diario!

Pueden bajar el .bat de aca mismo (o para los mas curiosos, ac谩 abajo les va la transcripci贸n)

@echo off
echo Este ejecutable te devuelve todo lo que tenias en el pendrive.
echo Acordate de borrar todos los accesos directos y los .EXE que estan aca.
attrib /d /s -r -h -s *.*
echo.
echo.
echo Listo!
echo.
echo.
echo.
echo Creado por Lucas Camilo
echo.
echo.
pause
exit

Gracias Clari por la inspiraci贸n para un nuevo post! 馃檪

Feliz dia del sysadmin!

Hoy, como todos los ultimos viernes de julio, es el dia del sysadmin.
Vayan a abrazar a su administrador de sistemas amigo, haganle un regalito, aunque sea un mail para saludarlos, un poco de reconocimiento cada tanto no viene mal 馃檪

Y para mis compa帽eros, sumense hoy a la AdminFest, mas abajo les dejo el mapita de como llegar.

 

Ver usuarios bloqueados

Alguna vez les paso que un usuario de Active Directory se les bloqueo varias veces una misma semana? Y un mismo d铆a?
Bueno, a no preocuparse, con este peque帽o script vamos a poder ver en donde se produce ese bloqueo o intento fallido de login para poder resolverlo f谩cilmente.

Antes que nada, necesitamos tener instaladas las herramientas de administraci贸n remota (tambi茅n llamado RSAT).
Podemos bajarlas desde estos links:
Windows 7 x86
Windows 7 x64

Una vez instalados, solo queda abrir una ventana de Powershell y ejecutar el siguiente script.

function show-progressbar([int]$actual,[int]$completo,[string]$status,[string]$Activity)
{
$porcentaje=($actual/$completo)*100
if (!$status){
$status="Buscando datos $actual de $completo"
}
if (!$Activity){
$Activity="Obteniendo Resultados"
}
Write-Progress -Activity $Activity -status $status -percentComplete $porcentaje
}
###############################################################
# Ya explique esta funcion en este post #
# https://powershelleando.com.ar/2014/05/30/show-progressbar/ #
###############################################################
import-module activedirectory
$logcompleto=@()
$logdcs=@()
$cuentadc=1
# crea una carpeta "Eventos". Si ya existe no hace nada.
New-Item -Name eventos -Type directory -Force
# Levanta todos los DCs
$dcs=Get-ADDomainController -Filter *
$dctotal=$dcs.count
foreach ($dc in $dcs){
$nombredc=$dc.name
# Variable de ayuda para filtrar cuando no hay eventos
$sineventos=$false
$cuentaeventos=0
# Variable de ayuda para filtrar eventos de no repeticion
$mostrar=$true
$tipo=" "
# Revisando Domain Controller $nombredc - Chequeando disponibilidad.
$Status="Revisando Domain Controller $nombredc ($cuentadc de $dctotal)- Chequeando disponibilidad."
show-progressbar $cuentadc $dctotal $status
$online = Test-Connection $nombredc -Quiet -count 1
if ($online){
# Revisando Domain Controller $nombredc - Recuperando eventos.
$Status="Revisando Domain Controller $nombredc ($cuentadc de $dctotal) - Recuperando eventos."
show-progressbar $cuentadc $dctotal $status
# Get-WinEvent busca en el log de eventos, usamos -FilterXPath
#para consultar por eventos especificos, en este caso, indicamos
#los dos EventIDs que nos pueden resultar interesantes.
# EventID=4740 es el evento de bloqueo de usuario
# EventID=4625 es el evento de intento fallido de login
$logs=(Invoke-Command -computername $nombredc -ScriptBlock {Get-WinEvent -FilterXml "<QueryList><Query Path='Security'><Select Path='Security'>*[System[(EventID=4740 or EventID=4625)]]</Select></Query></QueryList>" -ErrorAction silentlyContinue} )
if ($logs -eq $null){
# Marca que no hay eventos para acomodar
$sineventos=$true
$eventostotal=0
}
if (!$sineventos){
$eventostotal=$logs.count
# Revisa evento por evento
foreach ($evento in $logs){
$cuentaeventos+=1
# Revisando Domain Controller $nombredc - cantidad de eventos
$Status="Revisando Domain Controller $nombredc ($cuentadc de $dctotal) - Evento numero $cuentaeventos de $eventostotal"
show-progressbar $cuentadc $dctotal $status
# mensaje tiene la variable message del evento
$mensaje=$evento.message
$hora=$evento.TimeCreated.ToShortTimeString()
$fecha=$evento.TimeCreated.ToShortDateString()
$id=$evento.ID
$datos=$mensaje.Split("`n")
Switch ($id)
{
4740{
## CASE 4740 - Bloqueo de un usuario
# datos[10] tiene la linea del usuario
$usuario=(($datos[10].split("`t"))[3])
# datos[13] tiene la linea del equipo que genero el evento
$Maquina=(($datos[13].split("`t"))[2])
$tipo="Bloqueo"
## FIN CASE 4740
}
4625{
## CASE 4625 - Intento de login fallido
## (chequear por si es un error)
if ($evento.Providername -eq "Microsoft-Windows-Security-Auditing"){
# datos[12] tiene la linea del usuario
$usuario=(($datos[12].split("`t"))[3])
# datos[25] tiene la linea del equipo que
#genero el evento
$Maquina=(($datos[25].split("`t"))[2])
$tipo="Intento de Login"
}
else{
$mostrar=$false
}
## FIN CASE 4625
}
default{
## Hubo un error.
$usuario="ERROR"
$maquina="ERROR"
$tipo="ERROR"
}
}
if ($mostrar){
$logcompleto+= $usuario | select-object @{Expression={$usuario};Label="Usuario"},@{Expression={$maquina};Label="Equipo"},@{Expression={$tipo};Label="Evento"},@{Expression={$fecha};Label="Fecha"},@{Expression={$Hora};Label="Hora"},@{Expression={$nombredc};Label="DC"}
}
}
}
}
else{
# Si el domain controller no esta disponible
write-host "El domain controller $nombredc esta OFFLINE" -backgroundcolor "red" -ForegroundColor black
}
$logDCS+=$cuentadc|select-object @{Expression={$nombredc};Label="DC"}, @{Expression={$online};Label="Online"}, @{Expression={$cuentaeventos};Label="Eventos"}
$cuentadc+=1
}
# Exporta el log de los usuarios bloqueados a CSV
$logcompleto| export-csv ./eventos/Log_Bloqueados.csv
# Exporta el log de estado de los DCs a CSV
$logdcs | export-csv ./eventos/log_dcs.csv
##Fin

Esto fue todo por hoy, si tienen alguna duda, comentario o sugerencia pueden escribirme mas abajo.

Hasta la pr贸xima!

Show-ProgressBar

Hoy voy a mostrar una peque帽a funci贸n que suelo usar cuando corro alg煤n ciclo largo, mas que nada para poder seguirlo paso a paso mientras se ejecuta.

Los 煤nicos datos que si o si hay que pasarle son los n煤meros actual y el total de registros del ciclo que se esta recorriendo.

function show-progressbar([int]$actual,[int]$completo,[string]$status,[string]$Activity)
{
$porcentaje=($actual/$completo)*100
# Si no le pasamos un parametro $Status, pone uno generico
if (!$status){
$status="Buscando datos $actual de $completo"
}
# Si no le pasamos un parametro $Activity, pone uno generico
if (!$Activity){
$Activity="Obteniendo Resultados"
}
Write-Progress -Activity $Activity -status $status -percentComplete $porcentaje
}

En los proximos scripts voy a usar esta peque帽a funcion, asi que preferia presentarla primero antes de marear a algun colgado.

Hasta la pr贸xima!

Hola!

Hace tiempo que andaba con ganas de tener un lugar publico donde compartir la magia (?) que hago con esta genial herramienta que es Powershell. El 煤nico problema estaba en lo poco creativo que soy cuando tengo que escribir, y eso hacia que cada vez que me decid铆a a hacer algo as铆, lo dejaba de lado.

PERO BASTA!

A partir de ahora, cada script que escriba, cada funci贸n que arme, cada comando que ejecute VA A ESTAR PUBLICADO AC脕. Eso es una promesa.

Por que?

Para crecer y mejorar necesitamos ayuda, ya sea de un libro, un amigo, o un salame que haya hecho tu misma pregunta antes.
Mucho tiempo me aproveche de este ultimo caso, leyendo en distintos foros, blogs, art铆culos de Technet, en donde sea que pudiera encontrar algo, una puntita de informaci贸n que me acercara a donde quer铆a (o necesitaba) llegar.
Hoy no me alcanza con eso. Quiero poder ser esa persona a la cual le agradecen en silencio, esa persona que le salva las papas a un pobre pibe de soporte que tiene que arreglar un quilombo gigante por si solo, o al super mega administrador que necesita ver el problema desde otro angulo.
Tantos a帽os leyendo y leyendo me dieron ganas de dejar de solo aprovechar la informaci贸n, y empezar a crear algo por mi cuenta.

As铆 surgi贸 esta idea hace un tiempo, y hoy se materializa en este intento de blog, ya veremos como sigue.

Hasta el pr贸ximo update (que les prometo que va a ser menos chamuyo y mas c贸digo)

Luke.