次の方法で共有


QueryVersionAndStatus.ps1 PowerShell スクリプト

このトピックに含まれているコードを PowerShell スクリプト (.ps1 ファイル) として保存します。 「Windows UEFI ファームウェア更新プラットフォーム機能の検証」で説明されているように、QueryVersionAndStatus.ps1 PowerShell (PS) スクリプトを実行して、現在のファームウェアのバージョン、最後に試行したファームウェアのバージョン、および最後に試行したファームウェアの状態を照会します。

#
# QueryVersionAndStatus.ps1
#      Allows querying the current firmware version of a guid and the
#      LastAttemptStatus
#

new-variable -name FIRMWARERESOURCES_REGKEY_PATH -value "HKLM:\System\CurrentControlSet\Control\FirmwareResources\" -option Constant
new-variable -name LAST_ATTEMPT_STATUS_REGKEY -value "LastAttemptStatus" -option Constant
new-variable -name LAST_ATTEMPT_VERSION_REGKEY -value "LastAttemptVersion" -option Constant

##############################################################################
#
# Main routine.
# CmdLineArg - Array containing the command line arguments
#
##############################################################################
function Main($CmdLineArg) {
  $currentFwVersion = 0
  $currentFwVersionInHex = 0
  $lastAttemptFwVersion = 0
  $lastAttemptFwVersionInHex = 0
  $lastAttemptStatus = 0
  $lastAttemptStatusInHex = 0

  if ($CmdLineArg.Count -eq 0) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Expecting GUID of the EFI System Resource Entry (ESRE)"
    Write-Host "Usage: .\QueryVersionAndStatus.ps1 <guid>"
    Write-Host "`tQuery the current firmware version and Last Attempt Status for the ESRE entry with the given GUID"
    Write-Host "`tExample: .\QueryVersionAndStatus.ps1 6bd2efb9-23ab-4b4c-bc37-016517413e9a"
    return
  }

  if ($CmdLineArg[0] -eq "-?") {
    Write-Host "Usage: QueryVersionAndStatus.ps1 <guid>"
    Write-Host "`tQuery the current firmware version and Last Attempt Status for the ESRE entry with the given GUID"
    Write-Host "`tExample: .\QueryVersionAndStatus.ps1 6bd2efb9-23ab-4b4c-bc37-016517413e9a"
    return
  }

  # First argument is the GUID
  $guid = $CmdLineArg[0]

  # Validate the GUID
  if ($guid -notmatch "[0-9a-fA-F]{8}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{12}") {
      Write-Host -ForegroundColor Red -BackgroundColor Black "Incorrect Format for GUID{$guid}"
      Write-Host -ForegroundColor Red -BackgroundColor Black "Expected GUID Format: [0-9a-fA-F]{8}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{4}[-][0-9a-fA-F]{12}"
      Write-Host -ForegroundColor Red -BackgroundColor Black "Sample GUID: 6bd2efb9-23ab-4b4c-bc37-016517413e9a"
      return
  }

  Write-Host "Querying Firmware version and status information for the GUID: $guid"
  $query = GetCurrentFirmwareVesrion ($guid) ([REF]$currentFwVersion)
  if ($query -eq $FALSE) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Unable to query the current firmware version"
    return
  }
  $currentFwVersionInHex = "{0:X}" -f $currentFwVersion
  Write-Host "Current Firmware Version: $currentFwVersion (0x${currentFwVersionInHex})"

  $query = GetLastAttemptVesrion ($guid) ([REF]$lastAttemptFwVersion)
  if ($query -eq $FALSE) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Unable to query the last attempt firmware version"
    return
  }
  $lastAttemptFwVersionInHex = "{0:X}" -f $lastAttemptFwVersion
  Write-Host "Last Attempt Version: $lastAttemptFwVersion (0x${lastAttemptFwVersionInHex})"

  $query = GetLastAttemptStatus ($guid) ([REF]$lastAttemptStatus)
  if ($query -eq $FALSE) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Unable to query the last attempt status"
    return
  }
  $lastAttemptStatusInHex = "{0:X}" -f $lastAttemptStatus
  Write-Host "Last Attempt Status: $lastAttemptStatus (0x${lastAttemptStatusInHex})"
}

