none
Skript pro zjištění verze nainstalovaného Service Packu

    Dotaz

  • Dobrý den, potřebovali bychom zjistit z počítačů nainstalovanou verzi Service Packu u počítačů, které nejsou vidět ve WSUSu. Podařilo se mi zjistit, jak se dostat k potřebné informaci z registrů, ale problém nastane, pokud počítač není zapnutý (nelze na něj pingnout). Jestli máte někdo možnost ten skript otestovat v síti a zjistit kde jsem udělal chybu, byl bych moc rád.

    Zde je skript:

     

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "OUTPUT=C:\sp3.csv"
     :NEXT
     FOR /F "tokens=* delims=" %%I IN (%1) DO (
     SET "CMP=%%I"
     SET "STR=\\%CMP%\HKLM\Software\Microsoft\Windows NT\CurrentVersion"
     ECHO %CMP%
     PING -n 1 -w 200 %CMP% > NUL
     IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 (FOR /F "tokens=1-20 delims=" %%x IN ('reg query "%STR%" /v ProductName ^| find "ProductName"') DO (
     SET "ProductName=%%x")
     IF "%ProductName%" equ "    ProductName    REG_SZ    Microsoft Windows XP" GOTO XP
     GOTO NotXP
     )
     
     :XP
     FOR /F "tokens=1-14 delims=" %%y IN ('reg query "%STR%" /v CSDVersion ^| find "CSDVersion"') DO (SET "CSDVersion=%%y")
     IF "%CSDVersion%" equ "    CSDVersion    REG_SZ    Service Pack 1" GOTO NotSP3
     IF "%CSDVersion%" equ "    CSDVersion    REG_SZ    Service Pack 2" GOTO NotSP3
     IF "%CSDVersion%" equ "    CSDVersion    REG_SZ    Service Pack 3" GOTO SP3
     GOTO NEXT
     
     :NotXP
     ECHO NotXP
     SET "REPORT=%CMP%;Není OS Win XP"
     ECHO %REPORT% >> %OUTPUT%
     GOTO NEXT
     
     :SP3
     ECHO SP3
     SET "REPORT=%CMP%;SP3 Nainstalován"
     ECHO %REPORT% >> %OUTPUT%
     GOTO NEXT
     
     :NotSP3
     ECHO NotSP3
     SET "REPORT=%CMP%;SP3 Nenainstalován"
     ECHO %REPORT% >> %OUTPUT%
     GOTO NEXT
     
     :Err
     ECHO Error
     SET "REPORT=%CMP%;PC je nedostupné"
     ECHO %REPORT% >> %OUTPUT%
     GOTO NEXT
     
     :End
     ECHO End
    )

    pátek 23. dubna 2010 6:36

Odpovědi

  • rozdel a panuj.

    Udelej si jeden script co parsuje textovy soubor a vola druhy script  s parametrem (ziskamym parsovanim) - tusim je to jmeno pocitace. Bude se ti MNOHEM LEPE debugovat

    k delayed expansion (velmi zjednodusene): jde o to ze pokud mas blok programu v RAMCI KTEREHO menis hodnotu nejakych promennych (ted nemyslim vysledkt z "for"-u) tak se jejich obsah nevycisluje na radku na kterem se provadi manipulace s promennou ale ve vstupu do bloku.

    MP

    pátek 23. dubna 2010 12:19
    Moderátor

