NewSID v4.10

作者:Mark Russinovich

发布时间:2006 年 11 月 1 日

注意:NewSID 已停用,不再可供下载。 请参阅 Mark Russinovich 的博客文章:NewSID 停用和机器 SID 复制谜题

重要事项

关于 SID,Microsoft 不支持使用 NewSID 准备的图像,我们只支持使用 SysPrep 准备的映像。 Microsoft 尚未对所有部署克隆选项测试 NewSID。

有关 Microsoft 官方政策的更多信息,请参阅以下知识库文章:

介绍

许多组织使用磁盘映像克隆来执行 Windows 的大规模推出。 此技术涉及将已完全安装和配置的 Windows 计算机的磁盘复制到其他计算机的磁盘驱动器上。 这些其他计算机立即显示已经过相同安装过程,可以马上使用。

相较于其他推出方法,虽然此方法可节省数小时的工作和麻烦,但其主要问题是每个克隆的系统都有相同的计算机安全 ID (SID)。 这一事实会损害工作组环境中的安全性,在具有多个相同计算机 SID 的网络中,可移动媒体的安全性也可能受损。

Windows 社区的需求已促使多家公司开发可在克隆系统后更改计算机 SID 的程序。 然而,赛门铁克的 SID Changer 及其 Ghost Walker 仅作为每家公司高端产品的一部分出售。 此外,它们都是在 DOS 命令提示符下运行的(Altiris 的转换器类似于 NewSID)。

NewSID 是我们开发的程序,用于更改计算机的 SID。 它是免费的 Win32 程序,这表示它可以很容易地在先前克隆过的系统上运行。

在使用此程序之前,请阅读整篇文章。

版本信息:

  • 4.0 版引入了对 Windows XP 和 .NET Server 的支持,这是向导式界面,允许指定要应用的 SID、注册表压缩以及重命名计算机的选项(这会导致 NetBIOS 和 DNS 名称的更改)。
  • 3.02 版更正了 NewSid 在将项旧 SID 重命名为新 SID 时,无法正确复制具有无效值类型的默认值的 bug。 NT 实际上在 SAM 中的某些时间使用了这样的无效值。 此 bug 的症状是在授权用户更新帐户信息时报告访问遭拒绝的错误消息。
  • 3.01 版为 Microsoft 事务服务器创建的无法访问的注册表项添加了解决方法。 如果没有解决方法,NewSID 将提前退出。
  • 版本 3.0 引入了 SID 同步功能,其指示 NewSID 从另一台计算机获取要应用的 SID。
  • 2.0 版有自动模式选项,可以更改计算机名称。
  • 1.2 版修复了 1.1 版中引入的 bug:某些文件系统安全描述符没有更新。
  • 1.1 版更正了相对较小的 bug,其只影响某些安装。 它还进行了更新,以更改与文件和打印机共享的权限设置相关联的 SID。

克隆和替代推出方法

在企业环境中执行大规模 Windows 推出(通常是数百台计算机)的最热门方法之一基于磁盘克隆技术。 系统管理员在模板计算机上安装公司使用的基本操作系统和加载项软件。 将机器配置为在公司网络中运行后,会使用自动磁盘或系统复制工具(如赛门铁克的GhostPowerQuest 的Image DriveAltiris 的RapiDeploy)将模板计算机的驱动器复制到数十台或数百台计算机上。 然后对这些克隆进行最后的调整,例如分配唯一名称,然后供公司员工使用。

另一种热门推出方式是使用 Microsoft sysdiff 实用程序(Windows Resource Kit 的一部分)。 此工具要求系统管理员在每台计算机上执行完全安装(通常是脚本化无人参与安装),然后 sysdiff 使加载项软件自动安装映像。

由于跳过了安装,而且磁盘扇区复制比文件复制更高效,因此与同等 sysdiff 安装相比,基于克隆的推出可以节省数十个小时。 此外,系统管理员不必学习如何使用无人参与安装或 sysdiff,或者创建和调试安装脚本。 仅此就可以节省数小时的工作。