##############################################################################
#
# Constructs and returns the Firmware Resources registry key for the GUID.
# Guid - The GUID for which the resource registry key needs to be retrieved
# @Returns Firmware Resources registry key. $NULL on any error.
#
##############################################################################
function GetFirmwareResourceKeyForGuid($Guid) {
  if ($Guid -eq $NULL) {
    return $NULL
  }
  $resourceGuidRegKey = $FIRMWARERESOURCES_REGKEY_PATH + '{' + $Guid + '}'
  return $resourceGuidRegKey
}

##############################################################################
#
# Get the current firmware version for the given GUID. The current firmware
# version for a firmware resource device is stored in its Hardware ID.
# The HW ID is of the form: UEFI\RES_{<GUID>}&REV_XXXX
# where XXXX is the current firmware version in Hex.
# Guid - The GUID for which the firmware version has to be queried.
# [REF]FwVersionByRef - Current firmware version that is returned by reference
# @Returns - $TRUE if the query for firmware version was successful,
#   $FALSE otherwise
#
##############################################################################
function GetCurrentFirmwareVesrion($Guid, [REF]$FwVersionByRef) {

  if ( ($Guid -eq $NULL) -Or
       ($FwVersionByRef.value -eq $NULL)) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Unexpected NULL Argument(Guid) or (FwVersionByRef)"
    return $FALSE
  }

  $hwId = "UEFI\\RES_{$Guid}"
  $pnpProperties = gwmi win32_pnpentity | where-object {$_.HardwareID -match $hwId}
  if (!$?) {
    Write-Host -ForegroundColor Red -BackgroundColor Black $Error[0]
    return $FALSE
  }
  if ($pnpProperties -eq $NULL) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "No Device found with matching Hardware ID{$hwId}"
    return $FALSE
  }

  # Firmware resource devices have two Hardware IDs. One with the revision
  # and one without. We are interested the one with the Revision and that is the
  # first one.
  $hwIdWithRev = $pnpProperties.HardwareID[0]
  $devRevStr = $hwIdWithRev.SubString($hwIdWithRev.IndexOf("&REV_")+("&REV_").Length, $hwIdWithRev.Length - $hwIdWithRev.IndexOf("&REV_") - ("&REV_").Length)
  $devRev = [Convert]::ToInt32("$devRevStr", 16)
  $FwVersionByRef.value = $devRev
  return $TRUE

}

##############################################################################
#
# Get the last attempt firmware version for the given GUID. The last attempt firmware
# version for a firmware resource device is stored in its Firmware Resource
# registry keys under
# HKLM\System\CurrentControlSet\FirmwareResources\{<GUID>\ in the key
# "LastAttemptVersion"
# Guid - The GUID for which the firmware version has to be queried.
# [REF]FwVersionByRef - Expected firmware version that is returned by reference
# @Returns - $TRUE if the query for firmware version was successful,
#   $FALSE otherwise
#
##############################################################################
function GetLastAttemptVesrion($Guid, [REF]$FwVersionByRef) {

  if ( ($Guid -eq $NULL) -Or
       ($FwVersionByRef.value -eq $NULL)) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Unexpected NULL Argument(Guid) or (FwVersionByRef)"
    return $FALSE
  }

  $resourceGuidRegKey = GetFirmwareResourceKeyForGuid($Guid)
  $expectedVersion = Get-ItemProperty $resourceGuidRegKey -Name $LAST_ATTEMPT_VERSION_REGKEY
  if (!$?) {
    Write-Host -ForegroundColor Red -BackgroundColor Black $Error[0]
    return $FALSE
  }
  $FwVersionByRef.Value = ${expectedVersion}.${LAST_ATTEMPT_VERSION_REGKEY}
  return $TRUE

}

