Windows Pro Wrestling

A 16 de Fevereiro de 2022, a Microsoft anunciou a primeira grande evolução de funcionalidades para o Windows 11, com o Dev Build 22557; a lista de mudanças era longa, e apelativa, mas o que fez toda a gente ter um calafrio na espinha foi isto:

Similar to Windows 11 Home edition, Windows 11 Pro edition now requires internet connectivity during the initial device setup (OOBE) only. If you choose to setup device for personal use, MSA will be required for setup as well. You can expect Microsoft Account to be required in subsequent WIP flights.

Tal como o Windows 11 Home Edition, a edição Windows 11 Pro agora requer uma ligação à Internet, mas apenas durante a configuração inicial do sistema (OOBE). Se escolher uma configuração para uso pessoal, será necessário também MSA. Pode partir do princípio de que uma conta Microsoft será obrigatória em futuros lançamentos WIP.
Para dizer a verdade, uma conta Microsoft sempre foi obrigatória para ser um Insider; mas o que isto revela é que a Microsoft está a ponderar eliminar uma das principais razões pelas quais muitos utilizadores preferem utilizar uma edição Pro do Windows, apesar de ser mais cara.
A partir desse momento, quem desejar as outras vantagens da edição Pro (BitLocker, acesso por Remote Desktop Connection a partir de outros computadores, Hyper-V e WSL2, suporte para mais do que um CPU) também precisa de ter uma conta Microsoft, ou uma conta de domínio.
O truque que se costumava usar desde o WIndows 10 era desligar todas as ligações de rede e dizer que se queria usar uma conta de domínio sem nenhum Domain Controller presente na rede, o que resultava num timeout e na possibilidade de criar uma conta local.
Talvez seja isto que a Microsoft vai bloquear, não apresentando a alternativa para criar uma conta local.

De realçar que à data em que escrevo isto, a Dev Build 22557 não está disponível como ISO, por isso não pude testar o que fazer nas condições reais. Talvez volte a este assunto quando estiver disponível uma compilação para instalação directa que reflicta esta mudança de política e que me permita testar quaisquer mudanças no comportamento do Windows Setup.

Que fazer?

A alternativa será usar o ambiente de instalação e deployment do Windows para passar por cima de todo o processo OOBE (Out-Of-Box-Experience), onde está incluído o processo NetFlow que força o uso de uma conta Microsoft. Por enquanto o Windows Setup ainda não foi muito modificado no WIndows 11, apesar de a Microsoft estar a empurrar as PMEs que insistem em ter computadores locais para usarem Azure Active Directory + Intune/Endpoint Configuration Manager + Autopilot para em vez do clássico Windows Server + Windows Deployment Services (que de resto já não é suportado pelo Windows 11)

Colocar o boot.wim dum ISO do Windows 11 (ou do Server 2022) no WDS já não funciona por PXE; é necessário um boot.wim manipulado pelo ECM, pelo Deployment Toolkit (MDT) ou por outras ferramentas.
Também se pode modificar o boot.wim para se ligar a uma pasta de rede e lançar o Windows Setup
Ou fazer como um OEM e usar um script para fazer tudo à mão
(fonte)
Claro que tanto o ECM como o MDT dependem de Volume Licen$ing

Unattended Setup

A automatização do Windows Setup depende de um Answer File em formato XML (genericamente chamado unattend.xml).
Este ficheiro pode estar em vários locais, mas os mais vulgares são:

  • %WINDIR%\Panther\unattend.xml
  • Raiz da drive de onde foi lançado o Windows Setup
  • Raiz de uma drive removível presente durante o Windows Setup
  • Raiz da pasta de rede de onde foi lançado o Windows Setup

Autounattend.xml e unattend.xml não são idênticos:

  • Autounattend.xml contém as informações específicas para os passos iniciais do Windows Setup: linguagem do Windows Setup e do Windows a instalar, teclado, formatos, particionamento de discos e partição onde deve ser instalado o Windows, Upgrade ou Clean Install, chave de activação, e, presumo, slipstreaming de drivers e especialização durante o primeiro reinício.
  • unattend.xml contém o resto e corre durante o segundo reinício (passos userAudit e oobeSystem)