Všechny reakce

  • Ahoj,

    nebylo by to lepsi delat pres WMI(c)?

    wmic /node:POCITACXY os get version, servicepackmajorversion
    

    jak snadne, mily Watsone

    MP

    pátek 23. dubna 2010 7:07
    Moderátor
  • Bohužel asi nebylo, protože některé počítače ve vzdálených lokalitách nepřebírají nastavení GPO a firewallu a nefungují nám tam některé věci. Již jsme to sice pořešili, ale nemám jistotu, že to skutečně ve všech případech funguje, proto bych raději volil cestu takovéhoto skriptu. Skript který jsem zde vypsal funguje na jednom PC, ale krachne, když dojde na PC které není zapnuté.
    pátek 23. dubna 2010 7:36
  • Nie je možné použiť Microsoft Baseline Security Analyzer ?
    pátek 23. dubna 2010 8:09
  • U těch PC kde to potřebujeme zjistit právě ne. Kvůli problémům s neaplikováním politik není otevřený port 135. Asi jediná možnost která funguje je vzdáleně ty informace vycucat z registru. Potřeboval bych pomoci doladit ten skript.
    pátek 23. dubna 2010 10:44
  • na jakem OS skript spoustis? Ping ma (dle verze) problem s vracenim errorlevel takze doporucuji ping | find /i "TTL"

    MP

    pátek 23. dubna 2010 10:48
    Moderátor
  • Pouštím to na Win7 Professional EN 32-bit.
    pátek 23. dubna 2010 10:58
  • Tam snad ping funguje spravne

    co presne ma vyhodnocovat "IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 ..."?

    podminka "if Errorlevel 0" je prece splnena vzdy, mrkni do napovedy

    ERRORLEVEL number Specifies a true condition if the last program run
         returned an exit code equal to or greater than the number
         specified.

    MP

    pátek 23. dubna 2010 11:02
    Moderátor
  • To bylo spíš jen pro jistotu, našel jsem to někde na netu. Problém bude možná někde v těch závorkách, protože se mi to buď zacykluje nebo to krachne.
    pátek 23. dubna 2010 11:09
  • nic nezavorkuj.pouzij (jestli chapu zamer)

    if errorlevel 1 goto end (pokud dojke k chybe prerus zpracovani)

    pak uz muzes jet celkem bez zavorek

    MP

    P.S. Pouzivas promenne. Doporucil bych delayed variable expansion a tedy ! misto %

    pátek 23. dubna 2010 11:12
    Moderátor
  • K čemu je to delayed variable expansion dobré?

    Skript jsem upravil, ale po pingu to vždy skočí na konec. V souboru s PC které má skript otestovat mám 3 kusy. PC na němž jsou XP SP2, moje PC a PC které je vypnuté.

    Nevím proč, ale při spuštění skriptu se vypíše jenom název PC které je v seznamu poslední (to vypnuté).

    K:\Scripts\CMD>sp_1.bat test.txt
    1
    2
    3
    gilarm
    End

    K:\Scripts\CMD>

     

    Skript aktuálně vypadá takhle:

     

    @ECHO OFF
    SET "OUTPUT=C:\sp3.csv"

    ECHO 1
    FOR /F "tokens=1" %%I IN (%1) DO (SET "CMP=%%I")
     ECHO 2
     SET "STR=\\%CMP%\HKLM\Software\Microsoft\Windows NT\CurrentVersion"
     ECHO 3
     ECHO %CMP%
     PING -n 1 -w 200 %CMP% | FIND /i "TTL" > NUL
     IF ERRORLEVEL 1 GOTO End
     ECHO 4
     FOR /F "tokens=4* delims=<tab>" %%X IN ('reg query "%STR%" /v ProductName ^| find "Windows"') DO (SET "ProductName=%%X")
     FOR /F "tokens=5" %%Y IN ('reg query "%STR%" /v CSDVersion ^| find "CSDVersion"') DO (SET "CSDVersion=%%Y")
     ECHO 5
     IF ("%ProductName%" geq " Windows XP") GOTO XP
     ECHO 6
     GOTO NotXP
     
     :XP
     IF ("%CSDVersion%" geq "1") GOTO NotSP3
     IF ("%CSDVersion%" geq "2") GOTO NotSP3
     IF ("%CSDVersion%" geq "3") GOTO SP3
     
     :NotXP
     ECHO NotXP
     SET "REPORT=%CMP%;Není OS Win XP"
     ECHO %REPORT% >> %OUTPUT%
     
     :SP3
     ECHO SP3
     SET "REPORT=%CMP%;SP3 Nainstalován"
     ECHO %REPORT% >> %OUTPUT%
     
     :NotSP3
     ECHO NotSP3
     SET "REPORT=%CMP%;SP3 Nenainstalován"
     ECHO %REPORT% >> %OUTPUT%
     
     :Err
     ECHO Error
     SET "REPORT=%CMP%;PC je nedostupné"
     ECHO %REPORT% >> %OUTPUT%
     
     :End
     ECHO End

    pátek 23. dubna 2010 12:11
  • rozdel a panuj.

    Udelej si jeden script co parsuje textovy soubor a vola druhy script  s parametrem (ziskamym parsovanim) - tusim je to jmeno pocitace. Bude se ti MNOHEM LEPE debugovat

    k delayed expansion (velmi zjednodusene): jde o to ze pokud mas blok programu v RAMCI KTEREHO menis hodnotu nejakych promennych (ted nemyslim vysledkt z "for"-u) tak se jejich obsah nevycisluje na radku na kterem se provadi manipulace s promennou ale ve vstupu do bloku.

    MP

    pátek 23. dubna 2010 12:19
    Moderátor