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
- Control de privilegios elevados. El script comprueba primero si se está ejecutando con los privilegios necesarios. Si no, termina con un mensaje de error.
- 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.
- 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.
- 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.
- 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
- ¿Necesito privilegios administrativos para ejecutar este script? Sí, el script requiere privilegios administrativos para acceder a la información detallada de la unidad.
- ¿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”
- ¿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.