O ficheiro controla os vários passos do processo de instalação e pode ser criado de maneira point-and-click com a ferramenta Windows System Image Manager (SIM), que é parte do Assessment and Deployment Kit (ADK), ou no site Windows Answer File Generator

Um bom tutorial de como construir um ficheiro para automatização de instalação com o SIM está aqui

Mas vamos tentar simplificar a coisa.
Para passar por cima do OOBE e da obrigatoriedade de ter uma conta Microsoft, basta automatizar as seguintes operações:

  • Responder automagicamente (ou não) às perguntas do OOBE, saltando o passo de criação de contas
  • Criar uma (ou várias) contas locais na base de dados SAM

E vou acrescentar duas conveniências, que são:

  • Configurações de localização
  • Configuração de Zona de Tempo

Cabeçalho

O ficheiro começa com o cabeçalho XML e a declaração do passo oobeSystem:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="oobeSystem">

    </settings>
</unattend>

Dentro das tags <settings>, colocamos as configurações.

Configuração de localização

Normalmente descarrego ISOs English-International, mas quero o teclado e os formatos em pt-PT; para ver a lista de valores que deve consultar para outras opções de linguagem, teclado e formato, consultar esta página
Os valores a configurar são:

  • InputLocale: esquema de teclado
  • SystemLocale: país ou região
  • UILanguage: linguagem do Windows
  • UserLocale: local do sistema
  • UILanguageFallback: linguagem de recurso (normalmente en-US mas no caso das edições English-International é en-GB)
1
2
3
4
5
6
7
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>0816:00000816</InputLocale>
            <SystemLocale>en-GB</SystemLocale>
            <UILanguage>en-GB</UILanguage>
            <UILanguageFallback>en-GB</UILanguageFallback>
            <UserLocale>en-GB</UserLocale>
        </component>

Configuração de OOBE

A seguir colocamos a configuração do OOBE:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <SkipUserOOBE>true</SkipUserOOBE>
                <SkipMachineOOBE>true</SkipMachineOOBE>
                <ProtectYourPC>3</ProtectYourPC>
           </OOBE>

        </component>

Os detalhes da configuração ProtectYourPC estão aqui; o valor 3 diz Não a tudo.

Configuração de utilizador(es)

E finalmente chegamos ao finalmente, que é criar automaticamente uma, ou várias, contas locais que não sejam Microsoft Accounts.
A seguir à tag </OOBE> mas antes da tag </component>, colocar o seguinte:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
            <UserAccounts>
                <LocalAccounts>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>S0larFlares!</Value>
                            <PlainText>true</PlainText>
                        </Password>
                        <DisplayName>The Bastard</DisplayName>
                        <Group>Administrators</Group>
                        <Name>bofh</Name>
                    </LocalAccount>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>CattlePr0d!</Value> 
                            <PlainText>true</PlainText>
                        </Password>
                        <DisplayName>Pimply-Faced Youth</DisplayName>
                        <Group>Users</Group>
                        <Name>pfy</Name>
                    </LocalAccount>
                </LocalAccounts>
            </UserAccounts>

Time Zone

Para finalizar, costumo deixar a configuração de zona de tempo de Lisboa (outras zonas de tempo estão aqui), inserindo antes da tag </component>

            <TimeZone>GMT Standard Time</TimeZone>

Ficheiro final

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <InputLocale>0816:00000816</InputLocale>
           <SystemLocale>en-GB</SystemLocale>
           <UILanguage>en-GB</UILanguage>
           <UILanguageFallback>en-GB</UILanguageFallback>
           <UserLocale>en-GB</UserLocale>
        </component>
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <SkipUserOOBE>true</SkipUserOOBE>
                <SkipMachineOOBE>true</SkipMachineOOBE>
                <ProtectYourPC>3</ProtectYourPC>
            </OOBE>
            <UserAccounts>
                <LocalAccounts>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>S0larFlares!</Value>
                            <PlainText>true</PlainText>
                        </Password>
                        <DisplayName>The Bastard</DisplayName>
                        <Group>Administrators</Group>
                        <Name>bofh</Name>
                    </LocalAccount>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>CattlePr0d!</Value> 
                            <PlainText>true</PlainText>
                        </Password>
                        <DisplayName>Pimply-Faced Youth</DisplayName>
                        <Group>Users</Group>
                        <Name>pfy</Name>
                    </LocalAccount>
                </LocalAccounts>
            </UserAccounts>
            <TimeZone>GMT Standard Time</TimeZone>
        </component>
    </settings>
