Cómo recuperar y guardar tipos de unidades de forma eficaz mediante PowerShell

La gestión eficiente de los recursos de hardware es crucial para los profesionales de TI y los proveedores de servicios gestionados (MSP). Una tarea que se plantea a menudo es identificar los tipos de unidades instaladas en un sistema.

Ya sea para distinguir entre unidades SSD y HDD o para registrar los datos de las unidades con fines de inventario, disponer de un método fiable para recuperar y guardar esta información tiene un valor incalculable. Este post explora un script PowerShell diseñado para este propósito, explicando su funcionalidad, casos de uso potenciales y buenas prácticas.

Background

Con frecuencia, los profesionales de TI necesitan recopilar información sobre el hardware por diversos motivos, como la supervisión del rendimiento, la gestión de inventarios y la resolución de problemas. El script PowerShell proporcionado está adaptado para recuperar información sobre unidades fijas, en concreto unidades de estado sólido (SSD) y unidades de disco duro (HDD), y guardar los resultados en un campo personalizado.

Este script es especialmente útil en entornos en los que la automatización y la precisión son fundamentales, ya que ofrece una solución racionalizada a una tarea administrativa habitual.

El script para recuperar y guardar tipos de unidades

#Requires -Version 5.1

<#
.SYNOPSIS
    Get the drive types of all fixed SSD and HDD drives.
.DESCRIPTION
    Gets the drive types of all fixed SSD and HDD drives and can save the results to a custom field.

.EXAMPLE
    (No Parameters)
    ## EXAMPLE OUTPUT WITHOUT PARAMS ##
    DiskNumber DriveLetter MediaType BusType SerialNumber
    ---------- ----------- --------- ------- ------------
    0          C:          SSD       SATA    50026B768B3A4E3A
    1          D:          HDD       SATA    WD-WCC4N0JYJYJY

PARAMETER: -CustomFieldParam "ReplaceMeWithAnyMultilineCustomField"
    The name of the custom field to save the results to.
.EXAMPLE
    -CustomFieldParam "ReplaceMeWithAnyMultilineCustomField"
    ## EXAMPLE OUTPUT WITH CustomFieldParam ##
    DiskNumber DriveLetter MediaType BusType SerialNumber
    ---------- ----------- --------- ------- ------------
    0          C:          SSD       SATA    50026B768B3A4E3A
    1          D:          HDD       SATA    WD-WCC4N0JYJYJY
    [Info] Saving the results to the custom field. (ReplaceMeWithAnyMultilineCustomField)
    [Info] The results have been saved to the custom field. (ReplaceMeWithAnyMultilineCustomField)

Custom Field Output:
    #0, Letter: C:, Media: SSD, Bus: SATA, SN: 50026B768B3A4E3A
    #1, Letter: D:, Media: HDD, Bus: SATA, SN: WD-WCC4N0JYJYJY

.PARAMETER CustomFieldName
    The name of the custom field to save the results to.
.INPUTS
    None
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10/Server 2016
    Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [String]$CustomFieldName
)

begin {
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }
    if ($env:customFieldName -and $env:customFieldName -ne 'null') {
        $CustomFieldName = $env:customFieldName
    }

    # Get the drive type of all drives
    $Disks = Get-PhysicalDisk | Where-Object { $_.BusType -notlike "File Backed Virtual" -and -not ($_.PhysicalLocation -like "*USB*" -or $_.BusType -like "*USB*") } | Select-Object -Property DeviceID, MediaType, BusType, SerialNumber
    if ($($Disks | Where-Object { $_.MediaType -like "Unspecified" }).Count) {
        Write-Host "[Info] An Unspecified MediaType likely indicates this machine is a VM or there is an issue with that drive."
    }
    # Get the partitions with mounted drive letters
    $Partitions = Get-Partition | Where-Object { $_.DriveLetter -ne $null } | Select-Object -Property DriveLetter, DiskNumber
    # Join the two collections
    $Drives = $Disks | ForEach-Object {
        $Disk = $_
        $Partition = $Partitions | Where-Object { $_.DiskNumber -eq $Disk.DeviceID }
        [PSCustomObject]@{
            DiskNumber   = $_.DeviceID
            DriveLetter  = $Partition.DriveLetter | Where-Object { $_ }
            MediaType    = $_.MediaType
            BusType      = $_.BusType
            SerialNumber = $_.SerialNumber
        }
    }
    $($Drives | Out-String) | Write-Host

    # Save the results to a custom field
    if ($CustomFieldName) {
        Write-Host "[Info] Saving the results to the custom field. ($CustomFieldName)"
        $CustomField = $(
            $Drives | ForEach-Object {
                "#:$($_.DiskNumber), Letter: $($_.DriveLetter), Media: $($_.MediaType), Bus: $($_.BusType), SN: $($_.SerialNumber)"
            }
        ) | Ninja-Property-Set-Piped -Name $CustomFieldName 2>&1
        if ($CustomField.Exception) {
            Write-Host $CustomField.Exception.Message
            Write-Host "[Error] Failed to save the results to the custom field. ($CustomFieldName)"
        }
        else {
            Write-Host "[Info] The results have been saved to the custom field. ($CustomFieldName)"
        }
    }
}
end {
    
    
    
}

 

