如何检测WinPE(4)是否已从UEFI或BIOS启动?

Rog*_*lco 8 c# powershell automation winpe efi

我正在寻找一种方法来可靠地检测我何时启动到WinPE 4(powershell)(或WinPE 3(vbs)作为替代),我是从UEFI或BIOS系统启动的吗?(因为我在受限制的环境中没有运行第三方exe)

这会显着改变我在分区布局更改和格式时对Windows部署进行分区的方式.(GPT与MBR等)

我有一个工作是一个适应这样的C++代码使用PowerShell v3的,但感觉还砍十岁上下的:

## 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()
}
Run Code Online (Sandbox Code Playgroud)

为了得到一个简单的旗帜,这似乎相当于顶部.

有谁知道是否有更好的方法来完成这项工作?

tkr*_*krn -1

看起来PE环境有一个特定于PE环境的文件夹。另外,变量 %TargetDir% 在这里描述,TARGETDIR property

最后,您可以检查是否从 X 运行:还应该有一个文件夹,其中包含您可以检查的 boot.wim 映像。我相信路径是X:\Sources\Boot.wim但请仔细检查。

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

     Write-host "You're in Windows PE"

}
Run Code Online (Sandbox Code Playgroud)