Chat
Search
Ithy Logo

Färdigt PowerShell-Skript för att Matcha Windows-diskar med VMware VMDK

Ett skript med parametrar för vCenter och servernamn för att matcha SCSI-controller och DISKID

physical server rack with vmdk disks

Viktiga insikter

  • PowerCLI Integration: Skriptet utnyttjar VMware PowerCLI för att hämta detaljerad information om VMDK, SCSI-controller och lagringsparametrar.
  • WinRM och Invoke-VMScript: Genom att använda Windows Remote Management (WinRM) och Invoke-VMScript kan du hämta diskar från Windows-operativsystemet och matcha dem med VMware-värden.
  • Parametrisering och Rapportering: Skriptet är parametriserat med vCenter-server och servernamn och genererar en rapport både i konsolen och i en CSV-fil.

Översikt av Skriptet

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.

Detaljerad Genomgång

1. Miljökrav

För att skriptet ska fungera korrekt måste du säkerställa att miljön är korrekt konfigurerad:

  • PowerShell 5.1 eller senare bör vara installerat.
  • VMware PowerCLI-modul installerad och uppdaterad. Du kan installera modulen med kommandot: Install-Module -Name VMware.PowerCLI.
  • WinRM (Windows Remote Management) måste vara aktiverat och korrekt konfigurerat på målservern.
  • Administratörsbehörighet för att ansluta till både vCenter och den virtuella Windows-datorn.

2. Skriptparametrar

Skriptet kräver två obligatoriska parametrar:

  • vCenterServer: Namn eller IP-adress till vCenter.
  • ServerName: Namnet på den virtuella maskinen (VM) vars diskinformation ska hämtas och matchas.

3. Steg för Steg Genomgång

a. Import och Anslutning till vCenter

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.

b. Hämtning av VM och Diskinformation

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).

c. Hämta Windows Diskinformation

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.

d. Matchning av Diskar

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.

e. Skapa och Exportera Rapporten

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.


Färdigt Powershell-skript

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

Förklaringar och Anpassningar

Användning av Invoke-VMScript

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.

Direkt Jämförelse av SCSI-information

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.

Export och Rapportering

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.

Tabell över Viktiga Attribut

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

Praktiska Tips och Felsökning

Verifiera PowerCLI och WinRM

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

Anpassa Skriptet för Din Miljö

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.

Körning och Testning

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.


Referenser

Rekommenderade Sökningar


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.


Last updated March 5, 2025
Ask Ithy AI
Export Article
Delete Article