Ask me anything
Ithy Logo
Sign in to save

Identifiera VMDK kopplingar i vCenter 7

PowerShell-skript för att matcha VMDK-filer med Windows-enheter med servernamn som input

vcenter server room hardware racks

Viktiga insikter

  • Automatisk datainsamling: Skriptet hämtar information om virtuella diskar via PowerCLI och Windows-diskar via WMI.
  • Matchning baserat på storlek och UUID: Använd diskstorlek som en primär matchningsmetod samt UUID om det är aktiverat i VM-inställningarna.
  • Användarvänligt: Skriptet tar servernamn som input och guidar användaren genom anslutning, datahämtning och isolering av resultaten.

Omfattande skriptbeskrivning

Det här PowerShell-skriptet är utformat för att koppla samman VMDK-filer med fysiska disk-enheter i Windows som körs på en virtuell maskin i vCenter 7. Skriptet använder VMware PowerCLI för att ansluta till vCenter, hämta information om den angivna virtuella maskinen och dess associerade hårddiskar samt PowerShell-kommando för att samla information om Windows-diskar genom WMI. Huvudsyftet är att ge en översiktlig mappning mellan VMDK-filer (virtuella diskar) och faktiska diskenheter i Windows.

Steg för steg-process

1. Inmatning och anslutning

Skriptet tar emot två inmatningar: vCenter-serveradress och det specifika virtuella maskinens namn (servernamn). Efter att användaren tillhandahållit dessa uppgifter, används PowerCLI-modulen för att ansluta till vCenter.

2. Hämtning av VMDK-information

När anslutningen är upprättad, hämtas den specificerade virtuella maskinens information. Skriptet extraherar alla VMDK-filer kopplade till maskinen genom att använda kommandot Get-HardDisk. För varje hårddisk extraheras information som filnamn, kapacitet (i GB) och om möjligt UUID genom att använda de interna egenskaperna i $disk.ExtensionData.Backing.

3. Hämtning av Windows-diskar

För att matcha de virtuella diskarna med Windows-enheter används WMI (Win32_DiskDrive) för att hämta information om de fysiska diskarna i Windows-gästen. Här letar skriptet efter attribut såsom DeviceID, SerialNumber och Size.

4. Matchningsstrategi

Matchningen görs huvudsakligen genom att jämföra diskstorleken, vilket är en robust metod om inte två diskar är identiska i storlek. Om VM:s avancerade inställningar har aktiverat disk.EnableUUID är det också möjligt att matcha en virtuell disk med en Windows-disk genom att jämföra UUID mot Windows-diskens serienummer (efter nödvändig formatering, t.ex. ta bort bindestreck).


Det kompletta PowerShell-skriptet

Nedan finns det kompletta skriptet som utför ovan nämnda process. Spara skriptet som en .ps1-fil, exempelvis Match-VMDK-WindowsDisks.ps1, och kör det i PowerShell med nödvändiga administratörsbehörigheter.


#Requires -Modules VMware.PowerCLI

<#
.SYNOPSIS
   Skript för att identifiera vilka VMDK-filer som är kopplade till specifika diskenheter i Windows.
.DESCRIPTION
   Detta skript ansluter till en vCenter-server, hämtar den angivna virtuella maskinens hårddiskar, 
   och matchar dem mot Windows-diskar genom diskstorlek och (om möjligt) UUID.
.PARAMETER vCenterServer
   Namn eller IP-adress för vCenter-servern.
.PARAMETER VMName
   Namn på den virtuella maskinen (servernamn) att undersöka.
#>

param (
    [Parameter(Mandatory=$true)]
    [string]$vCenterServer,
    
    [Parameter(Mandatory=$true)]
    [string]$VMName
)

# Importera VMware PowerCLI modulen
Import-Module VMware.PowerCLI

try {
    # Anslut till vCenter
    Write-Host "Ansluter till vCenter-server: $vCenterServer..." -ForegroundColor Cyan
    Connect-VIServer -Server $vCenterServer -ErrorAction Stop
} catch {
    Write-Error "Kunde inte ansluta till vCenter-servern: $vCenterServer. Kontrollera din inmatning."
    exit
}

