lunes, 27 de febrero de 2012

Guía de Powershell 2.0

Para el que empieza y para el que lo utiliza todos los días:


viernes, 24 de febrero de 2012

Contraseñas caducadas del Directorio Activo

A medida que se van agregando cuentas de usuario en el Directorio Activo, dependiendo del uso de estas cuentas, el número de cuentas con contraseña caducada puede incrementarse en el tiempo.

A parte de implementar una política de recuperación de contraseñas y a efectos de limpieza, conviene saber qué cuentas tienen la contraseña caducada para tomar medidas, ya sea para eliminar la cuenta o para que el usuario recupere la contraseña.

El siguiente script en Powershell extrae el tiempo de vigencia de las contraseñas de la política del dominio y la fecha en que se estableció la contraseña en cada cuenta de usuario. Con estos dos datos y la fecha actual, el script lista el estado de la contraseña de cada usuario, el total de cuentas con la contraseña vigente, el total de cuentas con la contraseña caducada y el número de cuentas totales:
# caducadas.ps1 - Cuentas con contraseña vigente o caducada

$fecha_actual = Get-Date
$total = 0
$vigentes = 0
$caducadas = 0

# detección del dominio y preparación de búsquedas
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root_dom = New-Object DirectoryServices.DirectoryEntry("LDAP://$dom")
$search = [System.DirectoryServices.DirectorySearcher]$root_dom

# vigencia actual en días de las contraseñas del dominio
$search.Filter = "(objectclass=domainDNS)"
$result = $search.FindOne()
$vigencia_actual_pass = New-Object System.TimeSpan([System.Math]::ABS($result.properties["maxpwdage"][0]))
$dias_vigencia_actual = $vigencia_actual_pass.Days

# vigencia actual de la contraseña de cada usuario
$search.Filter = "(&(objectClass=user)(objectCategory=person))"
$users = $search.findall()

foreach ($user in $users)
{
$total++
$sam = $user.Properties.samaccountname

$fecha_lastset = [datetime]::fromfiletime(($user.properties.pwdlastset)[0])
$fecha_caducidad = $fecha_lastset.AddDays($dias_vigencia_actual)

# fecha actual mayor o igual que fecha de caducidad
if ($fecha_actual -ge $fecha_caducidad)
{
write-host "caducada - $sam"
$caducadas++
}
else # fecha actual menor que fecha de caducidad
{
write-host "vigente - $sam"
$vigentes++
}
}

Write-Host "---"
Write-Host "Estado de contraseñas:"
Write-Host ""
Write-Host " Vigentes: $vigentes"
Write-Host "Caducadas: $caducadas"
Write-Host " Total: $total"
Write-Host "---"

miércoles, 8 de febrero de 2012

Acceso total y Enviar como | Buzones Exchange 2010

Dos de los permisos más utilizados en los buzones de los usuarios de Exchange 2010 es el Acceso total, para que uno, varios o grupos de usuarios puedan acceder al buzón de correo deseado desde su Outlook y Enviar como, para que uno, varios o grupos de usuarios puedan enviar correo suplantando al dueño del buzón mediante el campo DE en un nuevo email (desde Outlook y OWA).

En la consola de administración de Exchange 2010 puedes gestionar ambos permisos por separado. Para agilizar la gestión de ambos permisos, he creado una herramienta (buzon_permisos.exe) que, iniciada con un usuario con permisos de administración en Exchange 2010, puedes introducir el nombre de la cuenta de un buzón (samaccountname), pulsar ENTER y aparecerán los permisos de Acceso total y Enviar como del buzón proporcionado (este proceso tarda unos segundos y el estado lo verás en el texto del título de la ventana):


Los permisos del buzón proporcionado terminarán de aparecer cuando en el texto del título de la ventana ponga: Permisos del buzón: ... y el samaccountname del buzón proporcionado (indicado en la siguiente imagen como samaccountname del buzón actual):


Ahora, en el buzón proporcionado (buzón actual que aparece en el texto del título de la ventana) puedes:
  • Dar el permiso de Acceso total a un usuario o grupo, introduciendo su samaccountname en el campo Cuenta y clicando en el botón Acceso total.

  • Dar el permiso de Enviar como a un usuario o grupo, introduciendo su samaccountname en el campo Cuenta y clicando en el botón Enviar como.

  • Eliminar un usuario o grupo y su permiso correspondiente, seleccionando la línea donde aparezca y clicando en el botón Eliminar permiso.

Ten en cuenta que:
  • En los tres casos anteriores, después de clicar en el botón deseado, tardará unos segundos en actualizar la nueva información de permisos (aparecerá un texto de carga en el título de la ventana).

  • Al agregar o quitar el permiso de Enviar como y después de la carga de los permisos es posible que no aparezca el cambio realizado (debido al tiempo de replicación en el Directorio Activo). Para solucionarlo, clica en botón Actualizar (en la parte superior de la ventana) hasta que aparezca el cambio actualizado.

  • Los permisos que puedes ver, agregar o quitar no son permisos heredados, son permisos que sólo afectan al buzón en sí.

Requisitos:

jueves, 5 de enero de 2012

Averigua el tamaño de una carpeta con C


El objetivo de este post es ver cómo funciona un programa en C que averigua el tamaño de una carpeta de Windows dada (subcarpetas incluidas), ya sea en el sistema de archivos local o en red.

Por ejemplo, con esta herramienta (fsize.exe, una vez compilado y enlazado) y el siguiente script:

@echo off
fsize c:\windows
fsize "c:\Archivos de programa"
fsize \\server-1\datos\pepe

obtuve los siguientes resultados:

c:\windows:
6.48 GBytes - 28332 archivos - 2459 carpetas.

c:\Archivos de programa:
2.13 GBytes - 14883 archivos - 2834 carpetas.

