Búsqueda de sitios web

Documentar Exchange Server con PowerShell


Documentar un entorno de trabajo (¿o no?) es una tarea importante que generalmente realizan administradores y consultores para tener una mejor idea de lo que está configurado para ese entorno y Exchange Server 201x no es diferente. Las actividades adecuadas de mantenimiento, migración y continuidad del negocio pueden depender en gran medida de esta documentación y tener una idea lo más precisa posible de lo que está configurado ayudará en esas actividades/tareas. Entonces, ¿cómo documentamos un entorno de Exchange Server? Una combinación de cmdlets Get y archivos de exportación (txt, csv y HTML) nos permitirá crear la documentación adecuada de un entorno.

Advertencia: Este artículo no explicará cómo documentar todos y cada uno de los elementos en Exchange, ya que hay demasiadas partes móviles. Sin embargo, el artículo se concentrará en algunos de los aspectos más importantes a documentar.

Construyendo el marco

Antes de profundizar en los cmdlets de documentación, necesitamos crear nuestro marco para capturar estos datos, y esto consistirá en crear o definir archivos de salida, así como otras variables que necesitaremos. En primer lugar, parte de la salida de nuestros cmdlets podría ser amplia, muy amplia. Como tal, es posible que necesitemos ajustar el tamaño del búfer de la ventana para no perdernos ningún detalle.

Utilice esta frase breve para configurar el tamaño del búfer de la ventana de PowerShell para permitir una salida amplia:

$Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size (500, 9999)

A continuación, debemos definir un archivo de destino de salida principal y una ruta de archivo:

$Path = (Get-Item -Path ".\" -Verbose).FullName$File = "ExchangeServerInformation.Txt"$Destination = $Path+"\"+$File

Los servidores Exchange contienen una amplia variedad de datos e información de configuración que se pueden consultar con PowerShell y, según el tamaño del entorno, es posible que desee crear archivos adicionales para ayudar a mantener estos datos separados. Por ejemplo, un entorno con 100 buzones de correo puede exportar todas las configuraciones y datos a un solo archivo, ya que sería fácil trabajar con él; sin embargo, un entorno con más de 10 000 buzones de correo encontrará esto bastante restrictivo y es posible que desee definir archivos para cada componente por separado. A continuación se muestran algunos archivos de registro de ejemplo (predefinidos antes de ejecutar Obtener cmdlets):

Recopilación de datos de muestra sobre los buzones de correo de los usuarios:

$ArchiveMailboxDestination = $Path+"\ArchiveMailboxStatistics.txt"$CASMailboxDestination = $Path+"\CASMailboxProperties.csv"$MailboxStatDestination = $Path+"\MailboxStatistics.txt"

Archivos de configuración del servidor de muestra:

$ExchangeDatabaseDestination = $Path+"\ExchangeDatabaseInformation-Detailed.txt"$NICInfoCSVDestination = $Path+"\ExchangeServerNICConfiguration.csv"

La lista anterior no es exhaustiva, pero es un buen punto de partida para empezar a crear sus propios guiones.

Explorar y exportar datos de configuración

Exchange es un sistema complejo, pero se puede dividir en componentes que permitirán un enfoque más organizado para la recopilación de datos. Dividirlo en partes requiere un conocimiento amplio de Exchange y luego conocimiento de los cmdlets de PowerShell de backend que ayudarán a descubrir datos y proporcionar informes con fines de generación de informes. Dividamos un entorno de Exchange en las partes funcionales y creemos documentación de muestra.

Desglose de la muestra

Configuración del servidor Exchange: Número de servidores, versión, nivel de parche, bases de datos, URL
Windows Configuración del servidor: Hardware o recursos (VM), archivo de paginación, registros de eventos, versión, tamaño del disco
Buzones de usuario: Estadísticas de buzones, archivo Estadísticas de buzones de correo, protocolos permitidos y contactos de correo
Configuración de software de Exchange: Políticas de direcciones de correo electrónico, Políticas de libreta de direcciones, Políticas de autenticación, Conectores de recepción, Conectores de envío, Políticas DLP, etc.

Nota: Conozca su entorno. Si hay más de mil de cualquier cosa, asegúrese de usar "-ResultSize Unlimited" como si estuviera pasando de moda.

Configuración del servidor Exchange

Primero, exploremos la configuración del propio Exchange Server.

Versión, edición, función y sitio

$ExchangeServers = Get-ExchangeServer$LocalExchangeServer = $Env:ComputerName$ServerVersionCheck = $TrueForeach ($ExchangeServer in $ExchangeServers) {$Server = $ExchangeServer.Name$Site = $ExchangeServer.Site$ServerRole = $ExchangeServer.ServerRole$Edition = $ExchangeServer.EditionIf ($Server -ne $LocalExchangeServer) {$Version = Invoke-Command -ComputerName $Server -ScriptBlock {$Ver = Get-Command Exsetup.exe | ForEach-Object {$_.FileversionInfo};$Version = $Ver.FileVersion;$Version} -ErrorAction Stop} Else {$Ver = Get-Command Exsetup.exe | ForEach-Object {$_.FileversionInfo}$Version = $Ver.FileVersion}$Line = "$Server|"+"$Version|"+"$Edition|"+"$ServerRole|"+"$Site" | Out-file $Destination -Append}


Los resultados del script se verían así:

Útil para verificar las versiones del servidor y qué funciones están instaladas en el servidor.

Bases de datos de buzones

A continuación, extraeremos información básica de nuestras bases de datos de Exchange:

Get-MailboxDatabase | FT Name, Server, Recovery, ReplicationType, LogFolderPath, EdbFilePath, DeletedItemRetention, MailboxRetention -Auto | Out-file $Destination -Append

Salida de muestra:

URL

Importante para las conexiones de clientes y procesos externos, tener la configuración de URL correcta para los servidores Exchange es importante y puede generar una mejor experiencia para el usuario final. El siguiente bloque de código consulta cada tipo de URL y exporta los resultados a un archivo.

$Line = Get-OWAVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-WebServicesVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-ActiveSyncVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-AutoDiscoverVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-MAPIVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-OABVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-ClientAccessService | ft Name,*uri* -Auto | Out-file $Destination -Append

Configuración del servidor de Windows

Hardware o recursos (VM), archivo de paginación, registros de eventos, versión del sistema operativo

Otra parte crucial de un servidor Exchange es la configuración del servidor Windows subyacente en el que se ejecuta.

Núcleos de procesador: lógicos y físicos

A continuación, verifique la cantidad de procesadores lógicos y físicos. Esto se puede utilizar para documentación, así como para verificar que Hyperthreading no esté en uso.

$Processors = Get-WMIObject Win32_Processor -ComputerName $Server$LogicalCPU = ($Processors | Measure-Object -Property NumberOfLogicalProcessors -sum).Sum$PhysicalCPU = ($Processors | Measure-Object -Property NumberOfCores -sum).Sum

RAM del servidor

$RamInGb = (Get-wmiobject -ComputerName $Server -Classname win32_physicalmemory -ErrorAction Stop | measure-object -property capacity -sum).sum/1GB

Configuración del archivo de paginación

Verifique si hay un Pagefile, si lo hay, verifique el tamaño mínimo y máximo. Si la consulta del Pagefile resulta nula, entonces el Pagefile está administrado.

$PageFileCheck = Get-CIMInstance -ComputerName $Server -Class WIN32_PageFile -ErrorAction STOP$Managed = $FalseIf ($Null -ne $PageFileCheck) {$MaximumSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" | select-object MaximumSize).MaximumSize$InitialSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" | select-object InitialSize ).InitialSize} Else {$Managed = $True}

Registros de eventos

$Line = EventLog -list | where {($_.log -eq 'Application') -or ($_.log -eq 'system') -or ($_.log -eq 'Security')} |ft Log,MAx*,Over* -auto | Out-File $EventLogConfiguration

Información del sistema operativo Windows

$OSName = ($os = Get-WmiObject Win32_OperatingSystem -Namespace "root\CIMV2").Name.split('|')[0]

