2019/10/07

Windows 7 で Get-ComputerInfo がぁぁぁ

Get-ComputerInfo 使いたくて、Windows 7 SP1 に Windows PowerShell 5.1(Windows Management Framework 5.1)を追加してみたら、動かない。Windows 8.1 + Windows PowerShell 5.1 なら期待通りに動く。


どうやら、BiosFirmwareType プロパティを取得するための GetFirmwareType API がエラーになっているらしい。でもって、他のすべてのプロパティも取得できず...(以下に続く)


$ErrorActionPreference をいじってみても、Get-ComputerInfo は完全に口を閉ざすだけ。まぁ、多分こうなると思ってたけど。

GetFirmwareType は Windows 8/Server 2012 から登場したもの。Windows 7/2008 R2 以前は GetFirmwareEnvironmentVariable を使うそうな。

GetFirmwareType Function
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getfirmwaretype
Minimum supported client Windows 8 [desktop apps only]
Minimum supported server Windows Server 2012 [desktop apps only]

GetFirmwareEnvironmentVariableA function
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getfirmwareenvironmentvariablea
Minimum supported client Windows Vista, Windows XP with SP1 [desktop apps | UWP apps]
Minimum supported server Windows Server 2003 [desktop apps | UWP apps]

このバグのフィードバックがあった↓。Windows PowerShell 5.1 で修正する気はなんとなく感じられない。7 の余命もあとわずかだし。

Get-ComputerInfo : Unable to find an entry point named 'GetFirmwareType' in DLL 'kernel32.dll'."  #3023
https://github.com/PowerShell/PowerShell/issues/3023

オープンソース&クロスプラットフォームな PowerShell Core 6(https://aka.ms/pscore6)だと、このバグへの対応が行われていて、Windows 7 でも Get-ComputerInfo が利用可能でした。ただし、GetFirmwareType に対応する BiosFirmwareType プロパティは空っぽ。



OS を識別して GetFirmwareType と GetFirmwareEnvironmentVariable を使い分けているのではなく、GetFirmwareType のエラーをサイレントに無視しているそうで。

Add wrappers around native API calls to catch exceptions. (#3023) #3375
https://github.com/PowerShell/PowerShell/pull/3375

それ以外のプロパティはおおむね取得できてると思う。


PowerShell Core 6 の現在のバージョン(現時点で最新は v6.2.3)は、Windows 8.1 以前での日本語の扱いが苦手らしいし(漢字が二重になるとか)、オープンソースでリリース サイクルが早いので(更新が面倒)、常用する気にはまったくならない。Windows 7 でのGet-ComputerInfo のほうをあきらめることにする(Msinfo32 とか WMIC とかで代用できるし、BIOSかUEFIかはBCDEDITでwinload.exeか.efiかで分かるし)。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。