Reinicia programaticamente o computador e inicializa na unidade flash

4

Originalmente postei isso no Stack Overflow, mas foi dito que esse pode ser um lugar melhor para postar essa pergunta, então aqui vai;

Eu criei um pequeno script que reinicializará automaticamente um computador em sua sequência de recuperação (Windows Recovery Environment). Aqui está o meu código:

$testpath = test-path "bcdedit.txt"
if ($testpath -eq $true){
    Remove-item "bcdedit.txt"
}
bcdedit | Out-File "bcdedit.txt"
foreach($line in Get-Content .\bcdedit.txt) {
    if($line -match $regex){
        if($line -like 'recoverysequence*') {
            $variable = "{" + $line.Split('{')[-1]
        }
    }
}
bcdedit /bootsequence $variable
Remove-item "bcdedit.txt"
shutdown /r /t 1

Este script Powershell é executado a partir do meu aplicativo Electron (um framework baseado em Node.js). Este aplicativo é executado em centenas de diferentes modelos de computador por dia, reúne suas informações de hardware e compara-as com um banco de dados para recuperar o UPC da unidade em um ambiente de produção.

No entanto, eu tenho esse recurso porque não consegui descobrir uma maneira de fazer o que eu realmente queria fazer. Eu queria que esse script realmente reiniciasse um computador, e inicializasse no arquivo .EFI de uma unidade USB . A reinicialização do Ambiente de Recuperação do Windows foi uma solução que implementei porque apresenta um botão para inicializar em uma unidade flash USB. Estou postando aqui porque eu realmente gostaria de eliminar essa etapa e apenas inicializar diretamente na unidade flash USB. A unidade flash USB que está executando o programa também conterá um arquivo .EFI inicializável.

Agora, a pergunta é: como posso escrever um código (no PowerShell, no Electron ou no Node.js) que reinicia o computador e faz com que ele inicialize a partir da unidade flash USB?

Eu tentei investigar como fazer isso com bcdedit , e não consigo encontrar nada, e realmente não conheço nenhum outro termo de pesquisa para tentar encontrar o que preciso, estou perdido aqui.

    
por GrumpyCrouton 24.05.2018 / 20:04

1 resposta

3

Ignorando o fato de que isso soa como um problema XY, já que não vejo nenhuma explicação para a necessidade de inicializar em uma unidade externa para "coletar informações de hardware" quando você já tem acesso administrativo ao sistema operacional em execução ...

É muito fácil fazer com que o Windows inicialize em uma unidade USB conectada. Você cria uma entrada de inicialização para a unidade usando bcdedit create e, em seguida, informa ao Windows para inicializá-la. Criar entradas de inicialização é documentado pela Microsoft aqui

De acordo com a documentação, pode ser mais fácil copiar uma entrada existente:

bcdedit /copy {current} /d "My Boot Entry Description"

O bcdedit retornará o GUID da nova entrada de inicialização que você precisará extrair:

The entry was successfully copied to {some-autogenerated-guid-here}.

Em seguida, defina as opções da nova entrada para apontar para o seu dispositivo USB. As propriedades mínimas que você precisará alterar são o dispositivo, osdevice e o caminho. Dependendo do que você está inicializando, você pode precisar modificar outros valores - basta olhar para a saída do bcdedit para seu carregador do Windows e / ou carregadores PE / PXE como exemplos.

bcdedit /set {your-new-boot-entry-guid} device partition=D:
bcdedit /set {your-new-boot-entry-guid} osdevice partition=D:
bcdedit /set {your-new-boot-entry-guid} path \Location\Of\Your\Bootloader.efi

Em seguida, diga ao Windows para inicializar como já está fazendo:

bcdedit /bootsequence {your-new-boot-entry-guid}

Obviamente, substitua My Boot Entry Description por algo útil, talvez um identificador exclusivo para ajudá-lo a localizar a entrada no futuro para reutilizá-lo ou excluí-lo, se você estiver executando o referido script todos os dias. Substitua D: por qualquer que seja a letra da unidade do dispositivo USB que você está tentando inicializar; Se você estiver fazendo isso em sistemas heterogêneos, talvez seja necessário determinar isso programaticamente, pois as letras de unidade variam dependendo do sistema. E substitua \Location\Of\Your\Bootloader.efi por, bem, o caminho relativo do arquivo .EFI que você está tentando inicializar.

    
por 30.05.2018 / 23:56