Windows 安装程序在安装时为 Windows 系统分配一个唯一的计算机 SID。计算机 SID 不会在网络上公开,因此它是什么通常并不重要,但本地用户的安全标识符基于计算机 SID,这在共享 NTFS 卷上的用户配置文件和用户创建的文件时会产生问题。即使文件和文件夹的 ACL 只包含预定义的非计算机特定 SID(例如内置管理员组),它们的所有者也是创建本地用户,由计算机 SID 和用户 RID 标识。例如,如果您想从全新的 Windows 安装媒体编写脚本构建您的开发系统,就像它是一个 Linux 容器一样,就会出现这种情况。在这种情况下,您希望构建的每个 Windows 系统都共享相同的计算机 SID。
然而,SysInternals 的NewSID 实用程序曾是已弃用并已停用早在 2009 年,才不是 好好工作在现代 Windows 版本上。有没有办法使用常规 Windows 部署工具实现相同的结果?Mark Russinovich 在其反对 NewSID 的帖子中暗示情况可能如此,但如果是这样,则此功能尚未记录。当然,这并不奇怪:微软长期以来一直没有记录功能,可以追溯到 MS-DOS 时代。
答案1
该未记录的SetupCl.exe
实用程序是 Windows 安装工具的一部分,它清理系统映像,这是在新 Windows 系统启动时运行的通用化过程的一个步骤,通常会执行诸如生成新磁盘标识符、修复重新解析点以及在所有注册表项和可能的配置文件中将对默认系统根目录的引用(通常为X:\
)替换为适合您的目标系统的内容(通常为C:\
)。此实用程序由 Windows 安装过程在首次启动时调用,并由注册表项控制SYSTEM\Setup\SetupCl\PendingRequest
。此键中的 DWORD 值OperationFlags
是一个位字段,用于指定实用程序将执行哪些转换。
除了上述转换之外,SetupCl
还可以用新机器 SID 替换现有机器 SID。通过在密钥中设置位 2( 0x4
)来请求此转换。同一密钥中的两个可选二进制值和提供源和目标机器 SID。如果省略源 SID,则从正在运行的系统中获取它。如果省略目标 SID,则生成一个新的。这些值包含OperationFlags
SYSTEM\Setup\SetupCl\PendingRequest
SidAccountDomainOld
SidAccountDomainNew
SetupCl
SetupCl
二进制形式并且长度为 24 字节(8 字节固定长度的标头和 4 个 32 位子权限)。要SetupCl
分配特定的机器 SID,请设置中的位 2OperationFlags
并创建SidAccountDomainNew
包含 SID 的值。
此过程存在一些复杂情况:
它适用于由 准备的映像
sysprep /generalize
,但无法适用于 DISM 或Expand-WindowsImage
cmdlet 新部署的 Windows 映像。新映像也处于通用状态,配置单元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
如果安装软件时有待重新启动,则失败。在通用化之前重新启动系统,或者在将软件安装到映像之前执行额外的通用化/专门化步骤。