2008年12月4日星期四

[转载]NewSID 4.10 版

摘自http://www.microsoft.com/china/technet/sysinternals/utilities/NewSid.mspx

1 NewSID 4.10 版
作者:Mark Russinovich 和 Bryce Cogswell
发布日期: 2006年11月01日
1.1 重要信息:
关于 SID,Microsoft 不支持使用 NewSID 准备的映像,我们只支持使用 SysPrep 准备的映像。Microsoft 尚未针对所有部署克隆选项测试 NewSID。
有关 Microsoft 的官方策略的详细信息,请参阅下面的知识库文章:
• 有关 Windows XP 安装的磁盘复制的 Microsoft 策略

返回页首
1.2 简介
许多组织使用磁盘映像克隆技术来大规模部署 Windows。此方法要求将完全安装和配置的 Windows 计算机的磁盘复制到其他计算机的磁盘驱动器。其他这些计算机似乎已经有效地完成了相同的安装过程,并且可以立即使用。
虽然此方法节省了数小时的工作量并且比其他部署方法有效,但是它存在一个严重问题,即每个克隆的系统都具有一个完全相同的计算机安全标识符 (SID)。这一因素会损害工作组环境的安全性,并且在具有多个相同计算机 SID 的网络中,还可能损害可移动媒体安全性。
来自 Windows 社区的要求已经促使多家公司开发可以在克隆系统后更改计算机的 SID 的程序。但是,Symantec 的 SID Changer 和 Symantec 的 Ghost Walker 仅作为每家公司的高端产品出售。而且,它们都从 DOS 命令提示窗口中运行(Altiris 的更改器类似于 NewSID)。
NewSID 是我们开发的可更改计算机的 SID 的程序。它是一个免费的 Win32 程序,这意味着它可以容易地在以前克隆的系统上运行。NewSID 可在 Windows NT 4、Windows 2000、Windows XP 和 Windows .NET Server 上运行。
使用该程序之前,请先完整阅读此文章。
版本信息:
• 版本 4.0 引入了对 Windows XP 和 .NET Server 的支持、向导样式的界面(可以通过该界面指定您要应用的 SID)、注册表压缩以及用于重命名计算机的选项(该选项可用来更改 NetBIOS 名称和 DNS 名称)。
• 版本 3.02 更正了以下程序缺陷:在将具有旧 SID 的项重命名为新 SID 时,NewSid 无法正确复制具有无效值类型的默认值。实际上,NT 某些时候在 SAM 中使用了这些无效值。此程序缺陷的症状是:当授权用户更新帐户信息时,错误消息报告访问权限被拒绝。
• 版本 3.01 为由 Microsoft Transaction Server 创建的无法访问的注册表项添加了解决方法。不使用该解决方法,NewSID 会过早退出。
• 版本 3.0 引入了 SID 同步功能,该功能指示 NewSID 从另一台计算机获取要应用的 SID。
• 版本 2.0 具有自动模式选项,而且还使您可以更改计算机名称。
• 版本 1.2 修复了在版本 1.1 中引入的未更新某些文件系统安全描述符的程序缺陷。
• 版本 1.1 更正了仅影响某些安装的相对次要的程序缺陷。对它也进行了更新,以便更改与文件和打印机共享的权限设置相关联的 SID。
返回页首
1.3 克隆和备用部署方法
在企业环境中执行大规模 Windows 部署(通常为数百台计算机)的最常见方法之一基于磁盘克隆技术。系统管理员可以在样本计算机上安装公司使用的基本操作系统和附加软件。在配置该计算机以便在公司网络中进行操作后,可以使用自动化磁盘或系统复制工具(如 Symantec 的 Ghost、PowerQuest 的 Image Drive 和 Altiris 的 RapiDeploy)将样本计算机的驱动器复制到数十台或数百台计算机上。然后,对这些克隆计算机进行最后的调整(如分配唯一名称),然后由公司员工使用。
另一种比较流行的部署方法是使用 Microsoft sysdiff 实用工具(Windows 资源工具包的一部分)。此工具需要系统管理员在每台计算机上执行完全安装(通常是无人参与的脚本安装),然后 sysdiff 自动应用附加软件安装映像。
由于跳过安装并且磁盘扇区复制比文件复制更有效等原因,基于克隆的部署与类似的 sysdiff 安装相比可以节省数十小时的时间。另外,系统管理员不必了解如何使用无人参与的安装或 sysdiff,也无需创建并调试安装脚本。单这一项就可以节省数小时的工作。
返回页首
1.4 SID 重复问题
克隆的问题在于它仅由 Microsoft 提供非常有限的支持。Microsoft 已经声明,只支持在到达 Windows 安装程序的 GUI 部分之前获得到克隆系统。在安装到达此步骤时,将为计算机分配名称和唯一的计算机 SID。如果系统是在完成此步骤之后克隆的,则克隆的所有计算机都将具有完全相同的计算机 SID。请注意,只更改计算机名称或将计算机添加到不同的域不会更改计算机 SID。如果计算机先前与某个域相关联,则更改名称或域时只能更改域 SID。
要了解克隆可能引起的问题,首先需要了解如何为计算机上的各个本地帐户分配 SID。本地帐户的 SID 由计算机的 SID 和附加的 RID(相对标识符)组成。RID 从某个固定值开始,并且每创建一个帐户就会增加 1。这意味着一台计算机上的第二个帐户会被分配与克隆计算机上的第二个帐户相同的 RID。结果是这两个帐户具有相同的 SID。
重复的 SID 在基于域的环境中不是问题,因为域帐户具有基于域 SID 的 SID。但是,根据 Microsoft 知识库文章 Q162001“不要硬盘复制安装的 Windows NT 的各个版本”,在工作组环境中,安全是基于本地帐户 SID 的。因此,如果两台计算机的用户具有相同的 SID,则工作组将无法区分这些用户。对于所有资源(包括文件和注册表项)而言,如果一个用户对其具有访问权限,则另一个用户也对其具有访问权限。
重复 SID 可能引起问题的另一个场合是存在使用 NTFS 格式化的可移动媒体,并且将本地帐户安全属性应用于文件和目录。如果将这样的媒体移动到具有相同 SID 的另一台计算机,则当本地帐户的帐户 ID 恰巧与安全属性中的帐户 ID 匹配时,这些帐户将能够访问本来无法访问的文件。如果计算机具有不同的 SID,则不可能发生这种情况。
Mark 撰写的题为“NT Rollout Options”(NT 部署选项)的文章已在《Windows NT 杂志》的 6 月刊中发表。这篇文章更加详细地讨论了重复 SID 问题,而且表明了 Microsoft 对于克隆的官方立场。要查看您的网络中是否有重复 SID 问题,请使用 PsGetSid 来显示计算机 SID。
返回页首
1.5 NewSID
NewSID 是我们开发的可用来更改计算机 SID 的程序。它首先为计算机生成一个随机的 SID,然后更新它在注册表和文件安全描述符中找到的现有计算机 SID 的实例,并用新 SID 替换旧 SID。NewSID 要求使用管理权限运行。它有两个功能:更改 SID 和更改计算机名称。
要使用 NewSID 的自动运行选项,请在命令行中指定“/a”。您还可以通过在“/a”开关后面包含新名称来指示它自动更改计算机的名称。例如:
newsid /a [newname]
将使 NewSID 无提示运行,将计算机名称更改为“newname”,并且在一切正常的情况下重新启动计算机。
注意:如果要运行 NewSID 的系统正在运行 IISAdmin,则必须在运行 NewSID 之前停止 IISAdmin 服务。使用以下命令可停止 IISAdmin 服务:net stop iisadmin /y
NewSID 的 SID 同步功能使您可以指定从另一台计算机获取新 SID 而不是随机生成 SID。使用此功能,可以将备份域控制器 (BDC) 移动到一个新域,因为根据 BDC 与其他域控制器 (DC) 具有相同的计算机 SID,可以确定该 BDC 与某个域的关系。只需选择“Synchronize SID”按钮并输入目标计算机的名称。您必须具有更改目标计算机的注册表项的安全设置的权限,这通常意味着您必须以域管理员身份登录才能使用此功能。
请注意,当您运行 NewSID 时,注册表的大小将会增长,因此请确保注册表最大大小能够适应这一增长。我们已发现这一增长对系统性能没有明显影响。注册表增长的原因是:当 NewSID 应用临时安全设置时,注册表变零碎了。删除这些设置后,注册表不受影响。
重要信息:请注意,虽然我们已经对 NewSID 进行了全面测试,但是您必须自行承担使用它所带来的风险。像使用任何能够更改文件和注册表设置的软件一样,强烈建议您在运行 NewSID 前,对计算机进行完全备份。
返回页首
1.6 移动 BDC
将 BDC 从一个域移动到另一个域时,需要遵循以下步骤:
1. 启动您要移动的 BDC,然后登录。使用 NewSID 将该 BDC 的 SID 与要将该 BDC 移动到的域的 PDC 进行同步。
2. 重新启动更改了 SID 的系统 (BDC)。因为现在与该 BDC 相关联的域已经具有一个活动的 PDC,所以该 BDC 将作为其新域中的 BDC 启动。
3. 该 BDC 将显示为服务器管理器中的工作站,因此可以使用“添加到域”按钮将该 BDC 添加到其新域中。添加时一定要指定“BDC”单选按钮。
返回页首
1.7 工作原理
NewSID 首先读取现有计算机 SID。计算机的 SID 存储在注册表的 SECURITY\SAM\Domains\Account 下的 SECURITY 配置单元中。此项包含一个名为 F 的值和一个名为 V 的值。V 值是一个将计算机 SID 嵌入到其数据末尾的二进制值。NewSID 能够确保此 SID 具有标准格式(三个 32 位子颁发机构位段的前面带有三个 32 位颁发机构位段)。
接下来,NewSID 为计算机生成一个新的随机 SID。NewSID 的生成过程竭力创建了一个真正的 96 位随机值,该值将替换组成计算机 SID 的 3 个子颁发机构值(共 96 位)。
计算机 SID 的替换分为以下三个阶段。在第一阶段中,扫描 SECURITY 和 SAM 注册表配置单元,以便在项名称以及项值中查找旧的计算机 SID。如果在值中找到 SID,则用新的计算机 SID 替换它;如果在名称中找到 SID,则会将相应的项及其子项复制到与替换旧 SID 的新 SID 具有相同名称的新子项。
最后两个阶段涉及到更新安全描述符。注册表项和 NTFS 文件具有与自身相关联的安全性。安全描述符包含以下部分:一个标识了哪个帐户拥有资源,哪个组是主要组所有者的条目;一个可选列表(称为自由访问控制列表 - DACL),其中的条目指定了用户或组所允许的操作;以及另外一个可选列表,其中的条目指定了特定用户或组所执行的哪些操作将在系统事件日志(系统访问控制列表 - SACL)中生成条目。用户或组在这些安全描述符中通过其各自的 SID 进行标识,而且如前所述,本地用户帐户(内置帐户,如 Administrator、Guest 等除外)的 SID 由计算机 SID 和 RID 组成。
安全描述符更新的第一部分发生在计算机中的所有 NTFS 系统文件上。将扫描每个安全描述符以查找计算机 SID。当 NewSID 找到一个 SID 时,就会用新的计算机 SID 替换它。
安全描述符更新的第二部分在注册表上执行。首先,NewSID 必须确保已经扫描了所有配置单元,而不只是扫描了已加载的那些配置单元。当用户登录时,每个用户帐户都具有一个作为 HKEY_CURRENT_USER 加载的注册表配置单元,而当用户未登录时,该注册表配置单元将保留在磁盘的用户配置文件目录中。NewSID 标识所有用户配置单元位置的方法是枚举 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList 项,该项指向存储了这些配置单元的目录。然后,它使用 RegLoadKey 将这些配置单元加载到注册表中 HKEY_LOCAL_MACHINE 的下面,并且扫描整个注册表,检查每个安全描述符以查找旧的计算机 SID。这些更新的执行方式与文件更新相同,而且在更新完成时,NewSID 将卸载它所加载的用户配置单元。最后一步,NewSID 扫描 HKEY_USERS 项,该项包含 .Default 配置单元以及当前登录用户的配置单元。这一步是必要的,因为一个配置单元不能加载两次;所以,当 NewSID 正在加载其他用户配置单元时,不会将登录用户配置单元加载到 HKEY_LOCAL_MACHINE 中。
最后,NewSID 必须更新 ProfileList 子项以便引用新的帐户 SID。为了使 Windows NT 帐户能够在更改 SID 以反映新的计算机 SID 后正确地将配置文件与用户帐户相关联,需要执行此步骤。
NewSID 通过给予自身以下权限,确保它能够访问和修改系统中的每个文件和注册表项:系统、备份、还原和取得所有权。
返回页首
1.8 使用源代码
本文作者已提供了 NewSID 的完整源代码,以便用于教学目的。禁止在商业产品和免费的 SID 更改软件产品中使用这些代码,但允许在其他专用或商用程序中使用其技术。
http://download.sysinternals.com/Files/NewSid.zip