Ovládáme (nejen) windows pomocí visual basic script 6. 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: 21720
Registrován: březen 10
Pohlaví: Muž

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

Příspěvekod ITCrowd » 10 črc 2021 10:49

Visual Basic Script a registry
Málokterý uživatel wokenních systémů se nikdy nesetkal s pojmem registry. Jde o registrační databázi systému, ve které jsou uloženy veškeré informace nutné pro správný běh OS. Registry jsou náhradou původních textových souborů .ini používaných v systémech windows až do windows 95.
Všechna nastavení systému, ať už je to formou zatržítek v různých nastavovacích dialozích, popřípadě konfiguračních programů třetích stran se nějakým způsobem promítnou do registrů. A samozřejmě existují i "skrytá" nastavení, která jiným způsobem, než přímým zásahem do registrů, nastavit nelze.
Upozornění: Důrazně varuji před neodbornými zásahy do registrů, zejména pak před oblíbenou metodou pokus - omyl. Zásah do registrů může být pro systém smrtící. Vždy je třeba vědět co dělám, proč to dělám, jaký vliv to bude mít na funkci systému a o jaké funkce tímto zásahem přijdu.
Snad každý pokročilý uživatel už do registrů "šáhnul". V tomto díle si ukážeme, jak nám může pomoci VBS. Někteří z vás si možná řeknou, že použití VBS je zbytečné, když stačí spusti regedit a hodnotu si změnit. Tohle samozřejmě platí, ale pro jeden, a to váš počítač. Síla VBS spočívá v tom, že s registry dokáže pracovat vzdáleně. Nemusím tedy být fyzicky přítomen u pc se systémem, jehož vlastnost, danou klíčem registru potřebuji zjistit.

Načtení hodnoty z registru:

Kód: Vybrat vše

'*****************************************************
'* Script načte údaje hodnot "inactivitytimeoutsecs" *
'*                 a "EnableLUA"                     *
'*       PC z IP adresy v proměnné strComputer       *
'*          Etienn@Script v. 1.0 (c)202002           *
'*****************************************************

Option Explicit
Dim strComputer, strKeyPath, strDWORDValueName, strDWORDValueName2
Dim strValue, strValue2, oReg
Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "192.168.0.100"

strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
strDWORDValueName = "inactivitytimeoutsecs"
strDWORDValueName2 = "EnableLUA"
 
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\default:StdRegProv")
 
oReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strDWORDValueName, strValue
oReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strDWORDValueName2, strValue2

MsgBox "     " & strDWORDValueName & " = " & strValue & vbCrLf & vbcrlf & "     " & _
strDWORDValueName2 & " = " & strValue2, vbOKOnly + vbInformation,  "Hodnoty registru"

Set oReg = Nothing

V uvedeném příkladu skript získává dvě hodnoty ze vzdáleného počítače. Hodnota "inactivitytimeoutsecs" ukazuje, zda je povolen spořič, popřípadě po jakém čase neaktivity se spustí.
Hodnota "EnableLUA" obsahuje informaci o nastavení UAC.

Zápis hodnot do registru:

Kód: Vybrat vše

'*********************************************************
'* Script vytvoří nový klíč v registrech na pracovištích *
'*               a nastaví jeho hodnotu                  *
'*  & Pole "prac" může obsahovat libovolný počet pc &    *
'*                                                       *
'*                 Etienn@Script v. 1.0                  *
'*********************************************************
' INFO - http://msdn.microsoft.com/en-us/library/Aa393664
'========================================================
'            HODNOTY ZÁKLADNÍCH KLÍČŮ
'--------------------------------------------------------
' HKEY_CLASSES_ROOT (2147483648 (0x80000000))
' HKEY_CURRENT_USER (2147483649 (0x80000001))
' HKEY_LOCAL_MACHINE (2147483650 (0x80000002))
' HKEY_USERS (2147483651 (0x80000003))
' HKEY_CURRENT_CONFIG (2147483653 (0x80000005))
' HKEY_DYN_DATA (2147483654 (0x80000006))
'========================================================
'           PŘÍKAZY PRO NASTAVENÍ HODNOT
'--------------------------------------------------------
'  SetBinaryValue    
'  SetDWORDValue    
'  SetExpandedStringValue    
'  SetMultiStringValue    
'  SetQWORDValue    
'  SetSecurityDescriptor    
'  SetStringValue
'========================================================

 Option Explicit
  Dim prac, i
  Dim zprava, titl, pc, tlacitko, novyKey, oReg
  const HKLM = &H80000002
   
  prac = Array ("192.168.0.100", "192.168.0.101", "192.168.0.102")
  novyKey = "SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\Aplikace.exe"
   
For Each pc In prac   
  zprava = "Opravdu chcete zapsat klíč " & pc & "?"
  titl = "Upozornění!"
  tlacitko = MsgBox (zprava, vbQuestion + vbYesNo + vbDefaultButton2, titl)
  If tlacitko = vbYes Then   
     'vytvoření a nastavení objektu pro pracoviště
     Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
    pc & "\root\default:StdRegProv")
     oReg.CreateKey HKLM, novyKey
     oReg.SetExpandedStringValue HKLM, novyKey, "DumpFolder", "C:\ProcDump"
     oReg.SetDWORDValue HKLM, novyKey, "DumpCount", 5
     oReg.SetDWORDValue HKLM, novyKey, "DumpType", 2   
   
        If Err.Number <> 0 Then WScript.Echo "Nepodařilo se dostat na pracoviště" & pc
  Set oReg = Nothing
  Err.Number = 0
  End If
Next

