大概去年Q4的时候,写了一个脚本用来监控每台虚拟化宿主机上的虚拟机数量,包括总数量、运行状态的数量,非运行状态的数量。 当时的主要初衷是有团队成员创建虚拟机的时候,同组内的同学可以及时收到zabbix通知级别的告警,本来只是写着玩,在管理方面也许能起到辅助作用。
没想到这个通知级别的告警这次竟起到了大的作用。

问题发现


4月28日 19:11分,组内一名同学注意到了1条通知级别告警,内容是"一台虚拟化宿主机上的虚拟机数量突然变成0了"。
![image.png](https://s2.51cto.com/images/20220518/1652867479167041.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
)

但是并没有服务或者服务器down的告警。

于是该同学打算登陆服务器一探究竟。结果却发现服务器不能使用域管理员远程登陆了,提示该服务器和域之间失去信任关系。 本地管理员登陆则提示"远程计算机需要网络级别身份验证,而您的计算机不支持该验证。"

那只能通过远控卡登陆查看下原因了,结果发现该机器是一台因为远控卡坏掉没法使用的。也因此,该服务器上没有运行生产环境,都是测试用的demo环境。

折腾一番后,最终也没能修复远程连接的问题。 后来我也尝试连接了下,未果。只能去现场了。

原因分析


通常,一台加了域的计算机离开域30-60天的时间,会失去和域的信任关系。为什么离开时间是个范围而不是固定的呢?因为加了域的计算机也有个计算机账号,对应着一个计算机账号密码(区别于用户的密码),这个密码默认30天修改一次,相当于有效期30天,这个密码会分别被存在计算机本地和AD里面。

举个例子说明:

计算机A在5月1日这天修改了计算机密码为passwd01(计算机本身会保留两份密码,之前的和修改后的),在20号这天离开了域,但此时密码有效期还有10天。10天后(6月1日)计算机会再次修改密码为passwd02,但是此时已脱离了域,无法同步到DC,所以DC端的密码还是passwd01。passwd02的有效期截止日为6月30日。 7月1日会进行第三次修改passwd03。再第三次修改之前,计算机登陆域的时候会先用passwd02去尝试,失败的话,会用passwd01,这样成功登陆域,从而不会脱离域。第三次修改后计算机端只保留了passwd02和passwd03,而DC端还是passwd01。 这时候就会脱离域了。

通常脱离域的处理也比较简单,退出域重新加一下就可以了。

脱域的前提是什么:加入域的机器长期断网或联系不到DC(比如电脑长期不在办公区)。

疑点来了: 这是台域成员服务器,24h在线,和DC在一个二层网络内,和DC一直是通的,不应该出现脱域这样的问题。

处理过程


到了现场后,连接好显示器、键盘、鼠标。

  • 使用域管理员登陆: 提示和域失去信任。

  • 使用本地管理员登陆: 正常登陆。

  • 配置远程桌面,取消NLM级别认证。 未奏效。
    image.png
  • 查看windows日志,也只有联系不到域的日志,没有更多有效的信息。

  • 尝试退域,重新加域

    报错:"过程号超出范围" ,即"procedure number out of range"。 这个报错从来没遇到过,网上遇到这类报错的也几乎没有。找不到匹配的解决方案。

  • 尝试powershell命令强制退域
    image.png
    -尝试powershell强制直接加入工作组。 命令运行失败。提示联系不到域。
    image.png

  • 之后又是查阅各种资料。毫无收获。 难道是安全补丁造成的?
    4月13日微软发布了月度补丁,14日就安装了,隔了半个月了,估计大部分人都不会想到可能是补丁问题。 但是实在找不出问题了,死马当活马医,抱着试试看的态度。
    image.png

将4月的安全补丁kb5012639 卸载后重启。 发现可以正常退域了,将服务器重新加入域,让用户检查demo环境,都恢复正常了。

和组内同学讨论后商定,明天将该补丁从所有服务器卸载。

总结


年初至今5个月,已经遇到2次因补丁有问题需要卸载了。 也许是概率性问题不太好发现,所以官方也没有测试出来吧。 果断将潜在风险同步到业内相关IT人员。

在后续Windows方面遇到一些罕见的异常问题,在官方信息量有限,又查不到原因的情况下,补丁也许就是最后一个可能潜在的原因。