Resolver listas de IPs

get-content lista.txt | %{$a = $_;try{[net.dns]::GetHostByAddress($a)}catch{$a}}

PD: $a es declarado porque $_ devuelve el error completo.

Informacion extra en la salida del script

En el post con la función de Enviar-Correo, se llama a una "helper function" que añade información útil sobre la ejecución del script en el mail:


Function InfoExtraScriptCorreo
{#region intro_funcion
  #nombre     : InfoExtraScriptCorreo
  #descripcion: Insertar como tabla info extra en los correos. Salida como String(html)
  #fecha creac: xx/xx/13
  #versión    : 0.1 (07/08/13)
  #autor      : Jorge Mestre
  #Changelog  : 07/08/13 - creado
 #endregion intro_funcion
 #region css_tabla
  [string]$csstabla = "<style>"
  $csstabla = $csstabla + "TABLE{font-family:Arial,Helvetica,sans-serif;border-spacing:1px;`
    border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
  $csstabla = $csstabla + "TH{white-space: nowrap;border-spacing:1px;font-size:8pt;`
    border-width: 1px;padding: 1px;border-style: solid;border-color: black;`
    background-color:#E0EC0F}"
  $csstabla = $csstabla + "TD{white-space: nowrap;border-spacing:1px;font-size:8pt;`
    border-width: 1px;padding: 1px;border-style: solid;border-color: black;}"
  $csstabla = $csstabla + "</style>"
 #endregion css_tabla
 
 $t = "" | Select-Object script,host,working_dir,usuario
 $t.script   = $MyInvocation.PSCommandPath
 $t.host     = [System.Environment]::MachineName
 $t.working_dir = [System.Environment]::CurrentDirectory
 $t.usuario  = [System.Environment]::UserName
 [string]$salida = $t | convertto-html -Head $csstabla -As LIST
 return '<html><body><style>p {font-family:Arial,Helvetica,sans-serif;font-size:8pt}`
   </style><p>&nbsp<p>&nbsp<p>&nbsp<p>Información extra:</body></html>'+$salida
 
 
 

Reemplazar-Caracter, o cuando todos los -Encodig no son suficientes

Importando un XML, tuve un problema... molesto. Aleatoriamente me convertía las "Ñ" en un caracter ilegible "?"... -Encoding UTF8 por todos lados (en get-content, explicitamente en el XML, en [xml]) y al final me di por vencido: lo hice "Old School"...

Lo primero fue obtener el código ASCII del caracter no válido en la cadena:

? "No es un signo de pregunta"... es un caractér no representable:
$cadena = 'FG?'
#Obtener los códigos ASCII 
[int[]][char[]]$cadena
70
71
65533
 
? debería ser una Ñ, que es:
PS C:\> [int][char]"Ñ"
209

Recreando la cadena con el código correcto, recuperamos la Ñ:
 
 
 
el 99% de las veces tenemos que tratar los caracteres con la tabla correspondiente (UTF8, ASCII, etc), pero cuando el tema se pone duro, "las cosas a la vieja usanza" :)

function Reemplazar-Caracter
{
 Param
 (
  [parameter(Mandatory=$true)][string][ValidateNotNullOrEmpty()]$txt,`
  [parameter(Mandatory=$true)][int][ValidateNotNullOrEmpty()]$CarAnt,`
  [parameter(Mandatory=$true)][int][ValidateNotNullOrEmpty()]$CarNuevo
 )
 
 Write-Host -ForegroundColor green $txt 
 Write-Host -ForegroundColor cyan $([int[]][char[]]$txt)
 [string]$txtnuevo = $null
 foreach ($ascii in ([int[]][char[]]$txt))
 {
  if ($ascii -eq $CarAnt)
  {
   $txtnuevo = $txtnuevo + [char]$CarNuevo
  }
  else
  {
   $txtnuevo = $txtnuevo + [char]$ascii
  }
 }
 return $txtnuevo
}
 

Agregar direcciones X500 para alternativa a LegacyExchangeDN

Si se ha recreado una (o miles) de cuentas de Mailbox o Contactos en Exchange, por más que se hayan ajustado las propiedades de las address books, habrán problemas con la cache del Cliente de Outlook. Este utiliza la propiedad de la cuenta “LegacyExchangeDN” para ubicar la cuenta, y si la cuenta recreada no tiene el mismo LegacyExchangeDN, no se podrá utilizar salvo que se limpie la caché del Cliente Outlook.
Lamentablemente, todos los correos que se respondan anterior a la fecha de cambio, también se guían con esta propiedad.
Para “salir del paso” (y que no nos maten), se pueden hacer 2 cosas:
  1. Modificar la propiedad LegacyExchangeDN: LO CUAL TRAE PROBLEMAS en PRESENTE y a FUTURO. 
  2. Agregar una dirección X500 con la ruta LegacyExchangeDN antigua.
