Archiv pro štítek: script

Windows Server 2008 Core: aktualizace

K vyhledání aktualizací, jejich stažení a instalaci jsem použil skript WUA_SearchDownloadInstall.vbs uvedený na stránkách Microsoftu, viz Searching, Downloading, and Installing Updates.

Další užitečné informace jsem čerpal na Four ways to patch Windows Server 2008 Core Edition

Skript samotný používá aktualizačního agenta (Windows Update Agent – WUA) ve všech krocích od vyhledání až po instalaci aktualizací. Nejprve jsou aktualizace vyhledány a zobrazí se jejich seznam. Dále je vytvořena sada aktualizací ke stažení a aktualizace jsou stahovány. Poté je vytvořena sada připravena k instalaci a poschválení je instalace spuštěna. Pro vyhledání určité aktualizace slouží další skript WUA_SpecificUpdate.vbs, viz Searching, Downloading, and Installing Specific Updates.

Poznámky:

  • na serveru musí být aktivní WUA,
  • pokud je vyžadován restart počítače, tato informace se vypíše jako reakce skriptu,
  • skript spustíme takto:

cscript WUA_SearchDownloadInstall.vbs
Výpis použitého kódu, jak je uveden na MSDN:

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()

WScript.Echo "Searching for updates..." & vbCRLF

Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software'")

WScript.Echo "List of applicable items on the machine:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next

If searchResult.Updates.Count = 0 Then
	WScript.Echo "There are no applicable updates."
	WScript.Quit
End If

WScript.Echo vbCRLF & "Creating collection of updates to download:"

Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> adding: " & update.Title
    updatesToDownload.Add(update)
Next

WScript.Echo vbCRLF & "Downloading updates..."

Set downloader = updateSession.CreateUpdateDownloader()
downloader.Updates = updatesToDownload
downloader.Download()

WScript.Echo  vbCRLF & "List of downloaded updates:"

For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    If update.IsDownloaded Then
       WScript.Echo I + 1 & "> " & update.Title
    End If
Next

Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 

For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title
       updatesToInstall.Add(update)
    End If
Next

WScript.Echo  vbCRLF & "Would you like to install updates now? (Y/N)"
strInput = WScript.StdIn.Readline
WScript.Echo 

If (strInput = "N" or strInput = "n") Then
	WScript.Quit
ElseIf (strInput = "Y" or strInput = "y") Then
	WScript.Echo "Installing updates..."
	Set installer = updateSession.CreateUpdateInstaller()
	installer.Updates = updatesToInstall
	Set installationResult = installer.Install()

	'Output results of install
	WScript.Echo "Installation Result: " & _
	installationResult.ResultCode
	WScript.Echo "Reboot Required: " & _
	installationResult.RebootRequired & vbCRLF
	WScript.Echo "Listing of updates installed " & _
	 "and individual installation results:" 

	For I = 0 to updatesToInstall.Count - 1
		WScript.Echo I + 1 & "> " & _
		updatesToInstall.Item(i).Title & _
		": " & installationResult.GetUpdateResult(i).ResultCode
	Next
End If

Takto se v případě nalezených aktualizací vypisují reakce skriptu:

Searching for updates...
List of applicable items on the machine:
1> Aktualizace systému Windows Server 2008 (KB970430)
2> Aktualizace systému Windows Server 2008 (KB971737)
Creating collection of updates to download:
1> adding: Aktualizace systému Windows Server 2008 (KB970430)
2> adding: Aktualizace systému Windows Server 2008 (KB971737)
Downloading updates...

List of downloaded updates: 1> Aktualizace systému Windows Server 2008 (KB970430) 2> Aktualizace systému Windows Server 2008 (KB971737) Creating collection of downloaded updates to install: 1> adding: Aktualizace systému Windows Server 2008 (KB970430) 2> adding: Aktualizace systému Windows Server 2008 (KB971737) Would you like to install updates now? (Y/N) y Installing updates... Installation Result: 2 Reboot Required: True Listing of updates installed and individual installation results: 1> Aktualizace systému Windows Server 2008 (KB970430): 2 2> Aktualizace systému Windows Server 2008 (KB971737): 2

Výsledky instalace uvedené ve skriptu: 2 – success

