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: