8

WinPE 4 (powershell) (または別の方法として WinPE 3 (vbs))で起動したことを確実に検出する方法を探しています。UEFIまたは BIOS システムから起動しましたか? 制限された環境にいるため、サードパーティのexeを実行せずに

これにより、パーティションのレイアウトとフォーマットが変更されるため、Windows 展開のパーティション分割方法が大幅に変わります。(GPT 対 MBR など)

Powershell v3でこのC++コードを適応させたものがありますが、かなりハックっぽいです:

## Check if we can get a dummy flag from the UEFI via the Kernel
## [Bool] check the result of the kernel's fetch of the dummy GUID from UEFI
## The only way I found to do it was using the C++ compiler in powershell
Function Compile-UEFIDectectionClass{
    $win32UEFICode= @'
    using System;
    using System.Runtime.InteropServices;

    public class UEFI
    {
       [DllImport("kernel32.dll")]
       public static extern UInt32 GetFirmwareEnvironmentVariableA([MarshalAs(UnmanagedType.LPWStr)] string lpName, [MarshalAs(UnmanagedType.LPWStr)] string lpGuid, IntPtr pBuffer, UInt32 nSize); 

       public static UInt32 Detect()
       {
            return GetFirmwareEnvironmentVariableA("", "{00000000-0000-0000-0000-000000000000}", IntPtr.Zero, 0);
       }
    }
    '@

Add-Type $win32UEFICode
}


## A Function added just to check if the assembly for 
## UEFI is loaded as is the name of the class above in C++.
Function Check-IsUEFIClassLoaded{
     return ([System.AppDomain]::CurrentDomain.GetAssemblies() | % { $_.GetTypes()} | ? {$_.FullName -eq "UEFI"}).Count 
}

## Just incase someone was to call my code without running the Compiled code run first
If (!(Check-IsUEFIClassLoaded)){
    Compile-UEFIDectectionClass
}

## The meat of the checking.
## Returns 0 or 1 ([BOOL] if UEFI or not)
Function Get-UEFI{
    return [UEFI]::Detect()
}

単純なフラグを取得するためだけに、これはかなりやりすぎのようです。

これを行うためのより良い方法があるかどうか、誰かが知っていますか?

4

6 に答える 6

3

PowerShell からの相互運用が引き続き必要であるという意味では、これも同様にハックですが、使用する (または呼び出すことができる) 場合、相互運用コードはより適切になる可能性がありますGetFirmwareType()

これは、ここFIRMWARE_TYPEに記載されている列挙を返します。両方の機能が Windows 8 で導入され、kernel32.dll によってエクスポートされていることを考えると、Microsoft 自身のドキュメントが「ダミー変数の使用」を指しているとは信じられません!

内部的には、 をGetFirmwareType呼び出しますNtQuerySystemInformation。私はそれが何をしているのか掘り下げますが、必ずしも啓発的であるとは思いません.

残念ながら、これは PE4 (Windows 8) でのみ機能します。これは、これらの機能が追加されたばかりであるためです。

于 2013-07-11T14:32:41.977 に答える
2

最も簡単な方法は、PowerShell で実行することです。

$(Get-ComputerInfo).BiosFirmwareType
于 2020-02-03T22:45:47.357 に答える
-1

PE 環境には、PE 環境に固有のフォルダーがあるようです。また、変数 %TargetDir% については、TARGETDIR プロパティで説明しています。

最後に、X から実行しているかどうかを確認できます。確認できる boot.wim イメージを含むフォルダーもあるはずです。パスはX:\Sources\Boot.wimになると思いますが、再確認してください。

if ( Test-Path "%TargetDir%\Windows\wpeprofiles" ) {

     Write-host "You're in Windows PE"

}
于 2013-06-12T12:00:51.120 に答える
-3

これが役立つかどうかはわかりません(C#ソリューションに基づく)が、:

Win32_DiskPartition には、"Bootable" (bool)、"BootPartition" (bool)、および "Type" (文字列) のプロパティがあります。私の UEFI システムでは、「Type」は文字列「GPT: System」として返されます。

ここで、ブート可能で、ブート パーティションであり、指定されたタイプを持つすべての Win32_DiskPartitions について、それらのいずれかが内部であるかどうかを判断します。

お役に立てれば。

于 2013-08-29T16:15:17.820 に答える