##############################################################################
#
# Get the last attempt status for the given GUID.
# The last attempt status for a firmware resource device is stored in its
# Firmware Resource registry keys under HKLM\System\CurrentControlSet\FirmwareResources\{<GUID>\
# in the key "LastAttemptStatus".
# Guid - The GUID for which the firmware version has to be queried.
# [REF]FwVersionByRef - Expected firmware version that is returned by reference
# @Returns - $TRUE if the query for firmware version was successful,
#   $FALSE otherwise
#
##############################################################################
function GetLastAttemptStatus($Guid, [REF]$LastAttemptStatusByRef) {

  if ( ($Guid -eq $NULL) -Or
       ($LastAttemptStatusByRef.value -eq $NULL)) {
    Write-Host -ForegroundColor Red -BackgroundColor Black "Unexpected NULL Argument(Guid) or (LastAttemptStatusByRef)"
    return $FALSE
  }

  $resourceGuidRegKey = GetFirmwareResourceKeyForGuid($Guid)
  $expectedVersion = Get-ItemProperty $resourceGuidRegKey -Name $LAST_ATTEMPT_STATUS_REGKEY
  if (!$?) {
    Write-Host -ForegroundColor Red -BackgroundColor Black $Error[0]
    return $FALSE
  }
  $LastAttemptStatusByRef.Value = ${expectedVersion}.${LAST_ATTEMPT_STATUS_REGKEY}
  return $TRUE

}

