Obtener los contenedores donde se descubren equipos

¡Qué belleza que desde cierto año en adelante todos los productos de Microsoft se administran desde la consola de Powershell!

Esto da muchas prestaciones al momento de obtener información, realizar otro tipo de tareas administrativas no soportadas desde la administración gráfica o automatizar procesos.

Yendo al contexto, SCCM trabaja sobre Active Directory para el descubrimiento de usuarios, grupos y equipos. El descubrimiento específico para equipos se llama Active Directory System Discovery y, según la configuración aplicada, se ejecuta siguiendo una agenda y hace el descubrimiento en contenedores y unidades organizativas.

El listado de OU descubiertas se puede obtener directamente desde la consola, pero en un formato que no es exportable. Se torna complejo saber cuáles son cuando ya son un número considerable.

La solución está en hacerlo desde Powershell de SCCM. Primero que todo, hay que iniciar una sesión en el Powershell de SCCM.
Usar el siguiente script, asumiendo que el codigo de CLP y el servidor es MI-SCCM

PS CLP:> $ADDiscovery = Get-CimInstance -ComputerName "MI-SCCM" -Namespace "rootSMSsite_CLP" -ClassName SMS_SCI_Component -Filter 'ComponentName="SMS_AD_SYSTEM_DISCOVERY_AGENT"'

PS CLP:> $ADContainerProp = $ADDiscovery.PropLists | Where-Object {$_.PropertyListName -eq 'AD Containers'}

PS CLP:> $ADContainerProp.Values

De esta forma, se obtendrá un listado en texto plano en Powershell para usarlo como se estime conveniente.

Espero que sea de utilidad.

Hasta la proxima entrega.

Ejecutar acciones en clientes SCCM de forma remota

Hola Mundo:
En implementaciones de SCCM para la administración de estaciones de trabajo es necesario realizar

refresco de políticas de algunas máquinas cliente antes del tiempo agendado de refresco.

Me explico. Por defecto, todas las máquinas conversan con el servidor de administración (MP) una vez cada 60 minutos. Estos minutos se empiezan a contar cuando se instala el agente, por lo que no todos los agentes sincronizan al mismo tiempo.
A través de la máquina local del cliente se puede forzar la ejecución del refresco de políticas de máquina, que alteraría el normal tiempo de refresco. 
Para efectos de pruebas y distribución de algún paquete es necesario hacerlo, pero supone un problema darle las indicaciones al usuario para que el lleve a cabo la acción, o bien, intentar conectarse a su máquina e interrumpirlo en sus labores, también es un problema.
Afortunadamente, SCCM y sus agentes funcionan sobre WMI para la ejecución de sus procesos y recolección de información. Teniendo esto asumido, ya podemos decir que se pueden ejecutar procesos de WMI de forma remota.
Cada una de las acciones del agente de SCCM está identificado a través de un identificador. Los más comunes son:
  • Hardware Inventory: {00000000-0000-0000-0000-000000000001}
  • Software Inventory: {00000000-0000-0000-0000-000000000002}
  • Machine policy retrieval and evaluation cycle: {00000000-0000-0000-0000-000000000021}
El cmdlet Invoke-WmiMethod nos apoyará en esta operación. 
Por ejemplo, si se necesitara ejecutar la acción de refresco de políticas de máquina la linea para ejecutar en Powershell sería así:
 Invoke-WmiMethod -ComputerName NOMBRE_DEL_CLIENTE -Namespace rootCCM -Class SMS_Client -Name TriggerSchedule -ArgumentList "{00000000-0000-0000-0000-000000000021}"

Es importante que la sesión de Powershell debe ser con privilegios de administración local de la máquina cliente.
¿Ven? ya se pueden ahorrar problemas y optimizar el trabajo.

Saludos!

Instalación de roles requeridos para SCCM

Hola Mundo:

Hoy les quiero compartir una herramienta que, en lo personal, me apoya bastante en la instalación de SCCM 2012 y 2012 R2.

Es un script construido en Powershell y tiene interfaz gráfica (¡Si! y no bromeo). Requiere de permisos de administador para ejecutar.

Más información sobre las características y descargas pueden encontrarlas en el link de la herramienta:https://gallery.technet.microsoft.com/ConfigMgr-2012-R2-e52919cd

Antes de ejecutar, hay que quitar la protección de ejecución de scripts de Powershell:

Una vez que el sistema está permisivo, se ejecuta la herramienta y muestra su ventana principal:

De inmediato la herramienta acusa que le falta un reinicio al servidor y que no está siendo ejecutada con permisos de administrador.
Ofrece instalar los roles requeridos para cada uno de los tipos de sitio y además permite hacer la descarga de los paquetes requeridos.
También permite hacer otras operaciones como la extensión de esquema de Active Directory, instalación de WSUS, instalación de Windows ADK, creación del contenedor System Management, entre otros.
Si quieres instalar SCCM esta herramienta ayudará a ahorrar mucho trabajo y disminuye el riesgo de la falta de algún rol o configuración.
Espero que les sirva.
¡Chau!

