Windows 安装程序在安装时将唯一的计算机 SID 分配给 Windows 系统。机器 SID 不会通过网络公开,因此它通常无关紧要,但本地用户的安全标识符基于机器 SID,这可能会在共享用户配置文件和用户创建的文件时产生问题NTFS 卷。即使文件和文件夹的 ACL 仅具有预定义的非机器特定 SID(例如内置管理员组),它们的所有者也是创建本地用户,由机器 SID 和用户 RID 标识。例如,如果您想从全新的 Windows 安装媒体脚本构建您的开发系统,就好像它是一个 Linux 容器一样,就会出现这种情况。在这种情况下,您希望您构建的每个 Windows 系统都共享相同的机器 SID。
但是,SysInternals 的NewSID 实用程序早在 2009 年就已弃用并退役,并且在现代Windows 版本上无法 正常工作。有没有办法使用常规的 Windows 部署工具实现相同的结果?Mark Russinovich 在他反对 NewSID 的帖子中暗示可能是这种情况,但如果是这种情况,则没有记录此功能。当然,这不足为奇:微软的未记录功能历史悠久,可以追溯到 MS-DOS 时代。
未记录的
SetupCl.exe
实用程序是 Windows 安装工具的一部分,它清理系统映像,作为新 Windows 系统启动时运行的通用过程的一个步骤,通常执行诸如生成新磁盘标识符、修复重解析点和替换等操作在所有注册表项和可能的配置文件中,X:\
使用适合您的目标系统(通常)的任何内容引用默认系统根目录(通常)。C:\
此实用程序在首次启动时由 Windows 设置过程调用,并由SYSTEM\Setup\SetupCl\PendingRequest
注册表项控制。此键中的 DWORD 值OperationFlags
是一个位字段,指定实用程序将执行哪些转换。除了上面提到的转换之外,
SetupCl
还可以用新的 SID 替换现有的机器 SID。通过在密钥中设置位 2 (0x4
)来请求此转换。两个可选的二进制值在同一个键中提供源和目标机器 SID。如果省略了源 SID,则从正在运行的系统中获取它。如果省略了目标 SID,则生成一个新的。这些值包含二进制形式的机器 SID,长度为 24 字节(8 字节固定长度标头和 4 个 32 位子权限)。要分配特定的机器 SID,请设置位 2并创建包含 SID 的值。OperationFlags
SYSTEM\Setup\SetupCl\PendingRequest
SidAccountDomainOld
SidAccountDomainNew
SetupCl
SetupCl
SetupCl
OperationFlags
SidAccountDomainNew
这个过程有几个并发症:
它适用于由 准备的映像,但在 DISM 或cmdlet
sysprep /generalize
新部署的 Windows 映像上失败。Expand-WindowsImage
新映像也处于通用状态,SetupCl
在配置单元中设置了一个待处理的请求SYSTEM
以在首次启动时运行,但该请求没有设置第 2 位。在离线镜像中设置会导致镜像部署失败。要解决此限制,必须执行一轮额外的泛化/专业化。一种方法是使用链式无人参与文件:第一个无人参与文件指定Microsoft-Windows-Setup-Shell/FirstLogonCommands
要执行的单个命令sysprep /generalize /oobe /unattend:<second unattend file> /shutdown
。SidAccountDomainNew
在之前或之后在线添加值sysprep /generalize
不起作用,很可能是因为sysprep
安排了一些最终步骤在系统关闭时执行。完成后挂载离线 Windows 映像sysprep /generalize
并且系统关闭,加载SYSTEM
配置单元,然后在此时添加它。sysprep /generalize
如果安装软件等待重新启动,则会失败。在通用化之前重新启动系统,或者在将软件安装到映像之前执行额外的通用化/专用化步骤。