\\server-1\datos\pepe:
1.48 GBytes - 3659 archivos - 91 carpetas.


El código fuente de fsize.c está disponible en:

http://sites.google.com/site/ramiroencinas/soft/fsize.c

e incluye comentarios explicando el funcionamiento.

El archivo fsize.exe junto con el código fuente también está disponible en:

http://sites.google.com/site/ramiroencinas/soft/fsize.zip

Notas:
  • El compilador de C que he utilizado es lcc-win32.
  • El compilado-linkado lo realizé con: lc fsize.c -o fsize.exe -s
  • El archivo generado ejecutable fsize.exe tiene un tamaño de 32KBytes (es lo bueno de programar directamente con la API de Windows).
  • Funciona a partir de Windows XP.

lunes, 21 de noviembre de 2011

Securing Debian Manual en castellano

Lo que tiene que saber un sysadmin de Debian en cuanto a la seguridad está en este documento.

Y para los vagos con el inglés, he comenzado la traducción al castellano de sus capítulos más relevantes, comenzando con el tercero, que trata sobre los aspectos a tener en cuenta antes y durante la instalación de un Debian:
  • Contraseñas
  • Particionamiento
  • Control de servicios
  • Control de software instalado
PDF disponible en este enlace.


martes, 16 de agosto de 2011

Exchange 2010 | ¿Quién está fuera de la oficina?

Con Outlook puedes averiguar si alguien de tu organización está fuera de la oficina, pero no puedes saber quienes son todos ellos.

Para obtener un fichero de texto "fuera_oficina.txt" con la lista con todos estos usuarios podemos ejecutar el siguiente script de Powershell desde un host que tenga instalada la consola de administración de Exchange o desde un servidor Exchange.

--- comienzo del script ---

# guarda fecha actual
$fecha_actual = Get-Date

# guarda los samaccounts de todos los buzones
$buzones = Get-Mailbox | %{$_.SamAccountName}

# crea una lista para guardar los samaccounts de todos los buzones fuera de oficina
$buzon_fuera_oficina = New-Object System.Collections.ArrayList

# procesa cada buzón (samaccountname)
foreach ($buzon in $buzones)
{
# extrae la configuración de "fuera de la oficina"
$fuera_oficina = Get-MailboxAutoReplyConfiguration $buzon
# si "fuera de la oficina" está activado y la fecha de activación es hasta hoy
if (($fuera_oficina.AutoReplyState -eq "scheduled") -and ($fuera_oficina.StartTime -le $fecha_actual))
{
# agrega a la lista el samaccount actual
$buzon_fuera_oficina.add($buzon)
}
}

# crea un fichero txt con la lista de samaccounts ordenada
$buzon_fuera_oficina | sort | out-file ./fuera_oficina.txt

--- fin del script ---


lunes, 8 de agosto de 2011

Actualizaciones pendientes | Windows Update

Una forma rápida y sencilla de averiguar qué servidores de un Directorio Activo tiene pendientes las actualizaciones de Windows Update es conocer los que tienen corriendo el proceso wuauclt.

Si además puedes enviarte un email semanal con esa información, garantizas que los servidores estén actualizados bajo tu supervisión con una frecuencia razonable.

Esto se puede hacer con un script PowerShell como el siguiente:

---- comienzo del script ---
# Busca el proceso wuauclt.exe para ver si hay actualizaciones pendientes
# en servidores Windows encontrados en Directorio Activo
# y reporta resultados por email
# 2011 - ramiro.encinas

$emailFrom = "from@dominio.es" # origen email
$emailTo = "to@dominio.es" # destino email
$subject = "Servidores con Windows Update activo" # asunto
$smtpServer = "smtp.dominio.es" # servidor SMTP destino

# Búsqueda de servidores Windows en Directorio Activo:

$strOperatingSystem = "Windows*Server*" # patrón a buscar para SO
$objDomain = New-Object System.DirectoryServices.DirectoryEntry # acceso servicio directorio
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher # buscador
$objSearcher.SearchRoot = $objDomain # búsqueda desde el raíz del directorio
$objSearcher.Filter = ("OperatingSystem=$strOperatingSystem") # filtro LDAP
$colProplist = "name" # propiedad name del SO

foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} # carga de la propiedad name

$colResults = $objSearcher.FindAll() # búsqueda

$r = "`n" # texto del informe
$enviar = "no" # switch de envío

foreach ($objResult in $colResults) # Extracción de procesos por servidor encontrado
{
$objComputer = $objResult.Properties; # propiedades del servidor
$Server = $objComputer.name # nombre del servidor
$ErrorActionPreference = "SilentlyContinue" # no visualiza excepciones (servidores sin conexión)
Write-Host "Procesando $Server..." # mensaje
$encontrado = Get-Process -Name wuauclt -ComputerName $Server # búsqueda del proceso wuauclt
if ($encontrado) # si existe el proceso wuauclt
{
$r = $r + $Server + "`n"
$enviar = "si" # si uno al menos, envía email activando el switch
}
}

#envío email si procede
if ($enviar -eq "si")
{
$body = $r
$smtp = new-object Net.Mail.SmtpClient($smtpServer) # objeto smtp
$smtp.Send($emailFrom, $emailTo, $subject, $body) # envío del mensaje
}
--- fin del script ---

El script también está disponible desde aquí.

Los únicos parámetros que tienes que cambiar son los de las 4 líneas que hay al comienzo:

$emailFrom = "from@dominio.es" # origen email
$emailTo = "to@dominio.es" # destino email
$subject = "Servidores con Windows Update activo" # asunto
$smtpServer = "smtp.dominio.es" # servidor SMTP destino

Después puedes crear una tarea programada en un servidor que siempre esté encendido para ejecutar el script semanalmente y a esperar...