# Hämta VM
$vm = Get-VM -Name $VMName -ErrorAction SilentlyContinue
if (-not $vm) {
    Write-Error "Den virtuella maskinen '$VMName' hittades inte."
    Disconnect-VIServer -Server $vCenterServer -Confirm:$false
    exit
}

Write-Host "Found VM: $VMName" -ForegroundColor Green

# Hämta VMDK-diskar för VM
$hardDisks = Get-HardDisk -VM $vm
if (-not $hardDisks) {
    Write-Error "Inga hårddiskar hittades för maskinen '$VMName'."
    Disconnect-VIServer -Server $vCenterServer -Confirm:$false
    exit
}

# Hämta Windows-diskinformation via WMI
# Här antas att skriptet körs på Windows-gästen eller att WMI är tillgängligt över nätverket.
# Du kan behöva administratörsbehörighet och korrekt konfiguration av fjärr-WMI.
try {
    Write-Host "Hämtar Windows-diskinformation via WMI..." -ForegroundColor Cyan
    $windowsDisks = Get-WmiObject -Class Win32_DiskDrive -ComputerName $VMName -ErrorAction Stop
} catch {
    Write-Warning "Kunde inte hämta diskdata via WMI från '$VMName'. Se till att den nödvändiga åtkomsten finns."
    $windowsDisks = @()
}

# Array för att lagra matchningsresultat
$result = @()

foreach ($disk in $hardDisks) {
    $vmdkPath = $disk.Filename
    $diskSizeGB = $disk.CapacityGB
    $diskUUID = ""
    
    # Försök hämta UUID om det existerar (kräver disk.EnableUUID)
    try {
        $diskUUID = $disk.ExtensionData.Backing.Uuid
    } catch {
        $diskUUID = "Ej tillgänglig"
    }
    
    $matchedWinDisk = $null
    # Matchning via diskstorlek
    foreach ($winDisk in $windowsDisks) {
        $winDiskSizeGB = [math]::Round($winDisk.Size / 1GB, 2)
        if ($winDiskSizeGB -eq $diskSizeGB) {
            $matchedWinDisk = $winDisk
            break
        }
    }
    
    $resultObj = [PSCustomObject]@{
        VMDK_File     = $vmdkPath
        VMDK_Size_GB  = $diskSizeGB
        VMDK_UUID     = $diskUUID
        Windows_Device= if ($matchedWinDisk) { $matchedWinDisk.DeviceID } else { "Ingen matchning" }
        Windows_Model = if ($matchedWinDisk) { $matchedWinDisk.Model } else { "Ingen matchning" }
        Windows_Size_GB = if ($matchedWinDisk) { [math]::Round($matchedWinDisk.Size/1GB,2) } else { 0 }
    }
    $result += $resultObj
}

# Visa resultatet i en tabell
Write-Host "`nMatchningsresultat:" -ForegroundColor Green
$result | Format-Table -AutoSize

# Alternativ: Exportera resultatet till CSV
#$result | Export-Csv -Path "DiskMapping_$VMName.csv" -NoTypeInformation

# Koppla från vCenter-servert
Disconnect-VIServer -Server $vCenterServer -Confirm:$false

Write-Host "`nSkriptklart. Kontrollera resultatet ovan." -ForegroundColor Cyan
  

Översiktlig tabell med skriptets funktioner

Steg Beskrivning Nyckelkommandon/Metoder
1. Inmatning & Anslutning Användaren matar in vCenter-server och VM-namn. Ansluter till vCenter med Connect-VIServer. Connect-VIServer, Read-Host, Param()
2. Hämta VMDK Information Hämtar information om VMDK-filer och deras egenskaper (Storlek, UUID, sökväg). Get-VM, Get-HardDisk
3. Hämta Windows Disk Information Använder WMI (Win32_DiskDrive) för att hämta information om Windows-diskar. Get-WmiObject
4. Matchning Matchar VMDK med Windows-disk baserat på diskstorlek och evt. UUID om tillgängligt. Loopen, kontrollstrukturer, Format-Table
5. Resultat Visar en tabell med mappningsresultat och ger möjlighet att exportera data. Format-Table, Export-Csv (valfritt)

Referenser

Rekommenderade sökfrågor

virtuallyjason.blogspot.com
Orphaned VMDK Files

Last updated March 5, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI