我想从新的 Windows 安装媒体脚本构建一个开发系统,就好像它是一个 Linux 容器一样。在这种情况下,我需要我构建的每个 Windows 系统共享同一个机器 SID。
根据@AntonTykhyy 的解释,这是通过以下方式完成的:
- 全新安装媒体是使用链接
Unattend.xml
文件创建的,其中第一个文件使用Windows 组件调用单个sysprep /generalize /oobe /unattend:C:\Windows\System32\Sysprep\Second_Unattend.xml> /shutdown
命令Microsoft-Windows-Setup-Shell/FirstLogonCommands
pass 7
- 当 Sysprep 完成并且计算机关闭 Windows 注册表
SYSTEM
(从C:\Windows\System32\config\SYSTEM
)配置单元应脱机加载(使用regedit.exe
从 Windows PE 或其他方法执行) - 位 2 应设置为离线配置单元的键值
1
,即应从十六进制(默认设置)更改为()OperationFlags
SYSTEM\Setup\SetupCl\PendingRequest
REG_DWORD
0x00007f0f
01111111 00001111
0x00000004
0100
- 应将新的“二进制”值添加到注册表项中,SID 的值以“二进制形式”为 24 字节长(8 字节固定长度标头和 4 个 32 位子权限)
SidAccountDomainNew
SYSTEM\Setup\SetupCl\PendingRequest
我已成功完成第 1-3 步,并且每次都获得新的随机机器 SID。但是我绝对无法弄清楚第 4 步。我已经检查了 SID 文档(一、二、三SidAccountDomainNew
),但是无论我为-REG_BINARY
或-指定的值类型REG_DWORD
以及我设置的任何值,我都绝对无法让它工作(Install Windows
重启后出现对话框此消息Windows could not complete installation. To install Windows on this computer, restart the installation
)。
我最好的猜测是 8 字节的标头SidAccountDomainNew
是S-1-5-21
二进制的(01010011 00101101 00110001 00101101 00110101 00101101 00110010 00110001
使用在线 ASCII 文本到二进制转换器),就是这样。我对二进制(位和字节以及32 位数字)进行了重新教育,但无法让数字适合 @AntonTykhyy 指定的 24 个字节。
根据我的研究,互联网上绝对没有关于这件事的文档,而且SetupCl.exe
完全没有文档记录。唯一的知识来源是@AntonTykhyy提供的信息,但我无法在他的问题中发表评论,以询问如何SidAccountDomainNew
正确设置 ie的示例S-1-5-21-86420-86420-86420
(他还提到了 4 个子权限,因此正确的 SID 可能是S-1-5-21-86420-86420-86420-something
因为微软的文章说sub-authorities 是 1-2-3 之后的数字树块S-1-5-21-
,因此不清楚什么是 4 个 32 位的 sub-authorities)。
我还发现了这个 SID 解释,这使得我对标题前 8 个字节的假设不正确,我猜:
编写 SID 的常用方法是 S-1-5-21-xxx 或 SRIS 形式……其中第一个 S 是标识这是 SID 的文字,R 是修订号,到目前为止只有修订版 1,I 是标识符授权,然后最后一个 S 是理论上可以重复最多 15 次的子授权,尽管对于 Windows 仅重复 5 次。因此,对于标准 Windows 计算机或域 SID,它看起来像 S-1-5-21-aaaaaaa-bbbbbbb-ccccccc-ddddddd。
在 Windows 内部,SID 存储为 32 位整数的可变数组,通常总共 28 个字节。第一个整数存储修订、子权限数量和标识符权限。紧随其后的是该 SID 中的许多子机构。这些子权限整数以 little-endian 格式存储,这意味着首先存储最低有效字节,并解释了为什么我们必须进行复杂的转换才能从整数到更常见的 S-1-5-21-*格式。
总而言之,我要求一个S-1-5-21-86420-86420-86420
为机器使用 OperationFlags
和SidAccountDomainNew
执行后分配特定 SID 的示例,具体来说应该使用sysprep /generalize
什么类型的值以及需要什么实际用户输入。SidAccountDomainNew
SIDS-1-5-21-86420-86420-86420
示例将这样做,因为根据文章已知 86420 十进制的 32 位表示000000000000000 10101000110010100
- 这可能会节省答案写入时间(如果它是相关数据的话)。
PS 我也不确定是否需要设置OperationFlags
为十六进制0x00000004
,因为十六进制0x00007f0f
( 01111111 00001111
) 也设置了位 2。
问题在于 8 字节标头的格式。根据结构,
SID
头部由 1 个字节的 SID 格式版本、1 个字节的子权限数量和 6 个字节(一个SID_IDENTIFIER_AUTHORITY
)的权限组成。在“S-1-5-21-86420-86420-86420”中,1 是版本,5 是权限,其余每个组件(包括 21,与几篇文章相矛盾!)都是一个子权限。然后一次一个字段,这个 SID 的数字表示(这里用十六进制写的字节)是:01
对于版本 (1)04
对于下属机构的数量 (4),未在文本 SDDL 形式中明确写入00 00 00 00 00 05
对于权限 (5),与子权限不同的是大端顺序15 00 00 00
为第一个下属机构 (21)94 51 01 00
三次,最后三个下属机构(每个 86420)要更轻松地将 SID 转换为数字格式,您可以使用 PowerShell!
在 Windows 10 2004 Enterprise 上将这 24 个字节写为一个
REG_BINARY
名为对我有用的值。SidAccountDomainNew
我不必更改OperationFlags
,因为正如您所说,它的数据已经设置了第 2 位。