2015-03-12 3 views
3

ВопросДолжен ли я включать команду reboot в мой скрипт BoxStarter?

Есть ли когда-либо причина, чтобы включить if (Test-PendingReboot) { Invoke-Reboot } в сценарии BoxStarter когда $Boxstarter.RebootOk=$true объявлен?

фон

Я недавно обнаружил BoxStarter и заметил, что ряд сценариев там включить следующий код: if (Test-PendingReboot) { Invoke-Reboot }. Включает в себя эти сценарии со следующими параметрами: $Boxstarter.RebootOk=$true и $Boxstarter.AutoLogin=$true; то есть те, которым разрешено перезагружаться и продолжать по мере необходимости.

На BoxStarter site следующее заявление сделано:

Boxstarter перехватывает все шоколадная установку команды и проверяет отложенных перезагрузок. Если ожидающая перезагрузка обнаружена, Boxstarter будет перезагрузите компьютер и автоматически зарегистрируйте пользователя и возобновите установку .

NB: Я понимаю, что после внесения изменений иногда может потребоваться Invoke-Reboot, которые не будут обновлять флаг PendingReboot; например для некоторых изменений реестра вступить в силу; мой вопрос исключительно связан с использованием этой команды, когда она завернута в оператор if (Test-PendingReboot).

Update: Также попросили на Google Groups: https://groups.google.com/forum/#!topic/boxstarter/D0kiRqJyiCY

ответ

2

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

Есть моменты, когда вы, как вы помните, знаете, что требуется перезагрузка по какой-либо внешней причине, поэтому я бы сразу вызвал Invoke-Reboot, но это всегда было бы окружено какими-либо предложениями охраны, чтобы это не происходило каждый раз , так как я всегда хочу, чтобы мои скрипты повторялись.

0

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

Мы столкнулись с ситуацией, когда у «свежих чеканившихся» серверов были некоторые ожидающие переименования файлов, которые даже с несколькими перезагрузками НИКОГДА не исчезли, поэтому, если мы запустили Boxstarter, нам пришлось как можно быстрее убить CMD-окно, если мы может войти в систему между бесконечными перезагрузками.

Результирующий скрипт можно запустить из gist через Install-BoxstarterPackage -DisableReboots <gistUrl>, чтобы очистить файлы, помещенные в $ badFile (которые вы могли бы составить список).

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

Извиняется за то, что это, по-видимому, сломало подсветку синтаксиса.

Import-Module $env:appdata\Boxstarter\Boxstarter.Common 

$badSpoolReg = '\??\C:\Windows\system32\spool\PRTPROCS\x64\1_hpcpp130.dll' 
$badSpoolFile = 'C:\Windows\system32\spool\PRTPROCS\x64\1_hpcpp130.dll' 

# Next bits taken from the 'Get-PendingReboot' module on the Script Gallery. 
$Computer = $env:COMPUTERNAME 
$HKLM = [UInt32] "0x80000002" 
$WMI_Reg = [WMIClass] "\\$Computer\root\default:StdRegProv" 

## Query PendingFileRenameOperations from the registry 
$RegSubKeySM = $WMI_Reg.GetMultiStringValue($HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\","PendingFileRenameOperations") 
#$RegSubKeySM # Debug print of the list if you want to run by hand 

$RegValuePFRO = $RegSubKeySM.sValue | where { $_ } # Ignore empty values 
#$RegValuePFRO # Debug print of the list if you want to run by hand 

# Credential is required for Create-BoxstarterTask 
# Create-BoxstarterTask required to call Invoke-FromTask 
# see https://github.com/mwrock/boxstarter/issues/121 
$cred = Get-Credential 
Create-BoxstarterTask $cred 

# Perhaps could be improved using set membership comparison? 
# like (if $badSpoolReg in $RegValuePFRO.Values?) 
foreach ($path in $RegValuePFRO) { 
    if ($path -contains $badSpoolReg) { 
     write-output "Bogey on my six!" 
     Get-Service spooler | stop-service 
     Invoke-FromTask "rm -fo $badSpoolFile" # Files in "protected" paths require extra work to remove 
     $Boxstarter.RebootOk = $true # Need to enable this to allow Invoke-Reboot to work 
     Write-output "Took out the bogey, resetting system state" 
     Invoke-Reboot # Manually called but within a fairly good gate 
    } else { 
     write-output "No bogeys sighted Captain!" 
    } 
} 
Remove-BoxstarterTask 
Смежные вопросы