Följande PowerShell-skript är utformat för att matcha en disk i Windows med dess motsvarande VMDK i vsphere7, med fokus på SCSI-controller och DISKID. Skriptet tar två parametrar – vCenterServer och ServerName – och använder VMware PowerCLI samt Windows Management Instrumentation (WMI) för att hämta nödvändig information. Resultatet presenteras i en rapport i form av en tabell som både skrivs ut i PowerShell-konsolen och exporteras till en CSV-fil.
För att skriptet ska fungera korrekt måste du säkerställa att miljön är korrekt konfigurerad:
Install-Module -Name VMware.PowerCLI
.Skriptet kräver två obligatoriska parametrar:
Det inledande steget i skriptet är att importera nödvändiga moduler och etablera en anslutning till vCenter-servern med hjälp av PowerCLI. Detta tillåter skriptet att hämta information om den virtuella datorn och dess diskar.
Skriptet hämtar först VM-objektet baserat på det angivna servernamnet. Därefter hämtas diskinformationen genom att använda kommandot Get-HardDisk
, vilket returnerar VMDK:ens detaljer som bland annat inkluderar SCSI-controller och enhetens nummer (UnitNumber).
För att samla in motsvarande diskinformation från Windows används Invoke-VMScript
tillsammans med ett PowerShell-skript. Skriptblocket som körs på den virtuella Windows-maskinen samlar in data via WMI – typiskt genom att anropa Get-WmiObject Win32_DiskDrive
, där både SCSI-information (port och target ID) samt diskens DeviceID extraheras.
Matchningen sker genom att jämföra nödvändiga attribut från VMware (SCSIController och UnitNumber) med värdena från Windows (SCSIPort och SCSITargetId). I vissa fall används även UUID-baserad matchning efter att eventuellt manipulera UUID:et för att jämföra med serierummer eller liknande. Detta säkerställer att rätt fysisk disk i Windows matchas med dess digitala motsvarighet i vSphere.
När matchningen har utförts, skapas en rapport som sammanställer information om både den virtuella disken och motsvarande Windows-disk. Rapporten lagras i en PowerShell-objekt-array och exporteras sedan till en CSV-fil för vidare analys. Rapporten skrivs även ut i en tabell med formatering direkt i konsolen.
Nedan finner du det kompletta skriptet som du kan använda direkt. Observera att du kan behöva justera vissa delar beroende på din specifika miljö och hur du har konfigurerat dina systems autentiseringsuppgifter.
# Importera nödvändiga moduler
Import-Module VMware.VimAutomation.Core
param (
[Parameter(Mandatory=$True)]
[string]$vCenterServer,
[Parameter(Mandatory=$True)]
[string]$ServerName
)
# Anslut till vCenter
Connect-VIServer -Server $vCenterServer
# Hämta den virtuella maskinen
$VM = Get-VM -Name $ServerName
# Skapa autentiseringsuppgifter för att köra skript på gäst OS
$Credential = Get-Credential -Message "Ange dina referenser för gästoperativsystemet"
# Hämta VMDK-diskar från vSphere via PowerCLI
$VMDisks = $VM | Get-HardDisk
# Hämta Windows diskinfo från den virtuella maskinen med Invoke-VMScript
$WindowsDisks = Invoke-VMScript -ScriptType PowerShell -VM $VM -Credential $Credential -ScriptText {
# Hämta diskdata via WMI
Get-WmiObject -Class Win32_DiskDrive | Select-Object DeviceID, SCSIPort, SCSITargetId, Size, Model
} | Select-Object -ExpandProperty ScriptOutput
# Förbered en samlingsarray för matchningsrapporten
$DiskMapping = @()
# Iterera bland varje disk i vSphere
foreach ($VMDisk in $VMDisks) {
# Extrahera SCSI-controller-nyckeln och enhetsnummer
$SCSIController = $VMDisk.ExtensionData.ControllerKey
$UnitNumber = $VMDisk.ExtensionData.UnitNumber
# Analysera eventuell VMDK UUID, om det skulle behövas för extra matchning
$VMDKUUID = $VMDisk.ExtensionData.Backing.Uuid
# Hitta motsvarande Windows-disk genom att jämföra SCSI-information
# Konvertera gärna $VMDisk.ScsiCanonicalName om tillämpligt för ökad precision
$MatchingWindowsDisk = ($WindowsDisks -split "`n") | ForEach-Object {
# Eftersom datan från Windows kommer som text så är det viktigt att parsa relevant information
if ($_ -match "DeviceID\s*:\s*(?<DeviceID>.+)") { $DeviceID = $Matches['DeviceID'].Trim() }
if ($_ -match "SCSIPort\s*:\s*(?<Port>\d+)") { $SCSIPort = [int]$Matches['Port'] }
if ($_ -match "SCSITargetId\s*:\s*(?<TargetId>\d+)") { $SCSITargetId = [int]$Matches['TargetId'] }
# Matcha baserat på controller och enhetsnummer
if ($SCSIPort -eq $SCSIController -and $SCSITargetId -eq $UnitNumber) {
return $_
}
}
if ($MatchingWindowsDisk) {
# Förbered en post med de matchande attributen
$DiskMapping += [PSCustomObject]@{
VMDiskName = $VMDisk.Name
VMDiskFilename = $VMDisk.Filename
VMDiskSCSI = "$SCSIController`:$UnitNumber"
VMDK_UUID = $VMDKUUID
WindowsDiskInfo = $MatchingWindowsDisk
}
}
}
# Skriv ut mappningsrapporten i konsolen som en tabell
$DiskMapping | Format-Table -AutoSize
# Exportera rapporten till en CSV-fil
$csvPath = "C:\VMwareDiskMapping_$ServerName.csv"
$DiskMapping | Export-Csv -Path $csvPath -NoTypeInformation
Write-Output "Diskmappningsrapport exporterad till: $csvPath"
# Koppla från vCenter-servern
Disconnect-VIServer -Server $vCenterServer -Confirm:$false
Skriptet utnyttjar Invoke-VMScript
för att exekvera ett kommando i den virtuella Windows-maskinen, vilket hämtar diskdata via Get-WmiObject
. Detta är en väl beprövad metod för att få realtidsdata från gästoperativsystemet och är ovärderlig när det gäller att matcha lagringsresurser.
Matchningen baseras på att jämföra SCSI-controller (som ofta returneras som ControllerKey
eller via ScsiCanonicalName
) samt sidans enhetsnummer, vilket motsvarar SCSIPort
och SCSITargetId
i Windows. Detta garanterar att rätt VMDK kopplas till rätt fysisk disk, även om datan inte är formaterad identiskt i båda systemen. I vissa fall kan ytterligare hantering av UUID vara nödvändig om datan presenteras med specifika formateringsavvikelser.
Rapportdata samlas in i ett PowerShell-objekt som sedan skrivs ut med Format-Table
för enkel visning i konsolen. Samtidigt exporteras data till en CSV-fil vilket möjliggör vidare analys, historikspårning och integration med andra verktyg.
Nedan finns en tabell som översiktligt visar de viktigaste attributen som jämförs vid matchningen:
Attribut från vSphere | Beskrivning | Attribut från Windows | Beskrivning |
---|---|---|---|
ControllerKey | Identifierar SCSI-controller i vSphere | SCSIPort | Portnummer för SCSI-controller i Windows |
UnitNumber | Identifierar enheten på SCSI-controller | SCSITargetId | Target-ID för disk i Windows |
Filename | Plats för VMDK-fil i datastore | DeviceID | Identifierande namn för fysiska diskenheten |
Backing.Uuid | UUID för VMDK, alternativ matchningsmetod | SerialNumber (via WMI) | Serienummer för disk i Windows, om tillämpligt |
Säkerställ att du har de senaste versionerna av PowerCLI installerade samt att WinRM är aktiverat på mål-VM:en. Detta kan verifieras med:
# Verifiera PowerCLI
Get-Module -ListAvailable VMware.VimAutomation.Core
# Kontrollera WinRM-konfiguration
winrm quickconfig
Om din miljö använder andra konfigurationsparametrar eller om du kräver att skriptet hanterar ytterligare attribut (såsom fler diskparametrar), kan du modifiera skriptblocket som körs i den virtuella maskinen eller lägga till ytterligare matchningsvillkor. Höj med exempelvis att jämföra diskstorlek eller modell om det behövs.
Innan du kör skriptet i en produktionsmiljö bör du testa det i en kontrollerad miljö. Spara skriptet som en .ps1-fil (till exempel, Match-VMDK.ps1) och kör sedan skriptet med rätt parametrar:
.\Match-VMDK.ps1 -vCenterServer "your_vcenter_server" -ServerName "your_vm_name"
Där "your_vcenter_server" är adressen till ditt vCenter och "your_vm_name" är namnet på den virtuella datorn.
Detta skript och de beskrivna stegen ger en solid grund för att matcha Windows-diskar med deras motsvarande VMDK i vSphere 7. Genom att anpassa och utöka skriptet vid behov kan du säkerställa en hög nivå av precision i din lagringshantering och felsökning.