diff --git a/CHECKSUMS.txt b/CHECKSUMS.txt index 08887bd..64389f9 100644 --- a/CHECKSUMS.txt +++ b/CHECKSUMS.txt @@ -5,8 +5,8 @@ 229B99CB364794905604F3DF1AF743818B87BEF3285AEA2D8F9E2EF7110BEBE6 LICENSE 2758FD3259782144EEB4861E1FE897067C8AD00E03B3AFDB011D2FE2BAD591BA CONTRIBUTING.md 3F0B53A6D0B38D4E0C58E0EB68C7EA7CAA269FE2C40BEDB040CB5F52FBAC9325 TASK-SEQUENCE.md -415808C493F891C25EF97E2C72A9441E1ECBF2E62FEF523FD0A7EF4835ADB20A Invoke-OSDDiskLayout.ps1 -415808C493F891C25EF97E2C72A9441E1ECBF2E62FEF523FD0A7EF4835ADB20A Scripts/Invoke-OSDDiskLayout.ps1 +C0886CD6AB12CD85B6F59C8DF2B43810C7046E338B691FA43872D51062E6610F Invoke-OSDDiskLayout.ps1 +C0886CD6AB12CD85B6F59C8DF2B43810C7046E338B691FA43872D51062E6610F Scripts/Invoke-OSDDiskLayout.ps1 4C72A839E749AEDC6F440F020AF486F0384B7EA7147693ECA91F2A463A2B40D7 Tests/Branding.Tests.ps1 5680E037241C06860FCAC7D8F6FF9AB2BBD6045D01A2E1F6271750222C29D494 _layouts/default.html 65F1921C51C1F3AD2BFF6871DC12CB2E5B8FCBB74C35ABD992EA18EF6CC72EF7 assets/css/style.scss @@ -25,7 +25,7 @@ B3FA5B1E4D7F52FEF40C54F52D4B0C6D63EED3F3193E99976D8EDE75DFD87482 PSScriptAnalyz B4052A8246C92104D479C9760DFC99D79B710AE0EDCA21866585C94CAF2B5B7C assets/banner.svg B7469B888920F0CC7AFE47067BE298E4FA5576094CACEEEDB44A102E1A9389AD build/Invoke-Validation.ps1 BFE846987094295386DD402ABB9114B5D104C70FAF7615AB48CCA02A9E35BB63 .github/ISSUE_TEMPLATE/bug_report.yml -C95AEE4322473E9562363DE4B6AE6345EB46FB0114114992799296541F6CDAE6 Tests/Invoke-OSDDiskLayout.Tests.ps1 +19FE11ED6554E89B636133484C202FDA996EB7FE816984F5BD5272DE996199CD Tests/Invoke-OSDDiskLayout.Tests.ps1 DF3A074261544800B739DEE93B071DE5383EFE796B874D7673AD69A5548F7A4A .github/FUNDING.yml EE0AE7CB2CDBA1FCE9931C070088CB6111695425DAD8C5EDF42522695B018B05 assets/banner-compact.svg F0046572EFD5AF68B572580D6B060F552EC6C89EB5BD10143E948FEC67E12C79 _config.yml diff --git a/Invoke-OSDDiskLayout.ps1 b/Invoke-OSDDiskLayout.ps1 index ebab09e..7346bba 100644 --- a/Invoke-OSDDiskLayout.ps1 +++ b/Invoke-OSDDiskLayout.ps1 @@ -621,8 +621,8 @@ function Test-SameDisk { } } - $Drive = @(Get-CimInstance -ClassName Win32_DiskDrive -ErrorAction Stop | - Where-Object { [int]$_.Index -eq $Selection.Number }) + $Drive = @(Get-CimInstance -ClassName Win32_DiskDrive ` + -Filter "Index = $($Selection.Number)" -ErrorAction Stop) if ($Selection.WmiFound) { if (($Drive.Count -ne 1) -or ([string]$Drive[0].PNPDeviceID -ne $Selection.PnpId)) { @@ -1160,8 +1160,8 @@ try { (([string]$ResultDisk.SerialNumber).Trim() -ne $Selected.Serial))) { throw 'Post-format disk identity or partition-style verification failed.' } - $PostDevice = @(Get-CimInstance -ClassName Win32_DiskDrive -ErrorAction Stop | - Where-Object { $_.Index -eq $Selected.Number }) + $PostDevice = @(Get-CimInstance -ClassName Win32_DiskDrive ` + -Filter "Index = $($Selected.Number)" -ErrorAction Stop) if ($Selected.WmiFound -and ($PostDevice.Count -ne 1 -or [string]$PostDevice[0].PNPDeviceID -ne $Selected.PnpId)) { diff --git a/Scripts/Invoke-OSDDiskLayout.ps1 b/Scripts/Invoke-OSDDiskLayout.ps1 index ebab09e..7346bba 100644 --- a/Scripts/Invoke-OSDDiskLayout.ps1 +++ b/Scripts/Invoke-OSDDiskLayout.ps1 @@ -621,8 +621,8 @@ function Test-SameDisk { } } - $Drive = @(Get-CimInstance -ClassName Win32_DiskDrive -ErrorAction Stop | - Where-Object { [int]$_.Index -eq $Selection.Number }) + $Drive = @(Get-CimInstance -ClassName Win32_DiskDrive ` + -Filter "Index = $($Selection.Number)" -ErrorAction Stop) if ($Selection.WmiFound) { if (($Drive.Count -ne 1) -or ([string]$Drive[0].PNPDeviceID -ne $Selection.PnpId)) { @@ -1160,8 +1160,8 @@ try { (([string]$ResultDisk.SerialNumber).Trim() -ne $Selected.Serial))) { throw 'Post-format disk identity or partition-style verification failed.' } - $PostDevice = @(Get-CimInstance -ClassName Win32_DiskDrive -ErrorAction Stop | - Where-Object { $_.Index -eq $Selected.Number }) + $PostDevice = @(Get-CimInstance -ClassName Win32_DiskDrive ` + -Filter "Index = $($Selected.Number)" -ErrorAction Stop) if ($Selected.WmiFound -and ($PostDevice.Count -ne 1 -or [string]$PostDevice[0].PNPDeviceID -ne $Selected.PnpId)) { diff --git a/Tests/Invoke-OSDDiskLayout.Tests.ps1 b/Tests/Invoke-OSDDiskLayout.Tests.ps1 index 6228992..9baed8b 100644 --- a/Tests/Invoke-OSDDiskLayout.Tests.ps1 +++ b/Tests/Invoke-OSDDiskLayout.Tests.ps1 @@ -22,6 +22,7 @@ BeforeAll { 'Select-OSDTargetDisk', 'Assert-OSDFirmwareDiskGeometry', 'Assert-OSDDiskState', + 'Test-SameDisk', 'New-OSDPartitionPlan', 'New-OSDDiskPartCommands', 'Assert-OSDPartitionStructure', @@ -416,6 +417,70 @@ Describe 'Final disk recheck (no hardware writes)' { } } +Describe 'Targeted WMI disk recheck (no hardware writes)' { + It 'queries only the selected disk and still verifies its identity' { + $Selection = New-FixtureDisk -Number 3 -Serial 'APPROVED' + $Current = [pscustomobject]@{ + Size = $Selection.SizeBytes + LogicalSectorSize = $Selection.LogicalSectorSize + BusType = $Selection.BusType + FriendlyName = $Selection.Model + SerialNumber = $Selection.Serial + UniqueId = $Selection.UniqueId + HealthStatus = $Selection.HealthStatus + IsOffline = $Selection.IsOffline + IsReadOnly = $Selection.IsReadOnly + IsClustered = $Selection.IsClustered + } + $Device = [pscustomobject]@{ + Index = $Selection.Number + PNPDeviceID = $Selection.PnpId + InterfaceType = $Selection.WmiInterface + MediaType = $Selection.WmiMedia + Status = $Selection.WmiStatus + } + Mock Get-Disk { $Current } + Mock Get-CimInstance { $Device } -ParameterFilter { + $ClassName -eq 'Win32_DiskDrive' -and $Filter -eq 'Index = 3' + } + + { Test-SameDisk -Selection $Selection } | Should -Not -Throw + Should -Invoke Get-CimInstance -Exactly 1 -ParameterFilter { + $ClassName -eq 'Win32_DiskDrive' -and $Filter -eq 'Index = 3' + } + } + + It 'rejects a selected disk whose WMI device identity changed' { + $Selection = New-FixtureDisk -Number 3 -Serial 'APPROVED' + $Current = [pscustomobject]@{ + Size = $Selection.SizeBytes + LogicalSectorSize = $Selection.LogicalSectorSize + BusType = $Selection.BusType + FriendlyName = $Selection.Model + SerialNumber = $Selection.Serial + UniqueId = $Selection.UniqueId + HealthStatus = $Selection.HealthStatus + IsOffline = $Selection.IsOffline + IsReadOnly = $Selection.IsReadOnly + IsClustered = $Selection.IsClustered + } + $Device = [pscustomobject]@{ + Index = $Selection.Number + PNPDeviceID = 'SCSI\\DISK&VEN_CHANGED' + InterfaceType = $Selection.WmiInterface + MediaType = $Selection.WmiMedia + Status = $Selection.WmiStatus + } + Mock Get-Disk { $Current } + Mock Get-CimInstance { $Device } -ParameterFilter { + $ClassName -eq 'Win32_DiskDrive' -and $Filter -eq 'Index = 3' + } + + { Test-SameDisk -Selection $Selection } | + Should -Throw 'Disk device identity changed since selection; refusing to erase it.' + } +} + Describe 'Partition calculation and DiskPart plan' { It 'keeps the complete command sequence with Data=' -Tag 'Cleanup' -ForEach @( @{ FirmwareMode = 'UEFI'; DataMiB = 0 }