尝试组合脚本以进行自动时区更新

时间:2019-09-27 19:44:42

标签: powershell timezone ip powershell-4.0 ntp

我正在处理Powershell脚本,它没有正确读取我的“ If,elseIf”,所以我知道我做错了。我需要一些帮助来解决这个问题。 我先拉默认网关并存储它:

$Gateway = (Get-wmiObject Win32_networkAdapterConfiguration | ?{$_.IPEnabled}).DefaultIPGateway

下一步,我尝试对它进行排序,以便如果它等于我指定的默认网关之一,它将更新时区。

If ($Gateway = "10.100.4.1") 
{
$TZ = "Central Standard Time"
}
ElseIf ($Gateway = "10.101.4.1") 
{
$TZ = "Central Standard Time"
}

我正在用

完成它
Set-TimeZone $TZ

目的是,如果我在家庭办公室对系统进行映像,然后将其运送到“远程位置”,则我将不信任最终用户来更新其时区,并且我的POS书写得不好,因此它不使用UTC / GMT,并且可能导致BOH系统等问题。

我将把它作为启动项放在系统启动时执行,以确保它始终与TZ保持最新。

更改Win 10以对TZ使用自动更新无法正常工作,原因是有原因的(请阅读:网络团队和安全团队不在意我,在这种情况下,这不是妄想症)。

那么,在哪里可以找到帮助以将其整合在一起? 编辑:我有一个错字,这就是为什么它不起作用。所以...没关系。对于那些对错字感兴趣的人,我已经将其删除。它在我的$ Gateway部分中,在{$ _。IPEnabled}之后和)之前添加了一个“

2 个答案:

答案 0 :(得分:0)

您的“ if”语句使用赋值运算符=而不是相等运算符-eq

将其切换为If ($Gateway -eq "10.100.4.1"),它应该可以工作。

P.S。我错过了您提到的错字,但是赋值运算符仍然是一个问题。在“ if / elsif”语句中使用赋值运算符时,它将始终返回$true,这将是一个很大的问题。

答案 1 :(得分:0)

我建议对指定的默认网关使用查找哈希表。
因为您希望将其作为启动脚本运行,所以还需要创建一个集中式路径,可以在其中记录错误或在Windows事件日志中写入错误。

使用指定的网关IP地址作为键,将时区ID作为值来创建哈希表。

直接在代码中

$timeZones = @{
    '10.100.4.1' = 'Central Standard Time'
    '10.101.4.1' = 'Central Standard Time'
    '10.102.4.1' = 'Eastern Standard Time'
    # etc.
}

或者通过读取带有“ IPAddress”和“ TimeZone”列的集中式CSV文件

$defaultTz = Import-Csv -LiteralPath '\\Server\Share\Folder\Timezones.csv'
$timeZones = @{}
$defaultTz | ForEach-Object {
    $timeZones[$_.IPAddress] = $_.TimeZone
}

接下来,使用这些值,如下所示(演示使用集中式错误日志文件):

$errorlog  = '\\Server\Share\Folder\TimezonesErrors.log'
$now       = (Get-Date).ToString()  # use default format or specify the date format yourself here
$currentTz = (Get-TimeZone).Id      # get the current timezone Id

# get the default gateway IPv4 address for this computer
$gw = @((Get-wmiObject Win32_networkAdapterConfiguration | Where-Object {$_.IPEnabled -and $_.DefaultIPGateway-like '*.*.*.*'}).DefaultIPGateway)[0]
# check if the gateway IP address is present in the lookup Hashtable
if ($timeZones.ContainsKey($gw)) { 
    $tz = $timeZones[$gw]
    # only set the wanted timezone if it differs from the current timezone
    if ($tz -ne $currentTz) {
        try {
            Set-TimeZone -Id $tz -ErrorAction Stop
        }
        catch {
            # add the exception to the error log 
            $msg = "$now - Error setting the timezone on computer $($env:COMPUTERNAME): $_.Exception.Message"
            Add-Content -LiteralPath $errorlog -Value $msg        
        }
    }
}
else {
    # make it known that the IP address for this gateway was not found in the Hashtable
    $msg = "$now - No timezone found for default gateway $gw on computer $($env:COMPUTERNAME)"
    # write error to the central error.log file
    Add-Content -LiteralPath $errorlog -Value $msg
}