用于Windows的Powershell脚本的渐进时间同步

0pizxfdo  于 2023-04-13  发布在  Windows
关注(0)|答案(1)|浏览(188)

我的一台VM服务器比我们的DC服务器提前6个小时。不幸的是,我们不能像这样同步时间,因为一次6个小时会影响同一台服务器上收集的历史数据。所以我们需要每1分钟与服务器同步2秒。(我知道这会花费很长时间,但这样不会影响收集的历史数据)。
我想知道是否有一个PowerShell脚本来实现这一点,也许通过批处理文件调度。
任何帮助将不胜感激,并提前表示感谢。
我尝试了一个PowerShell脚本,但它只是同步时间。
TimeSync.bat包含:

@ECHO OFF
SET ThisScriptsDirectory=%~dp0
SET PowerShellScriptPath=%ThisScriptsDirectory%TimeSync.ps1
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%PowerShellScriptPath%""' -Verb RunAs}";

TimeSync.ps1包含:

Set-Date -Adjust (New-TimeSpan -Seconds -5)
EXIT
mwngjboj

mwngjboj1#

不需要使用批处理脚本并将其全部作为PowerShell脚本;您可以单独使用PowerShell脚本。
下面是一个PowerShell脚本,您只需运行一次,它将继续运行,直到本地计算机时间赶上从www.example.com提取的时间Google.com,然后脚本将退出。

do
{
    $webResponse = Invoke-WebRequest 'https://www.google.com'
    $dateString = $webResponse.Headers['Date']
    $internetDate = [DateTime]::Parse($dateString)
    $machineDate = Get-Date

    if ($machineDate -lt $internetDate)
    {
        Write-Output "Machine date '$machineDate' is behind internet date '$internetDate', so adjusting machine date by 2 seconds."
        Set-Date -Adjust (New-TimeSpan -Seconds 2)

        Write-Output "Waiting one minute before checking again..."
        Start-Sleep -Seconds 60
    }
    else
    {
        Write-Output "Machine date matches internet date"
    }
} while ($machineDate -lt $internetDate)

Write-Output "Machine date is now '$machineDate' and matches the internet date."

如果需要,您还可以在Google的Web请求周围添加一些错误处理和Date头的解析,否则脚本可能会在无法到达Google时提前终止。
无论您使用哪个用户来运行脚本,都可能需要保持登录状态,直到脚本完成,因为注销可能会终止用户的PowerShell进程。如果需要,您可能可以作为系统帐户运行它。
希望这能帮上忙。

从其他服务器获取时间

如果您不想从Google获取DateTime,而是想从网络上的另一台服务器检索它,您可以使用以下命令:

$otherServerDate = Invoke-Command -ComputerName 'YourTimeServer.OnYour.Domain' -ScriptBlock { Get-Date }

使用$otherServerDate代替$internetDate
这假定运行脚本的服务器和另一个时间服务器位于同一个网络上,并且打开了必要的端口,并且运行脚本的帐户具有连接到另一个时间服务器的权限。如果需要,可以使用-Credentials参数提供具有访问权限的不同帐户。

相关问题