Error al usar el cmdlet Uninstall-CSDatabase

Hola Mundo:

Cualquier proceso de migración va en la recta final cuando te pones a quitar por completo la antigua
versión.

En el caso de Lync, en una migración de la versión 2010 a la versión 2013, ya los últimos pasos son cuando migras el Central Management Store y desinstalas la base de datos antigua.
Hay un comando que sirve justamente para este propósito. El cmdlet (de Powershell) es Uninstall-CsDatabase.

El cmdlet tiene un montón de parámetros que no los tocaremos ahora. Siempre Technet lo explica mejor que yo: http://technet.microsoft.com/en-us/library/gg412922.aspx

Lo normal, es que siempre que se ejecute la herramienta, termine con un mensaje parecido a este para indicar que todo terminó de forma correcta:

Pero hay veces que termina así:

—————
Exit code: ERROR_ALLOW_DATABASE_ACCESS (-22)
—————
Ok. Que no cunda el pánico. Si esto ocurre es porque:

  1. La cuenta que estás usando no es administrador del SQL Server
  2. La cuenta que estás usando no es administrador local de la máquina de Lync
  3. La cuenta que estás usando no es una cuenta de dominio.
Cumpliendo los 3 puntos, la cosa funcionará.
Chau

Agregar direcciones a una casilla en Exchange 2013 a través de Powershell

Hola Mundo:

Cada casilla de correo, en cualquier plataforma, puede tener distintas direcciones de correo

electrónico.

Exchange 2013 incluye esta característica y, además, es configurable a través de la interfaz web. Es bastante cómodo cuando es para un solo usuario y solo un par de direcciones y no lo es para cuando son 700 y debe hacerse a través de un script.
Para completar esta acción se debe hacer a través de la consola Powershell para Exchange 2013.

Bien. Supongamos que tenemos un CSV (llamado archivo.csv) con la información que se requiere y se tiene en el siguiente formato:

alias, emailaddresses 
usuario1,»usuario1@midominio1.com,usuario1@midominio2.com» 
usuario2,»usuario2@midominio1.com,usuario2@midominio2.com» 
usuario3,»usuario3@midominio1.com,usuario3@midominio2.com» 
usuario4,»usuario4@midominio1.com, usuario4@midominio2.com»

Se tiene 4 usuarios y cada usuario tiene 3 direcciones de email asociadas a su casilla. Es importante que las cuentas estén creadas antes de poder asociar más direcciones de correo electrónico  a las casillas. Entonces si las cuentas ya están creadas, no queda más que modificarlas usando el cmdlet Set-Mailbox

El cmdlet Set-Mailbox tiene un parámetro -EmailAddresses donde se indican todas las direcciones de correo electrónico que están asociadas a la casilla. Tiene un tipo de datos especial, por lo que hay que trabajarlo en el script para que pueda convertirlo de forma simple el valor (o los valores) que le entreguemos.

Entonces el script quedaría así:

Import-Csv "archivo.csv" | ForEach-Object {

$correos = $_."emailaddresses" -split ','

Set-Mailbox -Identity $_."alias" -EmailAddresses @{add=$correos}


}

De esta forma, le estaría diciendo al sistema que tengo un set de direcciones de correos electrónicos, separados por una coma, para la casilla identificada con el alias.

¡Chau!

Tips de Powershell para Exchange 2013

Hola Mundo:

¡Que maravilloso que los productos tengan su consola de Powershell! Es muy bueno como se puede automatizar y administrar a través de estas herramientas. Ahora, no es nuevo. Desde la versiones anteriores de Windows y los productos que se puede hace scripting con VBScript y en los derivados de Unix se tiene la poderosa Shell.
¿Cuál es la ventaja de Powershell? La orientación a objetos y la integración con .NET.
De todas formas, no pretendo hablar largo de los lindo que es Powershell. El objetivo es dejar anotados ciertas líneas muy útiles  y que las he usado harto estos días en el trabajo. 

Eliminar todos los usuarios

$mailbox = Get-Mailbox
Foreach($cuenta in $mailbox){Remove-Mailbox -Identity $cuenta.Alias -Permanent $true -Confirm:$Y}

Eliminar todos los contacto

$contactos = Get-MailContact
Foreach($contacto in $contactos){Remove-MailContact -Identity $contacto.Alias -Confirm:$Y}

Eliminar todos los grupos

$grupos = Get-DistributionGroup
Foreach($grupo in $grupos){Remove-DistributionGroup -Identity $grupo.Alias -Confirm:$Y}

Nada más copiar y pegar.

Chau!