$ErrorActionPreference = "SilentlyContinue"
Main($args)
# SIG # Begin signature block
# MIIO7wYJKoZIhvcNAQcCoIIO4DCCDtwCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBIg7kTlhV05Beu
# AxOp05UlhM4iLqyBeXZCQImKOpD8CqCCDAswggXlMIIDzaADAgECAgphA18JAAAA
# AAACMA0GCSqGSIb3DQEBCwUAMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMTowOAYDVQQDEzFNaWNyb3NvZnQgVGVzdGluZyBSb290IENlcnRp
# ZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDYyMTIyNTUwMVoXDTE0MDYyMTIz
# MDUwMVowgYExEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJkiaJk/IsZAEZFglt
# aWNyb3NvZnQxFDASBgoJkiaJk/IsZAEZFgRjb3JwMRcwFQYKCZImiZPyLGQBGRYH
# cmVkbW9uZDEgMB4GA1UEAxMXTVNJVCBUZXN0IENvZGVTaWduIENBIDMwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbcd0NMi0I6C0BkJzfnzJYi0fQ/ppr
# QF52ohAADtKPzqFfQqcLXoPC6QamCrQ9MFDbNUMs08PGPMm1iPwL5qNxR879iGKk
# JeJOG3k947+LhC1kJaX6jjCu4zR9J/Ne9AVgxg8aG56vITep2ba3alRLXqB1tZrE
# tr4o4zv3Wgh32TlKKnr49P7oElRBEVXIx5g+ZKW72mukqimMnydVJef9MXBgHdPE
# 8rnvkkqfyEyT5xmoTrzjYvTgbuxFbmFOrVjg8Or3dCzfG/ZDPITCjAu0vUpXpgxO
# nnNDXy2vIvSm/VqHub5vnh2ZyN+VwgKtfUrzul3oe25X5ToC+NMBFa5PAgMBAAGj
# ggFMMIIBSDAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUTv5hOW/KxWTgILba
# wblSDsrfjv4wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGG
# MBIGA1UdEwEB/wQIMAYBAf8CAQAwHwYDVR0jBBgwFoAUowEEfjCIM+u5MZzK64V2
# Z/xltNEwWQYDVR0fBFIwUDBOoEygSoZIaHR0cDovL2NybC5taWNyb3NvZnQuY29t
# L3BraS9jcmwvcHJvZHVjdHMvTWljVGVzUm9vQ2VyQXV0XzIwMTAtMDYtMTcuY3Js
# MF0GCCsGAQUFBwEBBFEwTzBNBggrBgEFBQcwAoZBaHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3BraS9jZXJ0cy9NaWNUZXNSb29DZXJBdXRfMjAxMC0wNi0xNy5jcnQw
# DQYJKoZIhvcNAQELBQADggIBAJEtETbRLF4hd2Iaoc+afmItyZC5Dj1xDaBKSK3h
# 1rBzSlFLTLJriApat+lVZ0OL8Z3MUgOvrIXp03XO5W+LPICBq9HRcw1rsFG4ol4M
# CeWmvFRJ5VQ4WrdD0nU0Ut01eZWY1TzG2kay2KCnzDAxD0vrtwKrKzjStyfCxw1i
# pMBI9BpIeX3hMaRdGdAYFwDK410LwYV/8b7Ty5f0G2IP1xQ4jbIumNRBarC1hO7Y
# LC0T/FAdmm8xhxzg0NDTJFLfEo37938zBBd6i+O9fB6iKpF22fxDF6cKodnGPDpC
# 7bcSzZ7d/pGdmLU16JTdms7U9KzKps1ZPd5Evw6C5d9c40nLAaB/e+IlIauVUB6f
# 6ndWR3Rz8iUbDja5ole/LFe85PuIsYNW2DzgfP0Rn97ht9TGI6+ux15PxSN0mDh0
# nQ0NbfTeKERB2CJo51enZnS1wzEk4nzVUl2K0k4UuwjTGjESBFibOpl4k1E/C4XO
# 3glY+ZYbkRGgaFMzy74IicyVVa4GeCeZolbvrpUKfw3rQwzGnj+Au8R0A524Gqq8
# yx4D+9hJiZ0gqiVLR2f0pw2NdjDGSM7djfq+2rTrPdgMOxWa0YOF5eOSqjutNAw5
# 8X91ruhwsP3yjina3AlPintjvh6Kw1jRA7436e0yJqgM/u0Sp2MEs5KX2UajMzOc
# W7xUMIIGHjCCBQagAwIBAgIKFXnSxwAAAF/cdTANBgkqhkiG9w0BAQsFADCBgTET
# MBEGCgmSJomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEU
# MBIGCgmSJomT8ixkARkWBGNvcnAxFzAVBgoJkiaJk/IsZAEZFgdyZWRtb25kMSAw
# HgYDVQQDExdNU0lUIFRlc3QgQ29kZVNpZ24gQ0EgMzAeFw0xMjA3MjUyMjMwNTFa
# Fw0xNDA2MjEyMzA1MDFaMHAxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xGjAYBgNVBAMTEU1pY3Jvc29mdCBXaW5kb3dzMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEAppC1kAZKzfTrXEGHssfY2C4JCYiunApsWl//v8Id
# UKUYBG9y4vNcAaB0rmgw58lYf1DC80xEYd8FL8i868erxNMzOiWj3waRjexSdDGa
# VFw8pWBfTmpgseUnPWSm1zrz2Uxgo78aBXuZzhx6NCEq0awylQ+m5sjbI5cWptAe
# N/qHIB+LJ+x3tg4st+y2mrJGhQfdGXu4Xv2326YdSn2Elnvr6SBdWVoSOcksokzV
# bqO9TlMbZePYnSeGVaUZwHmK71SmQC6ECM4ElE9djngFNXhgXYlYRgDVAhHEN4sr
# fDhtkk6A/n9MSalVeGUofX4Z70aBP/U+Qkgp6+KLctTtTwIDAQABo4ICpjCCAqIw
# PQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUIg8+JTa3yAoWhnwyC+sp9geH7dIFP
# hJrxaYWhrR0CAWQCAQ8wCwYDVR0PBAQDAgeAMCkGCSsGAQQBgjcVCgQcMBowDAYK
# KwYBBAGCNwoDBjAKBggrBgEFBQcDAzAfBgNVHSUEGDAWBgorBgEEAYI3CgMGBggr
# BgEFBQcDAzAdBgNVHQ4EFgQUCqyV686wijBJFTU5SSxxGX6++gowMQYDVR0RBCow
# KKAmBgorBgEEAYI3FAIDoBgMFnN1bmlsbXV0QG1pY3Jvc29mdC5jb20wHwYDVR0j
# BBgwFoAUTv5hOW/KxWTgILbawblSDsrfjv4wgegGA1UdHwSB4DCB3TCB2qCB16CB
# 1IY2aHR0cDovL2NvcnBwa2kvY3JsL01TSVQlMjBUZXN0JTIwQ29kZVNpZ24lMjBD
# QSUyMDMuY3Jshk1odHRwOi8vbXNjcmwubWljcm9zb2Z0LmNvbS9wa2kvbXNjb3Jw
# L2NybC9NU0lUJTIwVGVzdCUyMENvZGVTaWduJTIwQ0ElMjAzLmNybIZLaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL01TSVQlMjBUZXN0JTIw
# Q29kZVNpZ24lMjBDQSUyMDMuY3JsMIGpBggrBgEFBQcBAQSBnDCBmTBCBggrBgEF
# BQcwAoY2aHR0cDovL2NvcnBwa2kvYWlhL01TSVQlMjBUZXN0JTIwQ29kZVNpZ24l
# MjBDQSUyMDMuY3J0MFMGCCsGAQUFBzAChkdodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpL21zY29ycC9NU0lUJTIwVGVzdCUyMENvZGVTaWduJTIwQ0ElMjAzLmNy
# dDANBgkqhkiG9w0BAQsFAAOCAQEAFwn81HkPHo1ZyJ9vuIGRA0FPB8vTpVQkyZJI
# NwCwZsWnDhj2QaEApWVAqK11amHimblHSuqrHJQQWK1bD78F+Z/c2i6GJLnAJAjl
# yqLqYGJZ+l3id/LtNsE2eb3oWpZ9zFAvd17CUtueTjtPidYry08VL/Hh22KfW8xd
# i4Y1KyPpifkIBw7piuykMq/EfyfjZMmVMjpH065vQdX/EWO60Mmm4cuPrT95R077
# h4FqRx59LYgnV9/umHB2iRxu42ehZHSr7Axtxcu1W3+XDqr7cl2wSPNeJbi0u6H2
# ney1RWTMZ1sCbJ0dx/lmb/0sUlk+Xq28gTdZD30ZFdzYro0k/DGCAjowggI2AgEB
# MIGQMIGBMRMwEQYKCZImiZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWlj
# cm9zb2Z0MRQwEgYKCZImiZPyLGQBGRYEY29ycDEXMBUGCgmSJomT8ixkARkWB3Jl
# ZG1vbmQxIDAeBgNVBAMTF01TSVQgVGVzdCBDb2RlU2lnbiBDQSAzAgoVedLHAAAA
# X9x1MA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcN
# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
# LwYJKoZIhvcNAQkEMSIEIMjNoIyg2MGG+LFOqGSBLXVkS+8WthPViNe0xt7N/Zha
# MA0GCSqGSIb3DQEBAQUABIIBAEDSPp6JtrDpRQOwvazx8NqmcIF2A2HFnnp1h+Lp
# aHUAyl5M07iri/MIqW64RbREOdbCh7yAwFqw8m1PTHwk42xMW+mQPxPvr2gyk45N
# k1YWCXST0fjutwrZKY3w7Q4sSoas0F5KHkb9DPncb8aM+rrlyBhvo7aZcEyc/mXq
# 672CR2fVfTniJO6FP/GjK5hmtvlmcMnbtO9ztKgpc7E6Z1hSns0KNyXZdRdXC3EX
# tsJ7grMN9gy+RtkTBfiQBCDqdytnloZIk6DUyof32SC6BG88yllmYKT3Y6WsisVM
# vQQdvRMzv61bF54XJvC0I6OkpCEaYF9XR5E02CK4XdUch+g=
# SIG # End signature block

Windows UEFI ファームウェア更新プラットフォームの機能の検証