Buzones de usuario/Contactos

Un aspecto importante de un entorno de Exchange Server consiste en objetos de correo como contactos y buzones. Consultar números de buzones, tamaños, información de archivo y más puede resultar muy útil, ya que puede proporcionar una idea de escala para el personal de soporte. También puede ayudar a desarrollar los sistemas de soporte adecuados para mantenimiento, copias de seguridad, migraciones y más.

Estadísticas de buzones

Primero, para las estadísticas de los buzones de correo de los usuarios, tenemos un archivo definido al que exportar la información. Luego podemos exportarlo por separado, ya que el archivo podría volverse bastante grande (piense en más de 10,000 entornos de usuario).

$MailboxStatDestination = $Path+"\MailboxStatistics.txt"Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select-Object DisplayName, @{expression = { $_.TotalItemSize.Value.ToMB()};label="Mailbox Size(MB)"} | ft -auto | Out-File $MailboxStatDestination

Archivar estadísticas de buzones

A continuación, para el buzón de archivo del usuario, ejecutamos el mismo conjunto de códigos, pero usamos el modificador -Archive para Get-Mailbox para que podamos consultar todos los buzones de archivo del usuario:

$ArchiveMailboxDestination = $Path+"\ArchiveMailboxStatistics.txt"Get-Mailbox -ResultSize Unlimited -Archive | Get-MailboxStatistics | Select-Object DisplayName, @{expression = { $_.TotalItemSize.Value.ToMB()};label="Mailbox Size(MB)"} | ft -auto | Out-File $ArchiveMailboxDestination

Protocolos permitidos

Luego, para los protocolos que los usuarios pueden usar para sus buzones de correo, usamos el cmdlet Get-CASMailbox y lo exportamos a nuestro archivo de resultados predefinido:

$CasMailboxDestination = CASMailboxProperties.txtGet-CasMailbox | ft -auto | Out-File $CasMailboxDestination

Contactos de correo

$MailContactsDestination = ‘MailContacts.txt’$Line = Get-MailContact -ResultSize Unlimited | Ft DisplayName, Alias, EmailAddress, HiddenFromAddressListsEnabled -Auto | Out-File $MailContactsDestination

Configuración del software de intercambio

Además de la configuración básica de Exchange Server, también hay configuraciones personalizadas que podemos configurar en el software de Exchange Server. A continuación se muestran algunos ejemplos de estas configuraciones que podemos consultar con PowerShell:

Políticas de direcciones de correo electrónico

$Line = Get-EmailAddressPolicy -ErrorAction STOP | Ft Name, RecipientFilterType, Priority ,Enabled*, RecipientFilter, LDAP*, IsValid -Auto | Out-File $Destination -Append

Políticas de libreta de direcciones

$Line = Get-AddressBookPolicy | Fl | Out-File $Destination -Append

Políticas de autenticación

$Line = Get-AuthenticationPolicy -ErrorAction STOP | Fl Name,Identity,allow* | Out-file $Destination -Append

Recibir conectores

$Line = Get-ReceiveConnector | Ft Identity, Bindings, EnabledAuthMechanism, MaxMessageSize, PermissionGroups, RequireTLS, TransportRole -Auto | Out-file $Destination -Append

Enviar conectores

$Line = Get-SendConnector -ErrorAction STOP | Ft Identity, HomeMtaServerId, Enabled, MaxMessageSize, AddressSpaces, CloudServicesMailEnabled, RequireTLS, SmartHosts -Auto | Out-file $Destination -Append

Políticas de DLP

$Line = Get-DLPPolicy | Ft Name,State,Mode,Identity -Auto | Out-File $Destination -Append

Crear informes

Algunos de los datos que recopilamos se pueden representar mejor o proporcionarse a otras personas como informes HTML, ya que los datos se pueden representar de una manera más consumible. Quizás los informes sean utilizados por la gestión de TI que necesite proporcionar información de auditoría o información de arquitectura de alto nivel a fuentes internas/externas para un proceso empresarial. Con PowerShell, podemos convertir la información consultada de archivos de salida CSV normales a archivos HTML. Hay muchas opciones para hacer esto y este artículo no proporcionará un método detallado para ese proceso; sin embargo, cubriremos un enfoque de alto nivel para esto que puede usarse en su proceso de creación de informes.