Přepočet času UTC na aktuální místní čas CET nebo letní CEST

Údaje o čase jsou v databázích SCOMu zapisované ve světovém univerzálním čase UTC, výjimkou je databáze OperationsManagerAC, která může časové údaje zaznamenávat buď ve formátu UTC nebo při instalaci zvolíme místní časové pásmo CET (tj. UTC+1). To je výhodné, pokud jsou v databázi všechny záznamy od serverů z jednoho časového pásma. Druhou výhodou je, že se nemusíme starat o změny při přechodu na letní čas a zpět.

CET   ->   CEST   ->   CET
nebo (UTC + 1   ->   UTC + 2   ->   UTC + 1)

V reportech, které vytvářím pomocí Visual Studia (SQL Server Bussines Inteligence Development Studio) můžeme zajistit ve výstupu přepočet časových údajů na aktuální čas našeho pásma CET (central european time, UTC+1) i v době platnosti letního času CEST (central european summer time, UTC+2) použitím kódu Visual Basic. Po zjištění aktuálního času v UTC je skriptem přidána jedna hodina nebo dvě hodiny v době platnosti letního času:


PublicFunction DateTimeUTC2Local(ByVal od As String) As Date 

Dim offset, i As Integer
Dim startDST, endDST As Date
Dim nd As String
offset = 1
' find last Sunday in March
For i = 31 To 25 Step -1
  If Weekday( "3/" & i & "/" & Year(od)) = 1 Then
    startDST = DateAdd("h", 1, CDate("3/" & i & "/" & Year(od)))
    Exit For
  End If
Next
' find last Sunday in October
For i = 31 To 25 Step -1
  If Weekday( "10/" & i & "/" & Year(od)) = 1 Then
    endDST = DateAdd("h", 1, CDate("10/" & i & "/" & Year(od)))
    Exit For
  End If
Next
' add hour to offset if within DST
If CDate(od) >= startDST And CDate(od) < endDST Then
  offset = offset + 1
End If
nd = DateAdd("h", offset, od)
Return nd
End Function

Použití kódu VBS v nástroji SQL Server Bussines Inteligence Development Studio:

Pokračujeme konfigurací z nabídky Report | Report Properties. Zde na záložce General vyplníme popis reportu (autor, popis). Na záložce Code vložíme kód, který použijeme při přepočítávání časového údaje:

Pro použití kódu v reportu, v poli které z databáze vybere čas ve formátu UTC, vypočítáme platný místní čas CET / CEST takto:
například čas, získaný dotazem z databáze OperationsManager ve sloupci Alert.TimeRaised – ve výstupním formuláři použijeme v příslušném sloupci následující výraz pro výpočet (Expression) s uvedením výše definované funkce:
=Code.DateTimeUTC2Local(Fields!TimeRaised.Value)


ReportBuilder

Potřebujeme-li podobnou funkčnost reportu zajistit také z editačního prostředí nástroje ReportBuilder, nemůžeme použít vlastní kód (alespoň mi to není známo – použití ReportBuilderu verze 2.0 a 3.0 jsem ještě nezkoumal).

Kód musíme napsat přímo do formátovacího pole, implementace výše uvedeného algoritmu by byla příliš složitá, proto postupuji takto:

  1. zjistím datum přechodu na letní čas a zpět pro aktuální období pro data v databázi,
  2. v příslušném sloupci při vytváření vzorce pro výpočet uvedu vzorec.
    Příklad: vstupní čas (LogonTime) je ve formátu UTC,
    přechod z letního času CEST na standardní CET je poslední neděli v říjnu v 1:00 hodin UTC,
    přechod na letní času CEST ze standardního CET je poslední neděli v březnu ve 3:00 hodin UTC, definice výrazu je tedy pro současné období:

 


IF(LogonTime < DATETIME(2010;10;31;1;0;0);
   DATEADD(HOUR;2;LogonTime); //přidat 2 hodiny, letní čas CEST
   IF(LogonTime < DATETIME(2011;3;27;1;0;0);
      DATEADD(HOUR;1;LogonTime); //přidat 1 hodiny, standardní čas CET
      DATEADD(HOUR;2;LogonTime) //přidat 2 hodiny, letní čas CEST
   )
)