Published on

November 26, 2011

Explorando SQL Server: Analizando archivos MIF con PowerShell

Los archivos de formato de información de administración (MIF) son archivos de texto formateados que contienen información adicional sobre componentes de hardware y software. Aunque el formato MIF se originó a partir de las Normas de la Interfaz de Administración de Escritorio en 1996, todavía es relevante hoy en día, especialmente para los usuarios de Microsoft System Management Server (SMS) / System Center Configuration Manager (SCCM).

En este artículo, discutiremos cómo analizar archivos MIF utilizando PowerShell y explorar las posibilidades de extraer y analizar los datos contenidos en estos archivos.

Entendiendo el formato de archivo MIF

El formato de archivo MIF se asemeja a XML, con secciones “Inicio” y “Fin” en lugar de etiquetas de apertura y cierre. Esta similitud hace que sea lógico convertir los archivos MIF en XML para facilitar la extracción de datos.

Echemos un vistazo a un script de PowerShell que puede convertir un archivo MIF en XML:

param (
    $nombreArchivo,
    $nombreEquipo = $env:ComputerName
)

function Convertir-MIFXml {
    param ($archivoMIF)

    $textoMIF = Get-Content $archivoMIF |
        ForEach-Object { $_ -replace "&", "&" } |
        ForEach-Object { $_ -replace "'", "'" } |
        ForEach-Object { $_ -replace "<", "<" } |
        ForEach-Object { $_ -replace ">", ">" } |
        ForEach-Object { $_ -replace 'Inicio Componente', '<Componente' } |
        ForEach-Object { $_ -replace 'Inicio Grupo', '><Grupo' } |
        ForEach-Object { $_ -replace 'Inicio Atributo', '><Atributo' } |
        ForEach-Object { $_ -replace 'Fin Atributo', '></Atributo>' } |
        ForEach-Object { $_ -replace 'Fin Grupo', '</Grupo>' } |
        ForEach-Object { $_ -replace 'Fin Componente', '</Componente>' } |
        ForEach-Object { $_ -replace '"' } |
        ForEach-Object { $_ -replace "(\s*//\s*.*)" } |
        ForEach-Object { $_ -replace "\s*([^\s]+)\s*=\s*(.+$)", '$1="$2"' } |
        ForEach-Object { $_ -replace "\t", " " } |
        ForEach-Object { $_ -replace "\s{2,}", " " }

    [xml]$xmlMIF = [string]::Join(" ", $textoMIF) -replace ">\s*>", ">" -replace "\s+>", ">"

    return $xmlMIF
}

Convertir-MIFXml $nombreArchivo |
    ForEach-Object { $_.componente } |
    ForEach-Object { $_.Grupo } |
    ForEach-Object { $_.Atributo } |
    Select-Object @{n='NombreSistema'; e={$nombreEquipo}},
        @{n='Componente'; e={$($_.psbase.ParentNode).psbase.ParentNode.name}},
        @{n='Grupo'; e={$_.psbase.ParentNode.name}},
        @{n='NombreArchivo'; e={[System.IO.Path]::GetFileName($nombreArchivo)}},
        ID, Nombre, Valor

Este script toma un archivo MIF como entrada y lo convierte en un documento XML. Luego selecciona las propiedades deseadas, incluidos los atributos del grupo y componente padre, para su posterior análisis.

Recopilación de archivos MIF de varios servidores

Si desea recopilar archivos MIF de varios servidores, puede utilizar el script mencionado anteriormente. Sin embargo, debe proporcionar las rutas de archivo para cada servidor. La ubicación predeterminada de los archivos MIF en computadoras administradas por SMS/SCCM es C:\WINDOWS\System32\CCM\Inventory\noidmifs en máquinas x86 o C:\WINDOWS\SysWOW64\CCM\Inventory\noidmifs en máquinas x64.

Para automatizar este proceso, puede consultar la base de datos de SMS/SCCM y producir un archivo CSV que enumere los nombres de los servidores y las rutas de los archivos MIF. Aquí hay un ejemplo de consulta SQL que puede ejecutar desde SQL Server Management Studio conectado a su base de datos de SMS/SCCM:

SELECT DISTINCT SMS_R_System.Name0,
    CASE
        WHEN SMS_G_System_OS.Name0 LIKE '%x64%' THEN '\\' + SMS_R_System.Name0 + '\c$\WINDOWS\SysWOW64\CCM\Inventory\noidmifs\*.mif'
        ELSE '\\' + SMS_R_System.Name0 + '\c$\WINDOWS\System32\CCM\Inventory\noidmifs\*.mif'
    END AS SO
FROM SMS_Acme.dbo.System_DISC AS SMS_R_System
JOIN SMS_Acme.dbo.Operating_System_DATA AS SMS_G_System_OS ON SMS_G_System_OS.MachineID = SMS_R_System.ItemKey

Guarde la salida de esta consulta como un archivo CSV.

Ahora puede utilizar el archivo CSV como entrada para el script de análisis de MIF. Aquí hay un ejemplo de comando PowerShell:

Import-Csv C:\bin\servers.csv |
    ForEach-Object {
        $servidor = $_.servidor
        Get-ChildItem $_.ruta |
            Select-Object FullName, @{n='servidor'; e={$servidor}}
    } |
    ForEach-Object {
        C:\bin\mifparser.ps1 $_.nombrecompleto $_.servidor
    } |
    Export-Csv ./mif.csv -NoTypeInformation

Este comando importa el archivo CSV, itera a través de cada servidor, recupera los archivos MIF de las rutas especificadas y ejecuta el script de análisis de MIF en cada archivo. Finalmente, exporta los datos consolidados a un archivo CSV para su posterior análisis.

Análisis adicional con SQL Server

Una vez que tenga el archivo CSV consolidado con toda la información de los archivos MIF, puede cargarlo en una tabla de SQL Server para un análisis adicional. Aquí hay un ejemplo de declaración SQL para crear la tabla:

CREATE TABLE [dbo].[mif](
    [NombreSistema] [varchar](1000) NULL,
    [Componente] [varchar](1000) NULL,
    [Grupo] [varchar](1000) NULL,
    [NombreArchivo] [varchar](1000) NULL,
    [ID] [varchar](1000) NULL,
    [Nombre] [varchar](1000) NULL,
    [Valor] [varchar](1000) NULL
);

Después de crear la tabla, puede utilizar la declaración BULK INSERT para cargar los datos del archivo CSV en la tabla:

BULK INSERT dbautility.dbo.mif
FROM 'C:\Users\u00\Desktop\mif.csv'
WITH (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
);

Ahora puede realizar varias consultas SQL y análisis en los datos MIF almacenados en la tabla de SQL Server.

Al aprovechar PowerShell y SQL Server, puede analizar y extraer eficientemente información valiosa de los archivos MIF sobre sus dispositivos administrados. Este enfoque puede mejorar significativamente sus procesos de administración y configuración del sistema.

¡Feliz scripting!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.