刘景云
在Windows的域环境中,有时会出现客户机无法加入域或者登录域失败的情况,如果排除了別的原因,很可能是客户机的时间和域控的时间差异较大的缘故。这一点很容易被人忽略,认为时间管理似乎并不重要,实际情况并非如此,如果域内时间不同步的话,会造成各种奇怪的问题,例如对于系统日志来说,如果记录的事件时间异常,对于问题的排查就会造成不利的影响。
活动目录时间同步机制
在域环境中是利用名为“W32Time”的服务,来实现主机之间的时间同步的,时间同步对于Kerberos认证协议是极为重要的。时间同步使用的是SNTP简单网络时间协议,林中的根域PDC扮演着基准时间服务器的角色,PDC即模拟主机角色,是AD DS域服务定义的操作主机角色之一,确切地说PDC是域范围内操作主机角色,注意林中的每个域中只能有一个PDC角色。在CMD窗口中执行“Netdom query FSMO”命令。在返回信息中显示五种操作主机所在的域控名称(图1),可以查看到PDC主机名称。
当然,PDC主机的功能有很多,例如可以兼容低版本的域控,PDC所在的域控优先成为主域浏览器,PDC拥有活动目录数据库优先复制权,防止组策略套用出错等。PDC很重要的功能之一是可以充当时间服务器,域中所有主机会和PDC同步时间,拥有PDC角色的域控会成为时间服务器。当前域中的PDC也会和林中根域的PDC自动对时,来保持整个林中的时间一致性,即子域中的PDC会自动和父域中的PDC对时。可以看出,这实际上是一种基于域的层次架构。对于根域中的第一台PDC来说,会和外网的时间服务器进行对时。在默认情况下,域中的客户机每隔1小时和PDC进行一次时间同步,成员服务器和PDC的同步周期为100秒。
时间同步方式
时间同步服务和“w32tm”命令息息相关。在客户机上登录到域环境,执行“w32tm /monitor”命令,在返回信息中显示所有的域控信息(图2),如果存在多台域控的话,在对应的“RefID”栏中会显示具体的时间服务器地址,如果显示“unknown”“unspecified”等字样,说明对应的DC不是时间服务器。对于拥有PDC角色的域控,以及成员服务器和客户机来说,具体的时间同步方式要根据“W32Time”服务的配置信息而定。执行“w32tm /query /configuration”命令,在返回信息中的“[TimeProviders]”栏中的“Type”行显示了同步类型(图3)。
如果显示为“Nosync”,说明该机会使用本地时间,不会进行同步。如果显示为“NTP”,说明本机从“NtpServer”行指定的外部时间服务器上同步时间。如果显示为“NT5DS”,说明会从域中的PDC上同步时间。如果显示为“AllSync”,说明本机会使用以上所有的同步方式。执行“w32tm /query /source”命令,在返回信息中显示当前的时间服务器名称。如果要查看指定域名中的时间服务器,可执行“w32tm /monitor /domain:xxx.com”命令,会显示该域中PDC主机的名称及地址信息,其中的“xxx.com”为具体的域名。执行“w32tm /tz”命令,显示本机的时区信息(图4)。
配置时间服务器
执行时间同步操作,可以通过命令行或者自动方式来实现。前面讲过,PDC主机担当着时间服务器的作用,实现域中所有主机的时间同步,因此必须保证PDC主机的时间是正确的,否则时间同步将失去意义。在默认情况下,PDC主机与微软的“time.windows.com”服务器保持时间同步。
运行“regedit.exe”程序,在注册表编辑器中打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Parameters”分支,在右侧的“NtpServer”键值名中可以查看该时间服务器地址(图5)。这里假设PDC主机的IP为192.168.1.2,那么在域中主机上执行“net time \\192.168.1.2 /set /y”命令,在弹出的提示信息中输入“y”键,可以让该机立刻和PDC主机之间进行时间同步。
当然,也可以实现时间自动同步操作。登录到PDC主机上,在域环境中,默认第一台域控承担PDC主机角色。在注册表编辑器中打开上述分支,将“NtpServer”键值名的数值修改为“dc1.xxx.com”,这里假设PDC主机的名称为“dc1.xxx.com”。将右侧的“Type”键值名的数值修改为“NTP”。这样,就禁止PDC主机使用外网的时间服务器,让域中的其余主机可以以PDC主机的时钟作为基准时间源。
打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config”分支,将右侧的“AnnounceFlags”的数值设置为10,格式为十进制。打开“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpServer”分支(图6),将右侧的“Enabled”的值设置为1。在CMD窗口中执行“w32tm /query /source”命令,显示“Local CMOS Clock”字样,说明以上设置成功(图7)。
在客户端上同步时间
为了让客户机在登录域后,自动实现时间同步操作,可以以管理员身份登录域控,打开组策略管理器(图8),在左侧选择“林→域→域名→Domain Controllers”项,在其中的“Default Domain Controllers Policy”项的右键菜单上点击“编辑”项,在编辑窗口左侧选择“计算机配置→策略→管理模板→系统→Windows时间服务→时间提供程序”项(图9),在右侧窗口双击“配置Windows NTP客户端”项,在其属性窗口(图10)中选择“已启用”项,在“NtpServer”栏中输入“dc1.xxx.com,0x1”,在“SpecialPollInterval”栏中设置同步的周期,单位为秒,例如设置为3600,表示每隔1小时同步一次。
在右侧双击“启用Windows NTP客户端”和“启用Windows NTP服务器”项,在其属性窗口中分别选择“已启用”项。在客户端执行“gpupdate /force”命令,刷新组策略,让上述配置生效。在客户机上执行“net stop w32time”和“net start w32time”命令,重启时间同步服务,就可以手动与PDC主机之间同步时间了。如果时间同步服务出现问题,可以执行“net stop w32time”“w32m /unregister”“w32m /register”“net start w32time”等命令,來修复该组件。在一般情况下,是允许域控和客户机之间存在时间差的,但不能超过5分钟。
如果业务场景对时间要求很严格,可以在域控上打开上述组策略编辑器,选择“计算机配置→策略→Windows设置→安全设置→账户策略→kerberos策略”项,在右侧双击“计算机时钟同步的最大容差”项,来设置最佳的时间差(图11)。对于很多客户端来说,可能因为种种原因没有激活“Windows Time”服务,为此可以在域控上打开默认组策略,在编辑器中打开“计算机配置→策略→Windows设置→安全设置→系统服务”项。
在右侧双击“Windows Time”,将其设置为自动启动方式(图12)。为了防止用户随意更改时间,可以在上述编辑器中打开“计算机配置→策略→Windows设置→安全设置→本地策略→用户权限分配”项,在右侧双击“更改系统时间”项,在打开窗口中显示可以更改时间的账户和组(图13),建议将其全部删除,这样可以保证域中主机之间的时间一致性。
使用专用工具,保持时间同步
使用Network Time System这款软件,也可以让内网主机的时钟保持一致。在选定的服务器上运行NTS服务器端程序,在其主界面中点击“Settings”按钮,在设置窗口中(图14)的“Internal Time Server”面板中选择“NTSv2 via UDP broadcasting”项,表示让NTS服务器程序自动向内网发送UDP对时数据包。在“every x”栏中设置自动发送对时UDP数据包的周期,默认为3分钟。
应该指出,安装NTS服务器端程序的主机应该处于联网状态,可以访问Internet,便于其从Internet上的时间服务器(也就是时间源)上取得准确的时间。在“External Time Sources”面板中可以添加新的外部时钟服务器,设置自动对时间隔等。当然,可以在局域网中部署多台NTS对时服务器。在客户机上运行NTS客户端程序,在其管理窗口中点击“Settings”按钮,在设置窗口中打开“Scheduling”面板中的“Synchronize time”项,在“every x”栏中设置同步的时间间隔,默认是2分钟。
这样,经过预设的时间间隔后,客户端即可自动和服务器端的NTS建立网络连接,进而执行时间同步操作。在“Time Source”面板中选择“Find server via UDP Boardcasting”项,表示允许接受服务器的UDP广播信息。如果在服务器端开启了UDP广播功能,客户端就可以自动执行对时操作。如果存在多台NTS服务器,可以选择“Custom server list”项,点击“Add”按钮,输入NTS服务器端地址,来将其添加到服务器列表中。