V eventlogu jsou důležité události týkající se systému. VBS umí "projít" eventlog a najít událost vázanou k alikaci, kterou sledujeme. Pochopitelně ne vždy máme čas na to, abychom procházeli eventlog ručně. VBS tohle udělá za nás. A umí to i vzdáleně.
Kód: Vybrat vše
Option Explicit
Dim PCs, Datum, fso, LogFile, cesta, txtStream, strComputer, colItems
Dim Vypis, radek, oWMI, objEvent
PCs = Array ("192.168.0.100","192.168.0.101","192.168.0.102")
' /\/\/\/\/\/ ZDE vyplnit datum od kterého se hledá /\/\/\/\/\/\/
Datum = 20210201
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
cesta = "C:\ErrLogLog\"
If (Not fso.FolderExists(cesta)) Then fso.CreateFolder(cesta)
LogFile = "C:\ErrLog\Errors.txt"
Set txtStream = fso.OpenTextFile(LogFile, 8, True) ' 1 = pro čtení, 2 = pro zápis, 8 = rozšíření
' error control block
For Each strComputer In PCs
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colItems = oWMI.ExecQuery _
("Select * from Win32_NTLogEvent Where logfile='Application' and Type='Chyba' and SourceName='Application Error'")
For Each objEvent in colItems
If InStr(objEvent.Message, "Aplikace.exe") Then
If Datum <= CLng(mid(objEvent.TimeWritten,1,8)) Then
Vypis = Vypis & objEvent.ComputerName & ": " & mid(objEvent.TimeWritten,1,8) & " " & mid(objEvent.TimeWritten,9,6) & vbCrLf
radek = objEvent.ComputerName & ": " & mid(objEvent.TimeWritten,1,8) & " " & mid(objEvent.TimeWritten,9,6)
txtStream.WriteLine radek
End If
End If
Next
Next
txtStream.WriteLine vbCrLf
WScript.Echo Vypis
Set fso = Nothing
Set txtStream = Nothing
Set oWMI = Nothing
Spuštění programu vázaného na běh služby
Obslužný prohram pro řízení technologií je závislý na běhu služby. Není proto žádoucí, aby byl spuštěn dříve, než běží služba. Uvedený skript před spuštěním aplikace zkontroluje, zda služby běží.
Kód: Vybrat vše
Control
' spouštění pravého panelu
strPath = WshShell.SpecialFolders("Desktop")
prikaz = strPath & "\Aplikace.lnk"
WshShell.Run prikaz
WScript.Sleep 10500
Set objNetwork = Nothing
Set WshShell = Nothing
Set fso = Nothing
'———————————————————————————————————————————————————————————————
' Funkce zobraz na určitý počet sekund
'———————————————————————————————————————————————————————————————
'Příklad zadání: (sekundy, "Zpráva", ikona, "Titulek"
' Zobraz 5, "Toto okno se zavře samo", 64, "Zpráva OK"
Sub Zobraz(Seconds, Message, Ikona, Titulek)
Dim objFuncShell
If IsEmpty(objFuncShell) Then Set objFuncShell = CreateObject("wscript.shell")
objFuncShell.Popup Message, Seconds, Titulek, Ikona + 4096
End Sub
'———————————————————————————————————————————————————————————————
' Funkce kontroly běhu služby
'———————————————————————————————————————————————————————————————
Sub Control
Dim strComputer, objWMIService, a, cservices, objService
Dim txtStream, radek, ForAppend, cesta
Const LogFile = "C:\ScriptLog\PanelStarter.txt"
ForAppend = 8
' nastavení objektů k přístupu k síti a souboru'
Set objNetwork = WScript.CreateObject("WScript.Network")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
' adresar existuje? If not - create
cesta = "C:\ScriptLog\"
If (Not fso.FolderExists(cesta)) Then fso.CreateFolder(cesta)
' objekt pro přístup k log souboru
Set txtStream = fso.OpenTextFile(LogFile, ForAppend, True)
' Zápis prvního řádku do logu
radek = "Start systému - " & WeekdayName(Weekday(Now()), False, 1) & _
", " & Date & ", " & Time & ", " & objNetwork.ComputerName
txtStream.WriteLine ""
txtStream.WriteLine radek
On Error Resume Next ' nereaguj na chyby
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
a = 1
Do Until a = 5
Set cservices = objWMIService.ExecQuery("Select * from Win32_Service Where Name LIKE 'Control_%'")
For Each objService in cRCSservices
'Wscript.Echo objService.Name & VbTab & objService.State
' txtStream.WriteLine Time & vbTab & objNetwork.ComputerName
txtStream.WriteLine Time & vbTab & objService.Name & VbTab & objService.State
If objService.State <> "Running" Then
' WScript.Echo "Neběží"
Else
' WScript.Echo "Běží"
Exit Do
End If
Next
a = a + 1
For i = 6 To 2 Step -2
Zobraz 2, "Čekáme na spuštění služby " & i & " sekund", 0, "Spouštění Aplikace"
Next
Loop
txtStream.Close
Set objWMIService = Nothing
End Sub
- použití subrutiny (vlastní funkce) pro kontrolu služby.
- ("Select * from Win32_Service Where Name LIKE 'Control_'") podobnost s sql dotazem - zde bude v kolekci jakákoli služby, jejíž název začíná Control_
- skrip loguje svou činnost
- subrutina Zobraz v podstatě MsgBox bez interakce - okno po určeném počtu sekund zmizí
Uvedený postup lze použít na vázané spouštění programu v závislosti na běžícím procesu. Podobné téma bylo řešeno zde: viewtopic.php?f=39&t=215143
Nebo: viewtopic.php?f=46&t=53038 spouštění na základě licenčního souboru.
Některé fičůrovinky:
Určitě jste si všmli, že skripty užívající WMI (Windows Management Instrumentation) používají pro inicializaci WMI kód:
Kód: Vybrat vše
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Kód: Vybrat vše
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer _
(strComputer, "root\cimv2", strUser, strPass)
objSWbemServices.Security_.ImpersonationLevel = 3
Upozornění: - důrazně varuji před zadáním hesla přímo do skriptu, protože pouhým zobrazením skriptu lze získat přístupy. Buď si vyžádejte přístupové pomocí Input, nebo si napište funkci, která tyto přístupy vypočítá. Osobně používám funkci a ještě VBS skrip zakóduji do vbe.
Zakódování skriptu:
Kód: Vybrat vše
Option Explicit
dim oEncoder, oFilesToEncode, file, sDest
dim sFileOut, oFile, oEncFile, oFSO, i
dim oStream, sSourceFile
set oFilesToEncode = WScript.Arguments
set oEncoder = CreateObject("Scripting.Encoder")
For i = 0 to oFilesToEncode.Count - 1
set oFSO = CreateObject("Scripting.FileSystemObject")
file = oFilesToEncode(i)
set oFile = oFSO.GetFile(file)
Set oStream = oFile.OpenAsTextStream(1)
sSourceFile=oStream.ReadAll
oStream.Close
sDest = oEncoder.EncodeScriptFile(".vbs",sSourceFile,0,"")
sFileOut = Left(file, Len(file) - 3) & "vbe"
Set oEncFile = oFSO.CreateTextFile(sFileOut)
oEncFile.Write sDest
oEncFile.Close
Next
Upozornění: Takto zakódovaný skript je řešením pouze pro BFU. Pro zkušeného uživatele není problém skript rozkódovat a kód si přečíst.
Spuštění skriptu s vyššími právy:
Kód: Vybrat vše
' run vbs as admin
' Musí být spouštěn z lokálního disku
' Při spuštění NESMÍ! běžet další instance wscript.exe
Option Explicit
'********************************
' Vlastní rutina
If Not WScript.Arguments.Named.Exists("elevate") Then
CreateObject("Shell.Application").ShellExecute WScript.FullName _
, """" & WScript.ScriptFullName & """ /elevate", "", "runas", 1
WScript.Quit
End If
'*********************************
' Zde vložit svůj kód
Dim strComputer, objWMIService, txt, Result
Dim cService, objService, Shell
strComputer = "."
txt = ""
'On Error Resume Next 'nereaguj na chyby
'vytvoření a nastavení objektu pro práci s WMI
Set objWMIService = GetObject("winmgmts:" _
& "\\" & strComputer & "\root\cimv2")
'zjištění stavu služeb a pokus o start
Set cService = objWMIService.ExecQuery("Select * from Win32_Service Where Name = 'Spooler'")
For Each objService in cService
txt = txt & objService.DisplayName & ", " & objService.Name & ", " & objService.State & vbCrLf & vbCrLf
If objService.State = "Stopped" Then
Result = objService.StartService()
End If
Next
Set cService = Nothing
Set objWMIService = Nothing
WScript.Echo txt
WScript.Echo Result
U tupých woken 10 jsem se setkal se zvláštním úkazem - i přesto, že mám admin práva a můžu službu (zde spooler.exe "Služba zařazování tisku") klidně spustit ručně, skriptem to nejde. Z nějakého mrkvosoftího důvodu. Předchozí systémy tento problém neměly.
A jak už to tak bývá, tam, kde přibude zámek, vymyslí se další klíč, jak to obejít. Princip je spuštění skriptu s parametrem, který zajistí vyšší práva. Zde zajistí rutina mezi If a End If.
WScript.Echo txt vypíše stav služby
WScript.Echo Result vrátí výsledek operace spuštění služby. Pokud je vše korektní, vrací "0". Pokud nemáte oprávnění, vrací "2". Skript sám žádnou hlášku nevypíše, o to hůř se to hledá.
Závěr: Tento miniseriál si neklade za cíl vychovat nové programátory, ani administrátory. Stejně tak neukazuje, jak vytvořit ideální kód. Chtěl jsem vás jen seznámit s možnými cestami řešení problémů, které jsem potkal za svou cestu se systémy windows. Navíc se domnívám, že VBScript patří mezi nedoceněné nástroje systému Windows a je jen ke škodě uživatelů, že jej neumí využít. Výběr skriptů byl proto volen tak, aby ukázal možnosti a způsoby práce se skripty.
Zároveň ukazuje, že ne vždy je nutno používat řešení třetích stran, ale postačí minimální znalosti VBS a chování windows lze upravit přímo nástroji ve windows.
Co vám může pomoci?
- stránky microsoftu. Dle mě obsahují tolik informací, že se zde začátečník spíše ztratí. Osobně nepoužívám.
- stránky https://www.devguru.com/content/technologies/vbscript/
- stránky https://stackoverflow.com/
- kniha pro úplné začátečníky Skriptujeme operace na PC pomocí Microsoft Windows Script Host 2.0. Obsahuje i kódy v javaskriptu. https://www.martinus.cz/?uItem=6166
- kniha Microsoft Windows Server 2003 Skripty https://www.martinus.cz/?uItem=39059
- kniha Microsoft Visual Basic Scripting Příručka programátora IE (a ostatní prohlížeče) vbs už nepodporují, nicméně je zde velmi pěkně popsána práce s proměnnými, řetězci a poli. https://knihy.abz.cz/prodej/microsoft-v ... ogramatora
- kniha Automatizace správy a skriptování Microsoft Windows https://www.martinus.cz/?uItem=126519
- nápověda programu VbsEdit
- a samozřejmě na spoustu řešení ukáže strejda gůgl.
Přeji hodně úspěchů při psaní vlastních skriptů. A neváhejte se zeptat, budete-li potřebovat poradit.
Odkazy:
Ovládáme (nejen) windows pomocí visual basic script 1. díl
Ovládáme (nejen) windows pomocí visual basic script 2. díl
Ovládáme (nejen) windows pomocí visual basic script 3. díl
Ovládáme (nejen) windows pomocí visual basic script 4. díl
Ovládáme (nejen) windows pomocí visual basic script 5. díl
Ovládáme (nejen) windows pomocí visual basic script 6. díl
Ovládáme (nejen) windows pomocí visual basic script 7. díl