最近发现在我们的运行的试验系统中出现了某个Windows Server 2008 R2的实验环境,由于许可证已经过了过期时间,而且交付的试验系统又在一个隔离网段,因此无法通过公司内置的KMS服务器激活,造成了实验环境的大问题!这个过期的虚拟服务器,会每隔1个小时就关机一次,简直让我头大的很;面对这个问题,学员们普遍表示了理解和不爽,当然设计了这个实验环境的我自然感到火大!
有没有好的方法让我这个用于实验目的的环境永不过期呢?考虑到我们实验室的机制是对于实验环境是每次都刷新到快照的状态,但是虚拟机的时间并没有锁定,因此每次虚拟机的时间都会随着系统的时间shift,因此过期是不可避免的,除非我们刻意的修改托管虚拟机的物理机时间,但这不是长久之计;如果可以通过 slmgr /rearm的方式将会给系统延期10天,请注意刷新了快照虽然系统时间会变,但是记录在注册表中的rearm延期的次数(默认是3次)是不会改变的,这就给我们每次刷新和交付的试验系统一个无限rearm次数的可能!而且我们的实验环境基本每两天就会刷新一次,因此不会再次出现超过rearm的时间的问题。好了,有了思路剩下的就比较好解决了。
首先,我想到的方法是利用cmd创建一个批命令,简单如下:
REM ---判断是否Rearm过,如果没有则进入rearm过程,如果有则结束
if not exist c:\Scripts\rearm.tmp call :create
goto end
:create
REM ---创建一个标志位(首次rearm过程会创建一个文件),保证rearm后在试验期间不会陷入再次重启(因为已经rearm过)
echo rearm >> c:\Scripts\rearm.tmp
REM ---通过Start调用后台rearm动作,因为rearm的过程是交互的而在后台运行时无法进行交互因此设置为后台启动
start slmgr /rearm
REM ---经过试验这个步骤很重要,首先rearm需要重启才能生效,如果不设置后台启动,shutdown会等待rearm交互结束之后才进行,但后台启动的rearm是没有交互过程的,因此我们这里设置的是shutdown会和rearm的动作并行在后台运行,通过调整发现在我们的50个虚拟机的环境下,设置延迟180秒可以确保所有rearm的动作完成并且重启延期成功。经过测试发现,如果时间过短,并且物理机负载较重的情况下,可能会出现rearm没有做完已经重启虚拟机造成系统没有延期的问题,因此请确保给rearm足够的时间;)
start shutdown /r /f /t 180
goto:eof
:end
上述脚本完成了对系统的rearm工作,接下来还需要在系统的计划任务中配置每次启动都进行rearm判断的cmd脚本逻辑,大致过程如下:
-
启用计划任务管理
-
创建一个基本任务
-
对于基本任务设置名称,不管用户是否登录都要运行,一定要确保选择了使用最高权限运行,然后勾选隐藏
-
设置触发器条件为,每次启动时延迟30秒运行
-
在操作中选择之前创建的rearm批命令
-
其他设置保持默认,输入管理员口令后保存这个任务
OK,你现在和我一样在测试环境中有了一个可以延期的系统,重启确认一下系统已经延期。
smlgr /dlv