En este informe consultaremos la información de NIC para todos los servidores Exchange y esto se hará para asegurarnos de que ningún servidor tenga DHCP configurado, o demasiadas puertas de enlace u otros problemas de configuración de NIC.

$ExchangeServers = (Get-ExchangeServer).NameForeach ($ExchangeServer in $ExchangeServers) {$Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ExchangeServer -EA Stop | ? {$_.IPEnabled}Foreach ($Network in $Networks) {$IPAddress = $Network.IpAddress[0]$SubnetMask = $Network.IPSubnet[0]$DefaultGateway = $Network.DefaultIPGateway$DNSServers = $Network.DNSServerSearchOrder$WINS1 = $Network.WINSPrimaryServer$WINS2 = $Network.WINSSecondaryServer $WINS = @($WINS1,$WINS2) $IsDHCPEnabled = $falseIf($network.DHCPEnabled) {$IsDHCPEnabled = $true}$MACAddress = $Network.MACAddress$OutputObj = New-Object -Type PSObject$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper()$OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress$OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask$OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value ($DefaultGateway -join ",") $OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled$OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value ($DNSServers -join ",") $OutputObj | FT -auto$Row = "$Computer," + "$IPAddress," +"$SubnetMask," +"$DefaultGateway," +"$ISDHCPEnabled," + "$DNSServers"Add-Content -Path $NICInfoCSVDestination $Row}

Una vez que tengamos toda esa información reunida en un archivo CSV definido por la variable $NICInfoCSVDestination, podemos comenzar a crear el encabezado HTML para nuestro archivo aquí:

# Define Style for HTML file$OutputFile = "<style>"$OutputFile = $OutputFile + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"$OutputFile = $OutputFile + "TH{border-width: 1px;padding: 2px;border-style: solid;border-color: black;}"$OutputFile = $OutputFile + "TD{border-width: 1px;padding: 2px;border-style: solid;border-color: black;}"$OutputFile = $OutputFile + "</style>"

Luego convierta el archivo $NICInfoCSVDestination y aplique el encabezado que definimos anteriormente:

# Convert CSV to HTML$Output = Import-Csv -Path $NICInfoCSVDestination$Output | ConvertTo-Html -Head $OutputFile | Set-Content -Path $NICInforHTMLDestination

Cuando se ejecuta esta sección de código, deberíamos tener un archivo HTML como este:

Lo que vemos arriba es, nuevamente, una lista resumida de la configuración de red de un servidor Exchange y permite una revisión de alto nivel de la configuración y ayuda a detectar configuraciones incorrectas.

Conclusión

Bueno, has superado la avalancha de fragmentos de código de PowerShell, ¡felicidades! Ahora la esperanza es que haya visto el valor, así como la construcción rápida y sencilla de los fragmentos, y pueda comenzar a ver cómo esto sería valioso para su entorno. Recuerde que este artículo no es completo y tampoco podremos recrear realmente un script completo en una publicación de blog. Un script que he escrito tiene más de 5000 líneas para documentar Exchange Server. Para los próximos pasos, lea y vuelva a leer la publicación, separe el código y luego amplíelo a otras partes de la configuración que pueda necesitar documentar. Luego cree un conjunto apropiado de archivos de salida. Por último, asegúrese de evaluar a los lectores y consumidores de la documentación y de entregársela. Las exportaciones pueden ser súper técnicas con poca o ninguna explicación adicional, o el script puede realizar una traducción donde tal vez se pueda asociar un umbral y reportarlo para un informe a nivel de gerente. Cosas a tener en cuenta. Al final, lo que hagas con esto depende de ti, el lector, y esa es la libertad de PowerShell.


Contenido relacionado

Introducción: mensajes de resultados HTML e informes HTML personalizables

Artículos relacionados