Skript byl vytvořen pro vzdálený zápis do registrů pracovišť, na kterých běží "padavá" Aplikace.exe. Pokud na takto "ošetřeném" systému Aplikace.exe vyvolá pád (klasická hláška Program přestal pracovat...), pak než systém aplikaci odstraní z paměti, dojde k výpisu paměti do dump souboru a uložení na disk. Programátor (vývojář) pak na základě chybového výpisu může zjistit, co bylo špatně.
Všimněte si:
- použití cyklu For .. Each umožňuje vložit do pole prac libovolný počet pracovišť. Cyklus proběhne právě tolikrát, kolik je v poli prac prvků.
- zachycení chyby při neúspěchu pomocí Err.Number

Mazání klíče:
V předchozích příkladech jste si všimli metod oReg.Get pro získání hodnoty klíče a metody oReg.Set pro nastavení hodnoty klíče (případně pro vytvoření klíče). Pro smazání klíče existuje metoda oReg.DeleteKey. Touto metodou lze smazat pouze klíč, který neobsahuje podklíče. Nicméně se z klíče smazou všechny hodnoty a data.

Připomínka: na přístup ke klíčům registru a jejich změnu je třeba mít patřičná práva.

A opět jeden příklad z praxe: Máme počítače, které jsou sdílené a jsou v doméně. Kařdý uživatel se přihlašuje doménovým účtem. Každý z uživatelů používá OneNote. Soubory OneNote jsou na síťovém disku.
OneNote ve výchozím nastavení tvoří složku záloh. Toto nastavení lze vypnout přímo v OneNote. Co je ale nedokumentovaná funkce je to, že si OneNote ukládá na lokální disk do profilu uživatele zálohy všech souborů, které jsou v OneNote použity (videa, dokumenty, atd.). Při velikosti OneNote souborů na disku 10GB se tedy na lokálním disku vytvoří záloha o velikosti 10GB + další záloha souborů videí a dokumentů (záleží na tom, co uživatel otevře), dejme tomu 5GB. To je tedy 15GB na jednoho uživatele. A pokud na tomto počítači pracuje 20 uživatelů, rychle se dostaneme přes limit klasického nejpoužívanějšího SSD - 256GB. A následuje zpomalení systému a neustálé hlášky o nedostatku místa na disku. A práce pro správce, který musí tyto zálohy odmazávat. A aby to bylo ještě složitější, na pracovištích jsou různé verze MS Office, tedy i různé verze OneNote.
I toto lze řešit skriptem:

Kód: Vybrat vše

'*********************************************
'*            Odhlašovací skript             *
'*********************************************
'* Zakazuje zálohy OneNote na lokálním disku *
'*   Maže vytvořené zálohy a cache Onenote   *
'*********************************************
'*     Etienn@Script v. 1.0  (c)2019-03      *
'*********************************************

Option Explicit
Dim  WshShell, strPath, prikaz, fso, pathProfil
 
' Nastavení Disable Backup pro OneNote
Dim oReg, strKey, strKey2, strValueName, strValue

Const HKCU = &H80000001
strKey2 = "\OneNote\Options\Save"
strValueName = "BackupEnableAutoBackup"
strValue = 0    '0=disable backup, 1=enable backup

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
'On Error Resume Next

'Klíč pro Office 2010
strKey = "Software\Microsoft\Office\14.0"
If oReg.EnumKey(HKCU, strKey) = 0 Then
  oReg.SetDWORDValue HKCU, strKey & strKey2, strValueName, strValue
End If

'Klíč pro Office 2013
strKey = "Software\Microsoft\Office\15.0"
If oReg.EnumKey(HKCU, strKey) = 0 Then
  oReg.SetDWORDValue HKCU, strKey & strKey2, strValueName, strValue
End If

'Klíč pro Office 2016
strKey = "Software\Microsoft\Office\16.0"
If oReg.EnumKey(HKCU, strKey) = 0 Then
  oReg.SetDWORDValue HKCU, strKey & strKey2, strValueName, strValue
End If

'Odmazání záloh a cache
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
pathProfil = WshShell.ExpandEnvironmentStrings("%USERPROFILE%")

'Office 2010
strPath = pathProfil & "\AppData\Local\Microsoft\OneNote\14.0"
If (fso.FolderExists(strPath)) Then
  fso.DeleteFolder strPath, True
End If

'Office 2013
strPath = pathProfil & "\AppData\Local\Microsoft\OneNote\15.0"
If (fso.FolderExists(strPath)) Then
  fso.DeleteFolder strPath, True
End If

'Office 2016
strPath = pathProfil & "\AppData\Local\Microsoft\OneNote\16.0"
If (fso.FolderExists(strPath)) Then
  fso.DeleteFolder strPath, True
End If

Set fso = Nothing
Set oReg = Nothing 
Set WshShell = Nothing

Skript je spouštěn po odhlášení uživatele.
V první části prohledá registr na přítomnost klíčů OneNote, a pokud existuje odpovídající klíč, nastaví hodnotu "BackupEnableAutoBackup" na hodnotu "0", tím zakáže vytvoření záloh.
V druhé části kontroluje složku OneNote, kde jsou vytvářeny zálohy a bez milosti ji maže.
Nevýhodou je, že si OneNote při každém spuštění musí načítat všechny soubory znovu ze sítě, což je mírné časové zdržení. Výhodou je, že není třeba kupovat SSD s vyšší kapacitou.

V příštím (a posledním díle) se podíváme na vzdálenou kontrolu eventlogu pomocí VBS, kontrolu běhu služeb a vázané spouštění aplikace na spuštěnou službu.

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 7. díl
    od ITCrowd » 18 črc 2021 11:22 » v Programování a tvorba webu
    0
    293
    od ITCrowd
    18 črc 2021 11:22
  • 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

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ů