Попытка собрать скрипт для автоматического обновления часового пояса - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю над сценарием 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 голосов
/ 28 сентября 2019

Я бы предложил использовать таблицу поиска Hashtable для назначенных шлюзов по умолчанию.
Поскольку вы хотите, чтобы это запускалось как сценарий запуска, вам также необходимо создать централизованный путь, в котором можно регистрировать ошибки или записывать ошибки в журнал событий Windows..

Создайте Hashtable с указанными вами IP-адресами шлюза в качестве ключа и идентификаторами часового пояса в качестве значения.

Либо непосредственно в коде:

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

, либо читая централизованноCSV-файл со столбцами «IPAddress» и «TimeZone»

$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
}
0 голосов
/ 27 сентября 2019

В ваших операторах "if" вместо оператора равенства используется оператор присваивания =, -eq.

Переключите его на If ($Gateway -eq "10.100.4.1"), и он должен работать.

PSЯ пропустил опечатку, которую вы упомянули, но оператор присваивания все еще остается проблемой.Когда в присвоении if / elsif используется оператор присваивания, он всегда возвращает $true, что было бы довольно проблематично.

...