2013-05-22 25 views
7

Tôi đang tìm kiếm một cách đáng tin cậy phát hiện khi tôi khởi động vào WinPE 4 (powershell) (hoặc WinPE 3 (vbs) như một sự thay thế), Tôi đã khởi động từ một UEFI hoặc hệ thống BIOS? (mà không cần chạy một bên thứ ba exe như tôi đang ở trong một môi trường bị hạn chế)Làm cách nào để phát hiện xem WinPE (4) đã khởi động từ UEFI hay BIOS?

Điều này thay đổi đáng kể cách tôi sẽ phân vùng triển khai cửa sổ như bố cục phân vùng thay đổi và định dạng. (GPT vs MBR, vv)

tôi có một công việc đó là một sự thích nghi của this C++ mã trong PowerShell v3 nhưng nó cảm thấy khá hack-ish:

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

này có vẻ khá trên đầu chỉ để có được một lá cờ đơn giản.

Có ai biết nếu có cách nào tốt hơn để thực hiện việc này không?

Trả lời

-1

Dường như môi trường PE có thư mục dành riêng cho môi trường PE. Ngoài ra, biến% TargetDir% được mô tả ở đây, TARGETDIR property.

Cuối cùng, bạn có thể kiểm tra xem bạn có đang chạy từ X không: Cũng phải có một thư mục có ảnh boot.wim mà bạn có thể kiểm tra. Tôi tin rằng con đường sẽ là X: \ Sources \ Boot.wim nhưng kiểm tra lại.

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

    Write-host "You're in Windows PE" 

} 
+0

nó không phải là có hay không tôi đang ở WinPE để bắt đầu với. Đó là khi tôi đang ở trong PE, tôi đã được khởi động bởi UEFI hoặc Legacy BIOS. – RogerWilco

1

Nó cũng không kém phần hacky, theo nghĩa nó vẫn sẽ yêu cầu interop từ PowerShell, nhưng mã interop có thể gọn gàng nếu bạn sử dụng (hoặc có thể gọi): GetFirmwareType().

Trả về một tài liệu FIRMWARE_TYPE được liệt kê here. Tôi không thể tin được đưa ra cả hai chức năng được giới thiệu trong Windows 8 và xuất khẩu bởi kernel32.dll tài liệu riêng của Microsoft điểm bạn tại "bằng cách sử dụng một biến giả"!

Bên trong, GetFirmwareType gọi NtQuerySystemInformation. Tôi sẽ đào sâu vào những gì nó đang làm, nhưng tôi không nghĩ rằng nó nhất thiết phải là khai ngộ.

Thật không may, điều này chỉ làm việc cho PE4 (Windows 8) kể từ khi các chức năng này chỉ được thêm vào sau đó.

-1

Tôi không biết nếu điều này sẽ giúp (dựa trên C# giải pháp), nhưng:

Win32_DiskPartition có các thuộc tính "khả năng khởi động" (bool), "BootPartition" (bool), và "Loại" (string). Đối với hệ thống UEFI của tôi, "Loại" trở lại như chuỗi "GPT: Hệ thống".

Bây giờ, cho tất cả Win32_DiskPartitions có khả năng khởi động, là một phân vùng khởi động, và có các loại quy định, xác định xem ai trong số họ là nội bộ.

Hy vọng điều này sẽ hữu ích.

+0

Điều này sẽ không hữu ích. Môi trường WinPE (trình cài đặt) có khả năng chạy trên ổ cứng trống và sự hiện diện của các kiểu phân vùng cụ thể trên ổ đĩa không đảm bảo rằng hệ thống hiện tại có thể khởi động từ chúng (ổ đĩa có thể đã được cấy từ một hệ thống khác). –

1

Đây có thể là một chút trễ, nhưng nếu ai biết họ đang chạy trong WinPE, đoạn code sau sẽ làm việc:

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

Tôi đã không có hệ thống UEFI để thử nghiệm nó trên, nhưng bài viết này có vẻ ngụ ý có một giá trị registry bạn có thể truy vấn dưới PE nói với chế độ nào nó được khởi động dưới:

http://technet.microsoft.com/en-us/library/dn293283.aspx

Các vấn đề liên quan