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>), 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()
}
6 Réponses :
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
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.
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 () code>
. p>
Ceci renvoie un interne, Malheureusement, cela ne fonctionne que pour PE4 (Windows 8), car ces fonctions n'ont été ajoutées que. P> Firmware_Type CODE> 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"! P>
getfirmwaretype code> appels
ntquerysysteminformation code>. Je vais creuser dans ce que ça fait, mais je ne pense pas que cela va nécessairement être éclairé. P>
Ceci est la méthode de Get-ComputerInfo code > cmdlet
utilise Dans les coulisses à biosfirmwaretype code> propriété .
Je ne sais pas si cela aidera (basé sur la solution C #), mais: p>
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". p>
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. P>
J'espère que cela aide. P>
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.
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
La voie la plus simple de loin consiste à courir sur PowerShell:
$(Get-ComputerInfo).BiosFirmwareType
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 CODE> é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. Code>
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 code> est-ce assez lent (semble s'allumer beaucoup de choses qui sont ensuite jetées)
Vous n'êtes pas sûr depuis quelle version celle-ci est prise en charge.
Retours Cependant, il s'agit d'une installation complète, a une note d'existence confirmée dans WinPe P> $ env: firmware_type code> p>
UEFI code> et
Legacy code> dans mes tests. P>