Ovládáme (nejen) windows pomocí visual basic script 7. díl

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13
Guru Level 13
Příspěvky: 21719
Registrován: březen 10
Pohlaví: Muž

Ovládáme (nejen) windows pomocí visual basic script 7. díl

Příspěvekod ITCrowd » 18 črc 2021 11:22

Kontrola eventlogu
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
V uvedeném případě skript prohledá eventlogy počítačů uvedených v poli PCs. Do proměnné Datum lze vložit datum, od kterého skript bude chybu hledat. nalezený pád Aplikace.exe bude vypsán a zároveň zaznamenán do logu skriptu i se síťovým jménem počítače.
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
Všimněte si:
- 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")
Tohle funguje i vzdáleně, ovšem za podmínky, že jste přihlášeni jako administrátoři a stejné administrátorské jméno a heslo je i na vzdálených počítačích. Ne vždy tomu tak ale je. V tomto případě lze kód upravit takto:

Kód: Vybrat vše

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer _
    (strComputer, "root\cimv2", strUser, strPass)
objSWbemServices.Security_.ImpersonationLevel = 3
Přičemž strUser je název účtu s admin právy, strPass je heslo k tomuto účtu.
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
Uvedený skript zakóduje váš skript do .vbe. Použití je jednoduché. Tento kód si uložte jako např. Encode.vbs. Váš skript chytnete myší a pustíte na tento skript. V adresáři s původním skriptem se pak vytvoří další, který se bude jmenovat stejně, jen přípona bude .vbe.
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
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Reklama
  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Ovládáme (nejen) windows pomocí visual basic script 1. díl
    od ITCrowd » 02 čer 2021 23:05 » v Programování a tvorba webu
    9
    2095
    od Prophet
    17 čer 2021 20:46
  • Ovládáme (nejen) windows pomocí visual basic script 2. díl
    od ITCrowd » 08 čer 2021 10:32 » v Programování a tvorba webu
    0
    630
    od ITCrowd
    08 čer 2021 10:32
  • Ovládáme (nejen) windows pomocí visual basic script 5. díl
    od ITCrowd » 03 črc 2021 09:32 » v Programování a tvorba webu
    0
    296
    od ITCrowd
    03 črc 2021 09:32
  • Ovládáme (nejen) windows pomocí visual basic script 4. díl
    od ITCrowd » 24 čer 2021 10:11 » v Programování a tvorba webu
    0
    369
    od ITCrowd
    24 čer 2021 10:11
  • Ovládáme (nejen) windows pomocí visual basic script 6. díl
    od ITCrowd » 10 črc 2021 10:49 » v Programování a tvorba webu
    0
    314
    od ITCrowd
    10 črc 2021 10:49

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 0 hostů