8
votes

Comment puis-je détecter si WinPe (4) a démarré à partir d'un UEFI ou d'un bios?

Je cherche un moyen de détecter de manière fiable lorsque je démarre dans Winpe 4 (PowerShell) Strong> ( ou WinPe 3 (VBS) comme alternative em>), ai-je démarré à partir d'un système UEFI ou BIOS? strong> ( sans exécuter un exe tiers comme je suis dans un environnement restreint em>)

Cela change de manière significative comment je partitionnerais un déploiement de Windows comme la disposition des partitions change et format. (GPT vs. mbr, etc.) P>

J'ai un travail qui est une adaptation de Ce code C ++ dans PowerShell v3 mais il se sent joliment hack-ish:
P>

## 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()
}


0 commentaires

6 Réponses :


-1
votes

On dirait que l'environnement PE a un dossier spécifique à l'environnement PE. De plus, la variable% Targedir% est décrite ici, propriété Targedir .

Enfin, vous pouvez vérifier si vous exécutez à partir de x: il devrait y avoir aussi un dossier qui a la cote.wim Image que vous pouvez rechercher. Je crois que le chemin serait x: \ sources \ boot.wim mais double chèque. xxx


1 commentaires

Ce n'est pas si je suis ou non dans WinPe pour commencer. C'est quand je suis en PE, ai-je été lancé par UEFI ou par le bios héritage.



3
votes

Ce n'est pas moins hacky, dans le sens où il nécessitera toujours Interop de PowerShell, mais le code INTEROP pourrait être nicher si vous utilisez (ou pouvez appeler): getfirmwaretype () .

Ceci renvoie un Firmware_Type Enumération documentée ici . Je ne peux pas croire que les deux fonctions sont introduites dans Windows 8 et exportées par kernel32.dll que la propre documentation de Microsoft vous indique "à l'aide d'une variable factice"!

interne, getfirmwaretype appels ntquerysysteminformation . Je vais creuser dans ce que ça fait, mais je ne pense pas que cela va nécessairement être éclairé.

Malheureusement, cela ne fonctionne que pour PE4 (Windows 8), car ces fonctions n'ont été ajoutées que.


1 commentaires

Ceci est la méthode de Get-ComputerInfo cmdlet utilise Dans les coulisses à peupler le biosfirmwaretype propriété .



-3
votes

Je ne sais pas si cela aidera (basé sur la solution C #), mais:

win32_diskpartition a les propriétés "amorçable" (bool), "bootpartition" (bool) et "type" (chaîne). Pour mon système UEFI, "Type" revient comme la chaîne "gpt: système".

MAINTENANT, pour tous les win32_diskpartitions amorçables, sont une partition de démarrage et ont le type spécifié, déterminez si l'un d'entre eux est interne.

J'espère que cela aide.


2 commentaires

Cela ne vous aidera pas. L'environnement WinPe (installateur) est susceptible d'exécuter des disques durs vierges et la présence de types de partitions particuliers sur un lecteur ne garantit pas que le système actuel peut démarrer à partir d'eux (le lecteur peut avoir été transplanté à partir d'un système différent).


Il n'y a rien qui ne le rend pas invalide d'avoir GPT sur un disque même s'il est démarré en mode EFI, de même qu'un disque partitionné par une partition de démarrage FAT32 peut être démarré en mode EFI, même sans GPT, et que certains micrologiciels supportent même NTFS. La seule chose qui applique ceci pour être correcte est l'installation de Windows, mais il existe d'autres manières que la configuration de Windows pour obtenir Windows sur un disque.



1
votes

Cela peut être un peu en retard, mais si on sait qu'ils fonctionnent dans WinPe, le code suivant doit fonctionner:

$isuefi = (Get-ItemProperty -Path HKLM:\System\CurrentControlSet\Control).PEFirmwareType -eq 2


0 commentaires

2
votes

La voie la plus simple de loin consiste à courir sur PowerShell:

$(Get-ComputerInfo).BiosFirmwareType


3 commentaires

Cela fonctionne pour moi sur WinPe V10.1.18362.1 pour Windows 10 V1903, bien que, curieusement, sur V10.1.17763.1 pour V1809 Get-ComputerInfo échoue avec une erreur CIMSESSIPTIONS L'instance n'est pas valide: non supporté protocole ou option personnalisée non reconnue. Vérifier le paramètre passé au constructeur CIMSESSIONOPTIONS (String) et / ou paramètres passés à la CIMSESSIONOPTIONS.SETCUSTOMOPTION (String, String) ou CIMSESSIONPTIONS.SETCUSTOMOPTION (String, int) Méthode.


Je l'ai testé sur Windows 10 10.0.18363.628 (1909) et le noyau de serveur 10.0.17763.914 (1809).


Inversez-vous avec $ (get-ComputerInfo -Property biosfirmwaretype) .biosfirmwaretype est-ce assez lent (semble s'allumer beaucoup de choses qui sont ensuite jetées)



0
votes

$ env: firmware_type

Vous n'êtes pas sûr depuis quelle version celle-ci est prise en charge. Retours UEFI et Legacy dans mes tests.

Cependant, il s'agit d'une installation complète, a une note d'existence confirmée dans WinPe


0 commentaires