</unattend>

Gravar o ficheiro como unattend.xml assegurando que está codificado em ASCII ou UTF-8.

Fornecer o ficheiro ao Windows Setup

Há várias maneiras de entregar o ficheiro, como visto acima.

Instalação a partir de uma drive USB

Se vai usar um programa como o Rufus (ou o Media Creation Toolkit da Microsoft) para criar uma drive USB de instalação, pode deixá-lo na raiz da drive. Em princípio, será copiado automaticamente para %WINDIR%\Panther (mas não testei este mecanismo).

Instalação a partir de ISO

Caso se use o ficheiro ISO (como no caso de uma VM) ou um disco óptico, existem duas opções:

Editar o ISO

Montar o ISO, copiar os ficheiros para uma pasta (no exemplo será c:\isos\), usar o DISM para abrir e montar a imagem de instalação (install.wim), copiar o unattend.xml para Windows\Panther, e fechar a imagem WIM.

dism /Mount-Image /ImageFile:"c:\isos\install.wim" /Index:1 /MountDir:c:\mount
copy unattend.xml c:\mount\windows\panther\unattend.xml
dism /Unmount-Image /MountDir:c:\mount /Commit
Para verificar se o Index corresponde à edição do Windows que pretende instalar; usar o comando dism /Get-ImageInfo /imagefile:C:\isos\install.wim

Depois usar a ferramenta que preferir para criar um novo ISO.
Não testei este passo, mas deve funcionar, é um procedimento descrito na documentação da Microsoft.

Instalar de ISO e colocar o XML numa drive USB

Normalmente este é o processo mais simples e o mais fácil de implementar: grava-se o XML para uma drive USB que possa ser ligada ao computador a instalar (ou à VM) mas que não possa ser utilizada para arrancar o sistema
Chegado a um momento específico do processo de instalação (depois do 2º reinicio, ou seja, quando o sistema passa de “generalizado” para “especializado”), o unattend.xml será lido, analisado e copiado para a pasta C:\Windows\Panther\

Este processo é mais problemático quando se aplica a VMs porque quase nenhuma plataforma de virtualização permite a simulação de uma drive USB.
Acaba por ser necessário possuir uma drive USB física e passá-la à VM (pelo processo específico de cada plataforma de virtualização) para que o unattend.xml seja aplicado desta maneira

Resultados

Se o processo não der erro por algum problema com a sintaxe ou os valores do XML, as contas são criadas:


O resultado de type c:\windows\panther\unattend.xml mostra que o nosso ficheiro foi copiado mas as palavras-passe foram censuradas como medida de segurança.

Na versão 21H01 do Windows 10 isto também acontece.
Mesmo assim, recomendo vivamente apagar o ficheiro a partir de uma sessão de linha de comandos com permissões de administrador.

Problemas

O link para o Windows Terminal no “Power Menu” (Win-X ou clique-direito no botão Windows) não funcionava até se abrir manualmente o Windows Terminal em All Apps



Feito isso, o atalho começa a funcionar. Se é problema causado pela criação da conta em modo unattended sem passar pelo OOBE ou é específico desta compilação, não sei.
Outro problema é a Pesquisa não funcionar (não é possível procurar a aplicação Windows Terminal, simplesmente não há resultados).

Comentário final

Cada vez mais o Windows se torna disfuncional na ausência de uma ligação de rede durante a instalação; não me parece que a Microsoft esteja a caminhar na direcção certa, mas os consumidores decidiram premiar sistemas ainda mais fechados como o iOS e o Android, e a Microsoft deve achar que se não se quiser tornar na nova IBM precisa de ir pelo mesmo caminho e empurrar os seus utilizadores actuais para os seus serviços de cloud, por isso o resultado é o Windows 11.
À medida que a Microsoft se fecha, mais e mais pessoas se sentem desconsideradas, mas se mal esperam por se verem livres da Microsoft, têm a absoluta anarquia que é o ecossistema Linux, a espionagem da Google e a prisão dourada da Apple como alternativas.
Escolham bem. A Microsoft quer principalmente dinheiro pelos seus serviços, em vez de privacidade, liberdade ou previsibilidade.