Eu quero construir um script de sistema de desenvolvimento a partir de uma nova mídia de instalação do Windows como se fosse um contêiner Linux. Nesse caso, preciso que todos os sistemas Windows que construo compartilhem o mesmo SID da máquina.
De acordo com a explicação de @AntonTykhyy, isso é feito da seguinte maneira:
- A mídia de instalação nova é criada com
Unattend.xml
arquivos encadeados em que o primeiro arquivo chama um únicosysprep /generalize /oobe /unattend:C:\Windows\System32\Sysprep\Second_Unattend.xml> /shutdown
comando usandoMicrosoft-Windows-Setup-Shell/FirstLogonCommands
o Windows Component empass 7
- Quando o Sysprep termina e o computador é desligado, o hive do Registro do Windows
SYSTEM
(deC:\Windows\System32\config\SYSTEM
) deve ser carregado offline (usandoregedit.exe
executado a partir do Windows PE ou método diferente) - O bit 2 deve ser definido
1
no valorOperationFlags
da chaveSYSTEM\Setup\SetupCl\PendingRequest
do hive offline, ou seja,REG_DWORD
deve ser alterado de hexadecimal0x00007f0f
(01111111 00001111
que é definido por padrão) para0x00000004
(0100
) - O novo valor "binário"
SidAccountDomainNew
deve ser adicionado àSYSTEM\Setup\SetupCl\PendingRequest
chave de registro com o valor do SID em "formato binário" de 24 bytes (o cabeçalho de comprimento fixo de 8 bytes e 4 subautoridades de 32 bits)
Concluí as etapas de 1 a 3 com sucesso e sempre recebo um novo SID de máquina aleatório. No entanto, eu absolutamente não consigo descobrir a etapa 4. Eu examinei a documentação do SID ( um , dois , três ), mas qualquer tipo de valor que eu especificar para SidAccountDomainNew
- REG_BINARY
ou REG_DWORD
- e qualquer valor que eu definir eu absolutamente não consigo fazê-lo funcionar (a caixa de Install Windows
diálogo aparece após a reinicialização com esta mensagem Windows could not complete installation. To install Windows on this computer, restart the installation
).
Meu melhor palpite de que o cabeçalho de 8 bytes SidAccountDomainNew
está S-1-5-21
em binário ( 01010011 00101101 00110001 00101101 00110101 00101101 00110010 00110001
usando o conversor de texto para binário ASCII online ) e é isso. Eu me reeduquei em binário ( bits e bytes e números de 32 bits ), mas não consigo fazer com que os números caibam em 24 bytes especificados por @AntonTykhyy.
De acordo com minha pesquisa, não há absolutamente nenhuma documentação sobre esse assunto na Internet e SetupCl.exe
está completamente em situação irregular. A única fonte de conhecimento são as informações fornecidas por @AntonTykhyy , mas não posso comentar em sua pergunta para pedir um exemplo de como o SidAccountDomainNew
deve ser definido corretamente para ie S-1-5-21-86420-86420-86420
(ele também menciona 4 subautoridades para que o SID correto seja S-1-5-21-86420-86420-86420-something
porque o artigo da Microsoft diz subautoridades são blocos de árvore de dígitos 1-2-3 que seguem S-1-5-21-
, então não está claro o que são 4 subautoridades de 32 bits).
Eu também encontrei esta explicação SID que faz minhas suposições sobre os primeiros 8 bytes do cabeçalho incorretas, eu acho:
A maneira comum de escrever um SID é na forma S-1-5-21-xxx, ou SRIS… Onde o primeiro S é um literal para identificar que este é um SID, o R é o número da revisão, e até aqui foi apenas a revisão 1, o I é a autoridade identificadora e, em seguida, o último S é a subautoridade que teoricamente pode ser repetida até 15 vezes, embora para Windows seja repetido apenas 5 vezes. Portanto, para um computador Windows padrão ou SID de domínio, seria S-1-5-21-aaaaaaa-bbbbbbb-ccccccc-ddddddd.
Internamente no Windows, um SID é armazenado como uma matriz variável de inteiros de 32 bits, geralmente para um total de 28 bytes. O primeiro inteiro armazena a revisão, a contagem do número de subautoridades e a autoridade do identificador. Isto é seguido por quantas subautoridades estão neste SID. Esses inteiros de subautoridade são armazenados no formato little-endian, o que significa que o byte menos significativo é armazenado primeiro e explica por que temos que fazer uma transformação complexa para passar dos inteiros para o mais comum S-1-5-21-* formato.
Para resumir, peço um exemplo de atribuição de SID específico S-1-5-21-86420-86420-86420
para máquina usando OperationFlags
e SidAccountDomainNew
depois de executar sysprep /generalize
, especificamente que tipo de SidAccountDomainNew
valor deve ser usado e qual entrada real do usuário é necessária.
O exemplo de SID S-1-5-21-86420-86420-86420
servirá, pois, de acordo com o artigo , sabe-se que a representação de 32 bits de 86420 decimal é 000000000000000 10101000110010100
- isso pode economizar tempo de gravação de resposta (se forem dados relevantes).
PS Eu também não tenho certeza se a configuração OperationFlags
para hexadecimal 0x00000004
é necessária porque hexadecimal 0x00007f0f
( 01111111 00001111
) também tem o bit 2 definido.