Para ilustrar, si 1 mailbox o contacto (o miles) tenían como ExchangeLegacyDN:
“/o=FirstExchOrg/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=NOMBREAPELLIDO”
Y se recrea/n (se eliminan y se vuelven a crear), quizás la propiedad quede como:
“/o=FirstExchOrg/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=NOMBRE APELLIDO” (con espacio).

Esto, para los nuevos correos no hay problema, pero la caché de Outlook y todos los mensajes antiguos en mailbox que referencien a esta cuenta lo harán a “NOMBREAPELLIDO”

Agregando una dirección X500, volvemos a permitir que Outlook “encuentre” este elemento (es inmediato).

#region intro
  #descripcion: agregar direccion X500 a todos los contactos de una OU
  #fecha creac: 04/11/2013
  #versión    : 0.1 (04/11/13)
  #autor      : Jorge Mestre
  #Changelog  : 04/11/13 - Creado
#endregion intro
param( $archOrigen,`
       $ou = 'OU=NomOU,DC=Lab,DC=local'
     )

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction `
            SilentlyContinue
$ErrorActionPreference = "continue"

$LegacyDNRaiz = "/o=FirstExchOrg/ou=Exchange Administrative Group `
     (FYDIBOHF23SPDLT)/cn=Recipients/cn="
$contactos = Get-MailContact -OrganizationalUnit $ou

foreach ($con in $contactos)
{
 $user = $con.alias
 $user
 $con.EmailAddresses += [Microsoft.Exchange.Data.CustomProxyAddress]`
(("X500:"+"$LegacyDNRaiz"+"$user"))
 Set-MailContact -Identity $con.alias -EmailAddresses $mails.EmailAddresses
}

Como "Bonus track", el código de Exchange de la propiedad es un EasterEgg:



comprobar que un host responde a varios puertos

Comprueba y registra el estado de puertos en un host remoto. Útil para detectar cortes si tenemos ofuscadas partes de la red.
 
#region intro
# nombre     : Comprobar-Puertos.ps1
# descripción: comprueba que un host responde a varios puertos
# fecha creac: 11/07/2011
# versión    : 0.2(15/07/2013)
# autor      : Jorge Mestre
# Changelog  : 11/07/2011 - creado
# Changelog  : 15/07/2013 - Agregado param $infinito
#keywords    : puertos,comprobar,telnet
#endregion intro


param($puertos,$dst,[switch]$infinito,$tamLog)

if (
 ((-not $puertos) -or (-not $dst)) -or `
 (($infinito) -and (-not $tamLog)))
{
  Write-Host "faltan argumentos`nEj: .\comprobar-puertos.ps1 -dst `"server`" `
  -puertos 80,81,9000 [-infinito -tamLog MB]" -ForegroundColor Yellow
  exit
}
#region MODIFICAR
$ArchLog = ".\LogPuertos.log"
$LimTamArchLog = $tamLog # MBs
$intervalo = 5 # segundos
#EndRegion MODIFICAR

#Region Funciones
function RevisarTamLog($ArchLog)
{
 $tamArch = ((Get-Item $ArchLog).length)/1mb | Out-Null
 if ($TamArch -gt $LimTamArchLog)
 {
  rm $ArchLog
 }
}

function eLog($texto)
{
 $fecha = get-date -F "dd/MM/yyyy - hh:mm:ss"
 $txt = "$fecha`: puerto $puerto en $dst $texto"
 Write-Host $txt
 $txt | Out-File -Encoding utf8 -delimiter ';' -Append $ArchLog
}

function comprobarPuertos
{
 RevisarTamLog $ArchLog
 foreach ($puerto in $puertos)
 {
  try
  {
   $socket = new-object Net.Sockets.TcpClient
   $socket.Connect($dst, $puerto)
   $socket.Close()
   eLog "abierto"
  }
  catch
  {
   eLog "cerrado"
  }
  $socket = $null
 }
}
#EndRegion Funciones

#Region principal
if (-not $infinito)
{
 comprobarPuertos
}
else
{
 while (1 -eq 1)
 {
  comprobarPuertos
  sleep $intervalo  
 }
}
#EndRegion principal