SID 重复问题

克隆的问题在于,它只得到 Microsoft 非常有限的支持。 Microsoft 表示,只有在 Windows 安装程序的 GUI 部分之前完成的克隆系统才得到支持。 当安装到此阶段时,将为计算机分配名称和唯一计算机 SID。 如果在此步骤之后克隆了系统,则克隆的计算机都将具有相同的计算机 SID。 请注意,仅更改计算机名称或将计算机添加到其他域不会更改计算机 SID。 如果计算机先前与域关联,更改名称或域只会更改域 SID。

要了解克隆可能导致的问题,首先需要了解计算机上的各个本地帐户是如何获分配 SID 的。 本地帐户的 SID 由计算机 SID 和附加 RID(相对 ID)组成。 RID 从固定值开始,并为每个创建的帐户增加一个值。 这表示,例如,一台计算机上的第二个帐户将被赋予与克隆上的第二个帐户相同的 RID。 结果是两个帐户都具有相同的 SID。

重复 SID 在基于域的环境中没问题,因为域帐户具有基于域 SID 的 SID。 但是,根据 Microsoft 知识库文章 Q162001“请勿磁盘复制 Windows NT 的已安装版本”,在工作组环境中,安全性基于本地帐户 SID。 因此,如果两台计算机的用户具有相同 SID,则工作组将无法区分用户。 一个用户可以访问的所有资源,包括文件和注册表项,另一个用户也可以访问。

重复 SID 可能导致问题的另一个例子是,具有 NTFS 格式的可移动媒体,以及本地帐户安全属性应用于文件和目录。 如果将这样的媒体移动到具有相同 SID 的另一台计算机,则如果无法访问文件的本地帐户的帐户 ID 恰好与安全属性中的帐户 ID 匹配,则可以访问这些文件。 如果计算机具有不同 SID,这就不可能发生。

Mark 写了一篇题为“NT 推出选项”的文章,发表于 6 月份的 Windows NT 杂志。 它更详细地讨论了重复 SID 问题,并介绍了 Microsoft 对克隆的官方立场。 要查看网络上是否存在重复 SID 问题,请使用 PsGetSid 以显示机器 SID。

NewSID

NewSID 是我们为更改计算机 SID 而开发的程序。 它首先为计算机生成随机 SID,然后更新其在注册表和文件安全描述符中找到的现有计算机 SID 实例,用新 SID 替换出现内容。 NewSID 需要管理权限才能运行。 它有两个功能:更改 SID 和更改计算机名称。

要使用 NewSID 的自动运行选项,请在命令行中指定“/a”。 还可以通过在“/a”切换后包含新名称来指示它自动更改计算机名称。 例如:

newsid /a [新名称]

将在没有提示的情况下运行 NewSID,将计算机名称更改为“新名称”,并在一切正常的情况下重新启动计算机。

注意:如果预期运行 NewSID 的系统正在运行 IISAdmin,则必须在运行 NewSID 之前停止 IISAdmin 服务。 使用此命令停止 IISAdmin 服务:net stop iisadmin /y

NewSID 的 SID 同步功能,允许指定从其他计算机获取新 SID,而不是随机生成。 此功能使备份域控制器 (BDC) 可以移动到新域,因为 BDC 与域的关系是由它与其他域控制器 (DC) 具有相同的计算机 SID 来标识的。 只需选择“同步 SID”按钮并输入目标计算机的名称。 必须具有更改目标计算机注册表项的安全设置权限,这通常表示必须以域管理员身份登录才能使用此功能。

请注意,运行 NewSID 时,注册表的大小将增长,因此请确保注册表的最大大小将适应增长。 我们发现,这种增长对系统性能没有明显的影响。 注册表增长的原因是,由于 NewSID 应用了临时安全设置,注册表变得零碎。 删除设置后,注册表不会压缩。

重要提示:请注意,虽然我们已经彻底测试了 NewSID,但必须自担使用它的风险。 与任何更改文件和注册表设置的软件一样,强烈建议在运行 NewSID 之前完全备份计算机。

