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

Odpovědět
Uziv00

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

Příspěvek od Uziv00 »

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
Odpovědět
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Nic se nenačítá ani po resetu biosu pomocí cmos baterie
    od Bliske » » v Problémy s hardwarem
    4 Odpovědi
    6348 Zobrazení
    Poslední příspěvek od pcmaker
  • Oficiální úprava Windows 11 do podoby klasických Windows (Windows 7)
    od IMB » » v Windows 11, 10, 8...
    0 Odpovědi
    18124 Zobrazení
    Poslední příspěvek od IMB
  • Windows 7 - Instalace a praktická použitelnost Windows 7 v roce 2025
    od IMB » » v Windows 11, 10, 8...
    0 Odpovědi
    314 Zobrazení
    Poslední příspěvek od IMB
  • Windows key
    od AirCrew » » v Windows 11, 10, 8...
    9 Odpovědi
    11711 Zobrazení
    Poslední příspěvek od pcmaker
  • Windows 10 nenaběhne
    od behavioralista » » v Windows 11, 10, 8...
    7 Odpovědi
    6770 Zobrazení
    Poslední příspěvek od pcmaker

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