La gestione efficiente delle risorse hardware è fondamentale per i professionisti IT e per i Managed Service Provider (MSP). Un compito che si presenta spesso è quello di identificare i tipi di unità installate in un sistema.
Che si tratti di distinguere tra SSD e HDD o che si tratti di registrare i dettagli delle unità a scopo di inventario, disporre di un metodo affidabile per recuperare e salvare queste informazioni è importantissimo. In questo articolo analizzeremo uno script PowerShell progettato per questo scopo, spiegandone le funzionalità, i potenziali casi d’uso e le best practice.
Background
I professionisti IT hanno spesso bisogno di raccogliere dettagli sull’hardware per vari motivi, come il monitoraggio delle prestazioni, la gestione dell’inventario e la risoluzione dei problemi. Lo script PowerShell fornito è stato creato per recuperare informazioni sulle unità fisse, in particolare sulle unità a stato solido (SSD) e sulle unità a disco rigido (HDD), e per salvare i risultati in un campo personalizzato.
Questo script è particolarmente utile in ambienti in cui l’automazione e la precisione sono fondamentali, dato che offre una soluzione semplificata a un’attività amministrativa comune.
Lo script per recuperare e salvare le informazioni sui tipi di unità:
#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 { }
Analisi dettagliata
Analizziamo lo script passo per passo per capire la sua funzionalità e le modalità attraverso le quali raggiunge il suo obiettivo.
Prerequisiti
Lo script richiede PowerShell versione 5.1 o superiore. Inizia definendo una .SYNOPSIS e una .DESCRIPTION, utili per fornire una panoramica del suo scopo. Le sezioni .EXAMPLE mostrano i risultati attesi con e senza -CustomFieldParam.
Parametri e configurazione iniziale
Lo script accetta un parametro, CustomFieldName, che specifica il nome del campo personalizzato in cui verranno salvati i risultati. Include anche una funzione Test-IsElevated per verificare se lo script è in esecuzione con privilegi di amministratore, necessari per accedere a informazioni dettagliate sull’unità.
Elaborazione delle informazioni sull’unità
- Controllo dei privilegi elevati: Lo script verifica innanzitutto se è in esecuzione con i privilegi necessari. In caso contrario, termina con un messaggio di errore.
- Gestione delle variabili d’ambiente: Se il nome di un campo personalizzato è impostato tramite una variabile d’ambiente, questa sovrascrive il parametro dello script.
- Recupero delle informazioni sulle unità: Utilizzando Get-PhysicalDisk, lo script recupera tutte le unità fisiche, escludendo le unità virtuali e USB. Quindi seleziona le proprietà rilevanti: DeviceID, MediaType, BusType e SerialNumber.
- Informazioni sulla partizione: Lo script recupera i dettagli della partizione utilizzando Get-Partition, concentrandosi sulle partizioni con lettere di unità assegnate.
- Aggregazione dei dati: Unisce le informazioni sulle unità fisiche e sulle partizioni, creando un elenco completo di unità con i rispettivi dettagli.
Salvataggio dell’output e dei campi personalizzati
Lo script invia le informazioni sull’unità alla console. Se viene fornito un CustomFieldName, formatta i dati e tenta di salvarli nel campo personalizzato specificato, utilizzando un ipotetico cmdlet Ninja-Property-Set-Piped. Gestisce i potenziali errori durante questo processo e fornisce un feedback sul successo dell’operazione.
Casi d’uso potenziali
Un MSP gestisce più sistemi di clienti e deve verificare regolarmente le configurazioni hardware per garantire prestazioni ottimali e identificare potenziali problemi.
Distribuendo questo script sui computer client, l’MSP può automatizzare la raccolta delle informazioni sui tipi di unità e registrare i dati per riferimenti futuri. Ciò consente di identificare rapidamente i sistemi che potrebbero beneficiare di aggiornamenti hardware, come la sostituzione di un HDD con un SSD per migliorare le prestazioni.
Confronti
Rispetto ai metodi manuali o all’utilizzo di strumenti diversi, questo script offre un approccio unificato all’interno dell’ambiente PowerShell, riducendo la necessità di applicazioni esterne. Anche se strumenti come Windows Management Instrumentation (WMI) o software di terze parti possono ottenere risultati simili, l’integrazione di questo script con i campi personalizzati e le sue capacità di automazione lo rendono una soluzione più efficiente e scalabile.
Domande frequenti
- Ho bisogno di privilegi amministrativi per eseguire questo script? Sì, lo script richiede privilegi di amministrazione per accedere alle informazioni dettagliate sull’unità.
- Questo script può essere utilizzato su virtual machine? Lo script potrebbe non fornire risultati accurati sulle virtual machine, poiché il MediaType può essere elencato come “Unspecified”.
- Cosa succede se il nome del campo personalizzato non viene fornito? Se il parametro CustomFieldName non è specificato, lo script mostrerà le informazioni sull’unità soltanto nella console.
Implicazioni
La verifica regolare dei tipi di unità può avere implicazioni significative per la sicurezza e le prestazioni dell’IT. Per esempio, l’identificazione degli HDD più vecchi consente di effettuare sostituzioni proattive, riducendo il rischio di perdita di dati a causa di un guasto dell’unità. Inoltre, la comprensione dell’architettura di storage può aiutare a ottimizzare le strategie di backup e a garantire che i dati critici siano archiviati sull’hardware più affidabile.
Raccomandazioni
- Esegui sempre lo script con privilegi elevati.
- Pianifica regolarmente l’esecuzione dello script su tutti i sistemi gestiti per mantenere aggiornati gli inventari hardware.
- Assicurati che ci siano un’adeguata gestione degli errori e meccanismi di logging per la risoluzione di eventuali problemi durante l’esecuzione.
Considerazioni finali
Questo script PowerShell offre ai professionisti IT e agli MSP una soluzione affidabile per recuperare e salvare i tipi di unità in modo efficiente. Automatizzando questo processo, le organizzazioni possono mantenere inventari hardware accurati, ottimizzare le prestazioni e migliorare le strategie complessive di gestione IT.
Strumenti come NinjaOne possono semplificare ulteriormente questo processo integrando script come questo in flussi di lavoro di automazione più ampi, e fornendo una piattaforma di gestione IT completa che supporti operazioni proattive ed efficienti.