移动 BDC

以下是要将 BDC 从一个域移动到另一个域时应遵循的步骤:

  1. 启动要移动的 BDC 并登录。 使用 NewSID 将 BDC 的 SID 与 BDC 移动的目的地域的 PDC 同步。
  2. 重新启动更改了 SID (BDC) 的系统。 由于 BDC 现在关联的域已经具有活动 PDC,因此它将在其新域中作为 BDC 启动。
  3. BDC 将在服务器管理器中显示为工作站,因此请使用“添加到域”按钮将 BDC 添加到其新域。 添加时,请确保指定 BDC 单选按钮。

工作方式

NewSID 通过读取现有计算机 SID 开始。 计算机的 SID 存储在注册表的 SECURITY 配置单元,位于 SECURITY\SAM\Domains\Account 下。 此项具有名为 F 和 V 的值。V 值是二进制值,在其数据末尾嵌入了计算机 SID。 NewSID 确保此 SID 为标准格式(3 个 32 位的子颁发机构前面有三个 32 位颁发机构字段)。

接下来,NewSID 为计算机生成新的随机 SID。 NewSID 系列煞费苦心地创建了真正随机的 96 位值,它取代了构成计算机 SID 的 3 个子颁发机构值中的 96 位。

接下来是计算机 SID 替换的三个阶段。 在第一阶段,扫描 SECURITYSAM 注册表配置单元,查找项值中出现的旧计算机 SID 以及项名称。 在一个值中找到 SID 时,它会被新计算机 SID 替换,当在某名称中找到该 SID 时,项及其子项会被复制到新的子项,其具有相同名称,除了使用新 SID 替换旧 SID。

最后两个阶段涉及更新安全描述符。 注册表项和 NTFS 文件具有与其关联的安全性。 安全描述符包括条目(其可识别哪个帐户拥有资源,哪个组是主要组所有者),指定用户或组允许操作的可选条目列表(称为自由访问控制列表 - DACL),以及可选的条目列表(指定特定用户或组执行的哪些操作将在系统事件日志(系统访问控制列表 - SACL)中生成条目)。 用户或组在这些安全描述符中用其 SID 进行标识,正如先前所述,本地用户帐户(除了内置帐户,如管理员、来宾等)的 SID 由计算机 SID 和 RID 组成。

安全描述符更新的第一部分发生在计算机上的所有 NTFS 文件系统文件上。 每个安全描述符都会扫描计算机 SID 的出现情况。 当 NewSID 找到 SID 时,它会用新计算机 SID 替换它。

安全描述符更新的第二部分在注册表上执行。 首先,NewSID 必须确保它扫描所有配置单元,而不仅仅是那些已加载的配置单元。 每个用户帐户都有注册表配置单元,其在用户登录时加载为 HKEY_CURRENT_USER,但在用户未登录时保留在用户配置文件目录中的磁盘上。 NewSID 通过枚举 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList 项(指向存储这些位置的目录)来标识所有用户配置单元位置的位置。 然后,它使用 HKEY_LOCAL_MACHINE 下的 RegLoadKey 将它们加载到注册表中,并扫描整个注册表,检查每个安全描述符以搜索旧计算机 SID。 更新的执行方式与文件相同,完成后 NewSID 将卸载其加载的用户配置单元。 作为最后一步,NewSID 扫描 HKEY_USERS 项,其包含当前登录用户的配置单元以及 .Default 配置单元。 这是必要的,因为不能加载一个配置单元两次,所以当 NewSID 加载其他用户配置单元时,登录的用户配置单元不会加载到 HKEY_LOCAL_MACHINE 中。

最后,NewSID 必须更新 ProfileList 子项以引用新帐户 SID。 在更改帐户 SID 以反映新计算机 SID 后,此步骤对于使 Windows NT 将配置文件与用户帐户正确关联是必要的。

NewSID 通过赋予自身以下权限:System、Backup、Restore 和 Take Ownership 来确保其可以访问和修改系统中的每个文件和注册表项。