简介:SID修改.rar 是一份围绕 Windows 系统标识符(SID)修改的轻量工具与源码资料,面向需要研究账户标识、权限模型及克隆环境冲突处理的开发者、系统管理员和实验测试人员。资源包共 30 个文件,约 84KB,以 cpp 源码和 h 头文件为核心,辅以 ico、bmp、cur 等界面资源、bak 备份文件以及 txt 说明文档,整体保留了较完整的工程结构,便于对照阅读工具实现与资源组织方式。目前已有 319 人学习,说明其在 SID 主题下具备一定参考价值。结合内容预览中的 NEWSID 源代码与 README,读者可借此了解 SID 的组成、复制与修改思路,并认识权限校验、系统稳定性和备份恢复等关键风险点;更适合作为原理学习与代码研读材料,而非直接用于生产环境。
1. SID 修改器不是“改个名”:先弄清机器 SID 和账户 SID 谁在管事
用同一份镜像批量部署二十台机器,装完系统、改完机器名、配好 IP,结果资产管理系统里只显示一台在线,其余十九台被覆盖成同一条记录;或者文件服务器日志里,五个部门的登录事件全挂同一个标识。这种场面不是网络的问题,也不是域控的问题,多半是这批机器的 SID 一模一样。SID(Security Identifier)是系统给账户和机器发的身份证号,克隆部署会把这张身份证原样复制,于是“二十台机器一个身份”。这份 SID 修改.rar 里的修改器,干的就是把机器 SID 和由它派生出来的本地账户 SID 换掉,让克隆机重新拿到独立身份。适合手里有镜像池、机房批量装机、虚拟机模板反复复制的人;只装一两台家用机的人基本用不上,因为重装比改 SID 干净得多。
2. 解压 SID 修改.rar 之后:先验包再谈功能
拿到这种来源不明的压缩包,第一反应不该是双击 exe,而是先看包里到底是什么。SID 修改工具本身逻辑不复杂,真正容易让人翻车的,是包被二次打包、捆绑或被替换过。这一章先说清包里怎么验、在什么环境里跑第一遍,再讲清这类工具的操作模型——界面各不相同,但动作序列是一致的。
2.1 解压先看三样:文件类型、签名状态、哈希
解压到一个独立目录,不要解压到桌面或者系统目录,也不要在解压后直接双击。先用命令行把目录里的东西列出来,看扩展名有没有伪装:有的包会把 exe 改名成 .scr、.bat、.cmd,甚至用双扩展名xxx.txt.exe。系统默认隐藏已知扩展名,这一步就是要把真实后缀逼出来。
# 解压目录下逐个列出真实文件名、大小、创建时间 Get-ChildItem -Path 'D:\tools\sid' -Recurse -File | Select-Object FullName, Length, CreationTimeUtc | Format-Table -AutoSize # 查数字签名:这类小工具基本是 NotSigned,不能靠签名判定安全,但要记录 Get-AuthenticodeSignature -FilePath 'D:\tools\sid\*.exe' | Select-Object Path, Status, SignerCertificate # 记录哈希,之后在别的机器上比对是不是同一份包 Get-FileHash -Path 'D:\tools\sid\*.exe' -Algorithm SHA256 | Select-Object Path, Hash这段命令做三件事:列目录是为了看清有没有夹带无关文件;查签名是为了知道这个 exe 是不是有发布者信息,绝大多数此类工具是NotSigned,所以签名只能当参考,不能当通行证;算哈希是为了留档——同一份包在 A 机器和 B 机器上哈希不一致,就说明中间被改过,别再往下走。
Get-FileHash的-Algorithm建议固定用 SHA256,别用 MD5,网上流传的 MD5 对照表早就被玩坏了。哈希值抄进一个文本文件,和后面导出的 SID 记录放一起,养成习惯之后排查“这台机器当时到底用哪版工具改的”会有用。
依赖方面,这类老工具常见两种形态:一种是原生编译的单文件 exe,双击就跑;另一种是带运行库的小程序,缺 VC 运行库或者 .NET Framework 时表现为双击一闪而过、没有任何报错。遇到闪退,别急着怀疑工具坏了,先以管理员身份在命令行里启动,让报错信息留在窗口里:
# 在解压目录里以当前控制台为父进程启动,错误信息不会随窗口消失 cd 'D:\tools\sid' .\SID修改器.exe从命令行启动的价值在于能看到退出码和错误输出。如果提示缺 dll,那就是运行库问题;如果提示“拒绝访问”,那是权限问题,需要提权;如果干脆没反应,多半被杀软拦了,去防护日志里找拦截记录。
提示:不要在没有快照的物理机上直接运行来源不明的 exe。真要验证,先扔进一台不接生产网络的虚拟机,跑完观察进程、网络连接和启动项变化再决定是否上真机。
2.2 为什么第一遍必须跑在虚拟机里:最小验证环境怎么搭
SID 修改是那种“改坏了不会立刻报错、过两天登录才发现用户配置文件丢了”的操作。它的破坏面比想象中大:本机账户 SID 一变,原来挂在旧 SID 下的用户配置文件目录就失去了关联,登录时会给你新建一个临时配置文件,桌面、收藏夹、邮件全都“消失”——数据其实还在硬盘上,只是系统认不出那是谁的目录了。这类问题在物理机上排查代价极高,在虚拟机上大不了回滚快照。
最小验证环境的搭法:找一台虚拟化平台,建一台虚拟机,装和生产线同版本的系统,然后装上你最依赖的那几套软件。这一步不能省,因为 SID 修改的风险几乎全部来自第三方软件对 SID 的隐式依赖。装什么?至少覆盖四类:
| 验证项 | 典型软件类型 | 修改后要观察什么 |
|---|---|---|
| 数据库类 | 本机实例的数据库服务 | 服务能否启动、原有登录名能否连上 |
| 授权类 | 绑定机器码的商业软件 | 授权是否失效、是否需要重新激活 |
| 加密类 | 文件加密、证书存储 | 已加密文件能否打开、证书私钥是否还在 |
| 运维类 | 补丁分发客户端、资产采集代理 | 客户端 ID 是否变化、后台是否还认这台机器 |
搭好之后,先做一次快照,命名为before-sid,再动手。改完重启,逐项过一遍上面这张表,把失败项记下来。这套流程走一遍大概一小时,能替你省掉后面在机房里蹲半天的时间。
另外,验证环境里最好只保留一个本地管理员账户,别用域账户登录测试——域账户的 SID 来自域,本机改 SID 对它没意义,反而会干扰判断。
2.3 工具界面差异大,但动作只有四个:读、生成、写、重启
不同来源的 SID 修改器,界面从 Win32 老式对话框到命令行都有,按钮名字五花八门,但底层动作序列只有四步,认准这四步就不会被界面带偏:
- 读取现状:工具启动后第一件事一定是读出当前的机器 SID 和本地账户 SID 列表,界面上通常显示成一串
S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-500形式的字符串,末尾的-500是 Administrator 的 RID。 - 生成新值:要么点“随机生成”,要么手工填三段数字。这三段数字就是机器 SID 的主体,三段拼起来必须唯一。
- 写回注册表:把新的机器 SID 写进账户数据库,同时重算所有本地账户的 SID。这一步是原子的,中途断电基本等于系统报废,所以别在笔记本电量不足的时候干这事。
- 重启生效:几乎所有这类工具都会提示重启,因为 SID 在登录会话建立时就被缓存了,不重启不生效。
参数上真正需要你决定的只有两处:新 SID 是随机生成还是手工指定,以及是否同时修改本地账户 SID。
| 参数/动作 | 含义 | 建议 | 风险 |
|---|---|---|---|
| 随机生成机器 SID | 用随机数替换三段主体值 | 单机场景首选 | 极低,但要确认生成的不是全零或明显重复值 |
| 手工指定机器 SID | 自己填三段数字 | 只在需要与资产台账对齐时用 | 填重复了等于白改 |
| 同步修改账户 SID | 把本地账户 SID 一起重算 | 克隆机场景建议开 | 会切断旧配置文件关联,务必先备份 |
| 只改机器 SID | 仅替换机器标识 | 仅用于解决管理平台识别重复 | 部分软件认的是账户 SID,可能没效果 |
一个容易被忽略的点:改之前先把“这台机器原来是什么 SID”抄下来。工具界面上的值可以复制,也可以先用第 3 章的命令自己查。这份记录是后面回滚和对比的唯一依据,丢了就只能靠备份硬还原。
3. 改 SID 的三段式操作:查清楚、备干净、验到位
真正动手的时候,最容易出问题的不是工具本身,而是前后两头:改之前没查清现状,改之后没验证结果。中间那步点按钮反而是最简单的。这一章按“查—备—改—验”的顺序把命令和判断标准写全,照着走一遍,出问题也知道停在哪一步。
3.1 三条命令把 SID 现状钉死
先查。查的目的不只是知道当前值,更是建立一个基线:改完之后拿同样的命令再跑一遍,对比差异,才知道改没改成功、改歪了没有。
# 1) 当前登录账户的 SID,最直观的一条 whoami /user # 2) 本机所有本地账户的 SID 列表(系统较新时可用) Get-LocalUser | Select-Object Name, Enabled, SID | Format-Table -AutoSize # 3) 从账户 SID 反推机器 SID:去掉末尾的 RID 就是机器主体 (Get-LocalUser | Where-Object { $_.SID.Value -like 'S-1-5-21-*' } | Select-Object -First 1).SID.Value三条命令各有用途。whoami /user输出形如S-1-5-21-A-B-C-1001,末尾1001是当前账户的 RID;Get-LocalUser能一次看到全部本地账户,其中-500是内置管理员,-501是来宾,-1000以上是后来创建的账户;第三条把前三段A-B-C抠出来,这三段就是机器 SID 的主体,也是 SID 修改器真正要替换的部分。
判断“是不是 SID 重复”也靠这三条。把两台疑似克隆机的输出并排看,如果S-1-5-21-A-B-C三段完全相同,只是末尾 RID 不同,那就是同一份镜像出来的,问题坐实。这时候别急着改,先确认这两台机器是不是真的需要独立身份——如果只是临时测试环境,隔离网段比改 SID 省事。
再补一条查配置文件关联的命令,改前改后都要看:
# 列出所有用户配置文件对应的 SID 键,重点看有没有 .bak 后缀的孤立项 Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' | Select-Object PSChildName正常情况下,每个 SID 键都对应一个真实存在的用户目录。如果出现xxx.bak这样的键,说明系统曾经认不出某个配置文件、把它降级了,这是“临时配置文件”问题的典型痕迹。改 SID 之前就存在.bak,说明这台机器之前已经被折腾过一轮,动手前先把这个问题处理掉,否则改完分不清是谁造成的。
3.2 三层备份:快照、还原点、注册表 hive
备份这件事,做一层是不够的,因为三个层次的恢复粒度完全不同。颗粒度从粗到细排:虚拟机快照 > 系统还原点 > 注册表 hive 导出。三层都做,代价不过十几分钟。
第一层,虚拟机快照。如果机器跑在虚拟化平台上,动手前打一个快照,命名带日期。这是最干净的后悔药——出问题直接回滚,五分钟回到原状,连引导都不用修。物理机没有这一层,只能靠后两层。
第二层,系统还原点。系统自带的还原点会备份注册表和部分系统文件,对 SID 这类注册表级改动有一定覆盖能力,但它默认有频率限制,一天只能建一个。
# 关闭 24 小时创建频率限制(仅当前操作需要,做完可以改回去) New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore' ` -Name 'SystemRestorePointCreationFrequency' -Value 0 -PropertyType DWord -Force # 创建还原点 Checkpoint-Computer -Description 'before-sid-change' -RestorePointType 'MODIFY_SETTINGS' # 确认已创建 Get-ComputerRestorePoint | Select-Object CreationTime, Description-RestorePointType用MODIFY_SETTINGS表示这是一次配置变更前的还原点,语义上比默认值更准确。Checkpoint-Computer需要管理员权限,且系统保护必须处于开启状态,如果提示“系统保护已关闭”,先去系统属性里把对应磁盘的保护打开。
第三层,注册表 hive 导出。SID 数据主要在账户数据库里,而这个位置普通管理员也读不了,必须以 SYSTEM 身份操作:
# 以 SYSTEM 身份把账户数据库、安全数据库、系统配置导出到备份目录 $backup = 'C:\sid-backup' New-Item -ItemType Directory -Path $backup -Force | Out-Null schtasks /create /tn 'DumpSIDHives' /sc once /st 23:59 /ru SYSTEM ` /tr "cmd /c reg save HKLM\SAM $backup\SAM.hiv /y & reg save HKLM\SECURITY $backup\SECURITY.hiv /y & reg save HKLM\SYSTEM $backup\SYSTEM.hiv /y" schtasks /run /tn 'DumpSIDHives' Start-Sleep -Seconds 5 Get-ChildItem $backup | Select-Object Name, Length这里用计划任务绕权限,是因为reg save读账户数据库需要 SYSTEM 级别令牌,普通管理员会直接报拒绝访问。三个 hive 必须一起备份:账户数据库里存 SID,安全数据库里存与之关联的密钥材料,系统配置里存服务与驱动信息,单独还原其中一个大概率开不了机。
再用一条命令确认备份文件不是空的:
# 三个文件都应该有可观的大小,几百 KB 以下基本可以判定失败 Get-ChildItem 'C:\sid-backup\*.hiv' | Select-Object Name, @{n='KB';e={[math]::Round($_.Length/1KB,1)}}注意:注册表 hive 的还原不能靠双击,必须在恢复环境或者离线状态下用
reg load挂载替换,操作门槛比快照高得多。所以这三层里,快照才是主力,hive 是最后的兜底。
3.3 改完立刻做的三项验证
工具跑完、机器重启之后,别急着交付,先做三项验证。这三项覆盖了“改没改成”“账户还能不能用”“配置文件丢没丢”三个层面。
第一项,对比 SID 主体。
# 改完之后再跑一次,与基线对比 whoami /user Get-LocalUser | Select-Object Name, SID | Format-Table -AutoSize期望结果是:S-1-5-21-A-B-C这三段和改之前不一样了,同一台机器上所有本地账户共享新的三段主体,末尾 RID 保持不变(内置管理员仍是-500,普通账户还是原来的编号)。如果发现部分账户还是老 SID,说明工具只改了机器标识没重算账户,这种情况要么换工具,要么把账户重建一遍。
第二项,登录验证。断开当前会话,用一个本地账户重新登录,重点看两件事:桌面上的文件是不是原来的,以及有没有弹出“您已使用临时配置文件登录”的提示。前者正常、后者出现,说明配置文件关联断了,需要去ProfileList里把旧 SID 键对应的ProfileImagePath手工指回去。
第三项,依赖软件巡检。把 2.2 那张表再走一遍:数据库服务起没起、授权到期没到期、加密文件能不能开、批量部署客户端在不在线。这一步最费时间,但也最能提前暴露问题。巡检结果记成一张单子,和哈希、SID 基线放一起归档。
4. 五个真实翻车现场:SID 改完才暴露的问题
工具能跑通不代表事情办完了,SID 修改的后遗症往往延迟出现。下面五条都是从“改完看着挺好、过一两天出事”这个角度整理的,每条按现象、原因、解决三段写,遇到对得上的直接照方抓药。
4.1 先确认到底是不是 SID 重复,别乱改
动手前先做一个五分钟的判定,能挡掉一半的无效操作。判定方法:找两台“症状一致”的机器,各跑一遍whoami /user,只看S-1-5-21-后面那三段数字。三段相同、RID 不同,是克隆导致的 SID 重复;三段不同但管理平台仍然认错,那问题在采集端——很可能是资产系统用机器名、MAC 或者某个硬件指纹做唯一键,跟 SID 没关系,改 SID 纯属白费功夫。
还有一种情况:机器是从模板部署的,但部署工具本身调用了系统自带的准备流程(下一章会讲),那 SID 其实已经被重置过,症状是别的原因造成的,比如客户端 ID 缓存没清、注册表里的旧标识没删。这时候改 SID 不但没用,还会把本来正常的系统搞出问题。所以判定这一步不能跳。
判定之后还有一条自检:这台机器加入域了吗?如果在域里,先退域再改。域内机器的身份由域控发,本机 SID 只是副本,改了 SID 之后域信任关系必然断裂,症状是登录提示“此工作站和主域间的信任关系失败”,只能退域重加。
4.2 五条血泪记录:现象、原因、解决
第一条:改完重启,登录进的是空桌面。
现象:输入密码能进系统,但桌面、文档、浏览器收藏全没了,像新装的系统。
原因:账户 SID 变了,而用户配置文件目录仍然挂在旧 SID 名下。系统找不到匹配项,就新建一个临时配置文件顶上。
解决:先别关机,去注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList下找带.bak后缀的键,把后缀去掉、再把ProfileImagePath的值改成真实目录路径,重启后重新登录。数据一直都在C:\Users\下面,没有丢,只是索引断了。改之前做过 hive 备份的,也可以离线挂载比对。
第二条:数据库服务起不来,日志报登录失败。
现象:系统能进,业务软件连不上本机数据库,服务管理器里数据库服务状态是“已停止”,手动启动几秒后又停。
原因:数据库实例内部保存的登录名映射的是旧 SID,SID 一变,实例认为这个账户不存在,启动时校验失败。
解决:用单用户模式启动实例,把登录名重新映射到新 SID,或者直接重建登录名并授权。这一步没法批量自动化,只能逐实例处理。所以 2.2 的最小验证环境里一定要装一个数据库实例先试,别在生产机上直接开盲盒。
第三条:文件加密的文档打不开了。
现象:加密过的文件双击提示拒绝访问,证书管理里那张证书显示“没有私钥”。
原因:加密证书的私钥受账户 SID 保护,SID 换了之后,密钥容器对不上号。
解决:如果改之前导出过证书(含私钥)的备份文件,重新导入即可;没导出过的,基本只能认栽。这条没有技巧,只有事前备份。凡是机器上有加密文件、EFS、证书存储的,改 SID 之前必须先把证书连私钥一起导出。
第四条:补丁分发后台把二十台机器看成一台。
现象:改完 SID 之后,管理后台里机器数量还是对不上,客户端 ID 反复覆盖。
原因:这类客户端通常自己维护一个唯一标识,存在本地某个文件或者注册表项里,跟 SID 不是一回事。改了 SID 但没清客户端缓存,等于没改。
解决:找到客户端的标识存储位置,删除或重置后重新注册。不同客户端位置不同,常见做法是停服务、删标识文件、起服务触发重新注册。这条最能说明“SID 不是万能钥匙”——管理平台识别重复,得先搞清楚它到底拿什么当唯一键。
第五条:改到一半断电,机器进不了系统。
现象:工具运行到写回注册表时断电或强制关机,再次开机卡在引导阶段,或者提示账户数据库损坏。
原因:账户数据库是原子写入的,中途中断会留下不一致状态,登录子系统加载失败。
解决:进恢复环境,用之前备份的 hive 离线替换,或者直接回滚快照。这就是为什么第 3 章要三层备份——这种情况下,快照是唯一能在十分钟内解决的手段。没有快照的物理机,只能重装。
提示:这五条里,只有第一条和第二条有比较标准的修复路径,第三条和第五条本质上是“事前没备份”的代价。改 SID 这个操作,备份做得好就是十分钟的事,做不好就是重装的事。
5. 系统自带的准备流程:什么时候不用改 SID 器
SID 修改器是“事后补救”思路:机器已经克隆好了,回头把身份换掉。系统本身提供了“事前规避”的路径——在封装镜像时就把身份重置掉,克隆出来的每台机器天生独立。这条路更规范,代价是必须在封装阶段做,而且有次数限制和执行条件。
5.1 sysprep /generalize 到底做了什么,什么时候能用
系统自带的系统准备工具,核心参数三个:/generalize表示把与硬件、身份相关的信息清掉,包括机器 SID、事件日志、还原点、部分驱动缓存;/oobe表示下次开机进入开箱向导,让最终用户或部署脚本填写信息;/shutdown表示执行完关机,方便直接做成模板。三条合起来的典型命令是:
REM 在封装好的模板机上执行:清理身份信息、下次开机进向导、执行完关机 C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown /quiet/quiet表示不弹界面,适合放进部署脚本。/generalize做的最关键一件事就是重置机器 SID,所以走完这条路,克隆出来的机器不需要再用修改器。
但它的限制同样明确:只能在非域环境执行,加入域的机器必须先退域;同一台机器反复执行的次数有限,次数用尽后需要改注册表里的计数状态才能继续,而这一步在很多场景下不被支持;执行过程会清掉驱动缓存,如果模板机的硬件和最终机器差异大,第一次开机会有一段较长的驱动重装过程。所以它适合“做模板、批量铺开”的流程,不适合“一台已经跑着业务的机器临时补一刀”。
5.2 无人值守文件里那几个真正影响结果的参数
配合准备流程用的应答文件,参数很多,但和 SID、开箱流程直接相关的只有几个:
| 参数 | 作用 | 常见取值 | 说明 |
|---|---|---|---|
SkipMachineOOBE | 跳过机器级开箱页 | true | 跳过不等于不初始化,身份重置仍会发生 |
SkipUserOOBE | 跳过用户级开箱页 | true | 常与上一项成对出现 |
PersistAllDeviceInstalls | 保留已安装的驱动 | true | 模板机与目标机硬件一致时开启可省时间 |
DoNotCleanUpNonPresentDevices | 保留不在场设备记录 | false | 保持默认,清理更彻底 |
这几个参数的坑在于语义容易理解偏。SkipMachineOOBE只是跳过交互界面,不代表跳过身份重置;很多人以为勾上它就不用管 SID 了,结果克隆出来照样重复。反过来,PersistAllDeviceInstalls设成true是为了省驱动重装时间,但如果模板机和目标机硬件不同,保留的驱动记录会带来一堆“未知设备”,反而不如让系统重新识别。
实际做法通常是:模板机装好系统和通用驱动,做一次准备流程,配一份只填了必要项的应答文件,克隆后由部署脚本接管后续的加域、改机器名、配网络。整个链路上,SID 在准备阶段就解决了,后面不用再碰。
5.3 什么情况下还得回头用修改器
两条路各有边界,选错了就是白折腾。判断标准可以收敛成一张表:
| 场景 | 推荐路径 | 理由 |
|---|---|---|
| 正在做镜像模板,还没铺开 | 系统准备流程 | 一次配置,后续克隆全部独立,最规范 |
| 镜像已经铺开了几十台,发现 SID 重复 | SID 修改器 | 回不到封装阶段,只能逐台修 |
| 单台虚拟机从模板复制出来做测试 | 修改器或直接重建 | 数量少,重建更省事,改 SID 也行 |
| 机器已加入域 | 先退域,再选路径 | 域内改 SID 必然断信任,两条路都一样 |
| 机器上有加密文件、证书、本机数据库 | 优先重建或走准备流程 | 改 SID 的后遗症太多,能避则避 |
| 只想让管理平台别把两台机器认成一台 | 先查平台唯一键 | 大概率不是 SID 的问题,改错了白改 |
这张表的用法很简单:从下往上排除。先确认是不是 SID 的问题,再确认能不能回到封装阶段,最后才考虑在一台跑着业务的机器上动刀。修改器的定位始终是“已经错过最佳时机之后的补救工具”,不是首选方案。
工具本身的适用边界也要说清楚:它只能改本机账户体系里的 SID,对域账户、对第三方软件自己维护的标识、对已经签发的证书一律无效。指望它解决所有“机器身份重复”的问题,注定要失望。
6. 把改 SID 变成可复现的操作:一份对比脚本和三条纪律
改 SID 这件事,玄学感主要来自“改完不知道有没有改对”。解决办法很朴素:把改前改后的状态都落成文件,用脚本做机器对比,而不是靠眼睛看界面。我现在的习惯是,任何一台机器动手之前,先跑一遍采集,改完再跑一遍,两个文件一 diff,结论立刻出来。
# 采集脚本:把与 SID 相关的状态一次性导出,改前改后各跑一次 param( [Parameter(Mandatory = $true)][string]$Tag # 例如 before / after ) $out = "C:\sid-backup\state-$Tag.txt" $lines = @() $lines += "== 采集时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ==" $lines += "== 计算机名: $env:COMPUTERNAME ==" # 1) 当前账户 SID $lines += "`n[当前账户]" $lines += (whoami /user | Out-String) # 2) 全部本地账户 SID $lines += "`n[本地账户]" $lines += (Get-LocalUser | Select-Object Name, Enabled, SID | Format-Table -AutoSize | Out-String) # 3) 配置文件关联键,找孤立项 $lines += "`n[配置文件键]" $lines += (Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' | Select-Object -ExpandProperty PSChildName | Out-String) # 4) 域加入状态,改 SID 前必须是未加入 $lines += "`n[域状态]" $lines += ((Get-CimInstance Win32_ComputerSystem).PartOfDomain | Out-String) $lines | Set-Content -Path $out -Encoding UTF8 Write-Host "已写入 $out,共 $($lines.Count) 行"脚本里四个采集点各有针对性。当前账户 SID 是给人看的最直观证据;本地账户列表用来确认所有账户是否同步换号;配置文件键用来发现.bak孤立项,这是临时配置文件问题的前兆;域状态是一条硬性前置检查——输出True就别往下走了,先退域。
用法就是两次调用:
# 改之前 .\collect-sid-state.ps1 -Tag before # 工具操作、重启之后 .\collect-sid-state.ps1 -Tag after # 对比 Compare-Object (Get-Content 'C:\sid-backup\state-before.txt') ` (Get-Content 'C:\sid-backup\state-after.txt')Compare-Object会把差异行用=>和<=标出来。理想结果是:账户 SID 那几行全部变化,配置文件键完全不变(没有新增.bak),域状态两次都是False。如果配置文件键多出了带.bak的条目,立刻停手,按第 4 章第一条的方法修;如果域状态第二次变成True,说明有人在中途把机器加域了,SID 修改和加域的顺序搞反了。
三条纪律,是我踩过之后固定下来的:
第一条,没有快照不改 SID。物理机没有快照就用还原点加 hive 备份顶上,但心里要清楚这只是降级方案。改 SID 是一个“成功概率很高、失败代价极高”的操作,为它准备五分钟的退路,怎么算都划算。
第二条,先断网再动手。改 SID 的过程中机器身份处于不一致状态,这时候如果还在网里,域控、管理平台、补丁分发都可能读到中间态,留下脏数据。断网改完、验证通过、再接入网络,顺序不能反。
第三条,一次只改一台,验证通过再下一台。批量脚本看着爽,但第一台暴露的问题在第十台会放大十倍。机房里二十台机器,我宁可花两小时一台台过,也不愿意用十分钟批量跑完然后花两天收拾。
最后一条经验是给急着上线的人:改 SID 从来不是“修一下就好”的操作,它是“确认必须改、备份做完、验证路径想清楚”之后才执行的操作。我见过太多人因为管理后台显示重复,抓起工具就改,结果把本来只是客户端缓存问题的机器改出配置文件损坏。从那以后我每次遇到“机器身份重复”的报障,都强制先跑一遍 4.1 那个五分钟判定,确认是 SID 的问题才动工具。希望帮到你。
本文还有配套的精品资源,点击获取