Análisis detallado

Vamos a desglosar el script paso a paso para entender su funcionalidad y cómo consigue su objetivo.

Requisitos previos

El script requiere PowerShell versión 5.1 o superior. Comienza definiendo un .SYNOPSIS y un .DESCRIPTION, proporcionando una visión general de su propósito. Las secciones .EXAMPLE muestran los resultados esperados con y sin -CustomFieldParam.

Parámetros y configuración inicial

El script acepta un parámetro, CustomFieldName, que especifica el nombre del campo personalizado donde se guardarán los resultados. También incluye una función Test-IsElevated para comprobar si el script se está ejecutando con privilegios de administrador, necesarios para acceder a información detallada de la unidad.

Procesamiento de la información de la unidad

  1. Control de privilegios elevados. El script comprueba primero si se está ejecutando con los privilegios necesarios. Si no, termina con un mensaje de error.
  2. Gestión de variables de entorno. Si se establece un nombre de campo personalizado a través de una variable de entorno, anula el parámetro de script.
  3. Recuperación de información de la unidad. Usando Get-PhysicalDisk, el script recupera todas las unidades físicas, filtrando las unidades virtuales y USB. A continuación, selecciona las propiedades pertinentes: DeviceID, MediaType, BusType y SerialNumber.
  4. Información de la partición. El script obtiene los detalles de la partición utilizando Get-Partition, centrándose en las particiones con letras de unidad asignadas.
  5. Agregación de datos. Fusiona la información de la unidad física y de la partición, creando una lista completa de unidades con sus respectivos detalles.

Salida y guardado de campos personalizados

El script envía la información de la unidad a la consola. Si se proporciona un CustomFieldName, formatea los datos e intenta guardarlos en el campo personalizado especificado utilizando un hipotético cmdlet Ninja-Property-Set-Piped. Gestiona los posibles errores durante este proceso y proporciona información sobre el éxito de la operación.

Posibles casos de uso

Un MSP gestiona múltiples sistemas de clientes y necesita auditar periódicamente las configuraciones de hardware para garantizar un rendimiento óptimo e identificar posibles problemas.

Al implementar este script en los equipos cliente, el MSP puede automatizar la recopilación de tipos de unidades y registrar los datos para futuras consultas. Esto permite identificar rápidamente los sistemas que podrían beneficiarse de actualizaciones de hardware, como la sustitución de un disco duro por una unidad SSD para mejorar el rendimiento.

Comparaciones

En comparación con los métodos manuales o el uso de herramientas dispares, este script ofrece un enfoque unificado dentro del entorno PowerShell, lo que reduce la necesidad de aplicaciones externas. Aunque herramientas como Windows Management Instrumentation (WMI) o software de terceros pueden lograr resultados similares, la integración de este script con campos personalizados y sus capacidades de automatización lo convierten en una solución más eficiente y escalable.

FAQ

  1. ¿Necesito privilegios administrativos para ejecutar este script? Sí, el script requiere privilegios administrativos para acceder a la información detallada de la unidad.
  2. ¿Se puede utilizar este script en máquinas virtuales? Es posible que el script no proporcione resultados precisos en máquinas virtuales, ya que el MediaType puede aparecer como “No especificado”
  3. ¿Qué ocurre si no se indica el nombre del campo personalizado? Si no se especifica el parámetro CustomFieldName, el script sólo mostrará la información de la unidad en la consola.

Implicaciones

La auditoría periódica de los tipos de unidades puede tener implicaciones significativas para la seguridad y el rendimiento de TI. Por ejemplo, la identificación de los discos duros más antiguos permite realizar sustituciones proactivas, reduciendo el riesgo de pérdida de datos por fallo de la unidad. Además, comprender la arquitectura de almacenamiento puede ayudar a optimizar las estrategias de copia de seguridad y garantizar que los datos críticos se almacenan en el hardware más fiable.

Recomendaciones

  • Ejecuta siempre el script con privilegios elevados.
  • Programa periódicamente la ejecución del script en todos los sistemas gestionados para mantener actualizados los inventarios de hardware.
  • Asegúrate de que existen mecanismos adecuados de gestión y registro de errores para solucionar cualquier problema durante la ejecución.

Reflexiones finales

Este script de PowerShell ofrece una solución sólida para que los profesionales de TI y los MSP recuperen y guarden los tipos de unidades de forma eficaz. Al automatizar este proceso, las organizaciones pueden mantener inventarios precisos de hardware, optimizar el rendimiento y mejorar sus estrategias generales de gestión de TI.

Herramientas como NinjaOne pueden agilizar aún más este proceso mediante la integración de estos scripts en flujos de trabajo de automatización más amplios, proporcionando una plataforma integral de gestión de TI que permite unas operaciones proactivas y eficientes.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).