sobota, 2 listopada 2013

Zdalne zbieranie informacji o komputerach w sieci - Skrypty VBS cz.9

Przy pomocy Win32_ możemy zebrać praktyczne wszystkie informacje o komputerze jakie są tylko możliwe.Poniższy skrypt pozwala nam na zebranie informacji ze zdalnych komputerów w naszej sieci, zarówno za pomocą nazw jak i adresów IP. Na dysku C:\ tworzymy 2 pliki .txt:
-Computer.txt - gdzie wpisujemy listę komputerów do skanowania, jeżeli wpiszemy . (kropka) sczytamy dane z lokalnego komputer (w załączniku przykład jak wpisać nazwy komputerów, zamiast nazw można wpisać adresy IP),
-SysInfo.txt - do tego pliku będą dopisywane informacje o komputerach

Skrypt napisałem, ponieważ potrzebowałem z około 40 komputerów odczytać informacje sprzętowe (RAM,Procesor,Liczba rdzeni,Dysk,System operacyjny,Service Pack)  w firmowej sieci, korzystanie z gotowych programów jest trochę niewygodne, ponieważ musimy taki program zainstalować (np.Speccy), poczekać na wyświetlenie informacji, zapisać je, co trwa około około 2-3 minut, natomiast ten skrypt robi to w około 15 sekund.

Ja ustawiłem kilka zmian w systemie:
- wyłączony firewall,
- ustawiłem ręcznie IP oraz pozostałe dane karty sieciowej (nie miałem możliwości na szybko ustawić DHCP w mojej sieci testowej, w firmowej jest)
- na zakładce WINS zaznaczona opcja - włącz system NetBIOS przez TCP/IP,







Testowałem to co prawda tylko na 2 maszynach+te w firmie, jednak zarówno szukałem komputerów w sieci po nazwie jak i po adresie IP, wyniki zgadzały się z parametrami fizycznymi komputerów, jeden miał 1 GB ramu, drugi 3.5GB.




Gotowy skrypt możesz pobrać klikając TUTAJ.




on Error Resume Next  
Dim fso,objShell,writeFile,readFile,objWMIService,colSystem,colProcesor,colOperationSystem
Function FindOSType(strOSSys)
   Dim objWMI, objItem, colItems
    Dim OSVersion, OSName, ProductType
     Set objWMI = GetObject("winmgmts://" & strOSSys & "/root/cimv2")
    Set colItems = objWMI.ExecQuery("Select * from   Win32_OperatingSystem",,48)

    For Each objItem in colItems
        OSVersion = Left(objItem.Version,3)
        ProductType = objItem.ProductType
    Next
Select Case OSVersion
Case "6.1"
OSName = "Windows 7/ 2008 R2"
        Case "6.0" 
            OSName = "Windows Vista / 2008"
        Case "5.2" 
            OSName = "Windows 2003"
        Case "5.1" 
            OSName = "Windows XP"
        Case "5.0" 
            OSName = "Windows 2000"
        Case "4.0" 
            OSName = "Windows NT 4.0"
        Case Else
            OSName = "Windows 9x"
    End Select

     FindOSType = OSName
End Function 
Const ForAppending = 8
Const ForReading = 1

Set objShell = WScript.CreateObject("WScript.Shell")
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set writeFile = fso.OpenTextFile("C:\SysInfo.txt",ForAppending) 
Set readFile = fso.OpenTextFile("C:\Computers.txt",ForReading) 

Do While readFile.AtEndOfStream <> True
    strComputer = readFile.ReadLine
   
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSystem = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
Set colProcesor = objWMIService.ExecQuery ("Select * from Win32_Processor")
Set colHardDrive = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
Set colOperationSystem = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem ")
Set colCacheMemory = objWMIService.ExecQuery ("Select * from Win32_CacheMemory ")

For Each objComputer in colSystem
writeFile.WriteLine "Nazwa: " & objComputer.Name 
writeFile.WriteLine " "
writeFile.WriteLine "Ram: " & Round(((objComputer.TotalPhysicalMemory)/1073537024),2) & " GB RAM"
writeFile.WriteLine " "
Next

For Each objProcesor in colProcesor
writeFile.WriteLine "Procesor: " & objProcesor.Name & objProcesor.MaxClockSpeed
writeFile.WriteLine "Rdzenie: " & objProcesor.NumberOfLogicalProcessors
writeFile.WriteLine "Cache L2: " & Round(((objProcesor.L2CacheSize)/1024),2) & " MB "
writeFile.WriteLine "Cache L3: " & Round(((objProcesor.L3CacheSize)/1024),2) & " MB "
writeFile.WriteLine " "
Next

For Each objOS in colOperationSystem
writeFile.WriteLine "OS: "  & FindOsType(strComputer)   
writeFile.WriteLine "Architektura: "  & objOS.OSArchitecture
writeFile.WriteLine "SP: "  & objOS.CSDVersion
writeFile.WriteLine " "
Next

For Each objHardDrive in colHardDrive
writeFile.WriteLine "Partycja " & objHardDrive.Name & " "  &  Round(((objHardDrive.Size)/1073537024),2) & " GB "
writeFile.WriteLine "Wolne miejsce: " & Round(((objHardDrive.FreeSpace)/1073537024),2) & " GB "
writeFile.WriteLine " "
Next

objShell.Popup strComputer, 1
writeFile.WriteLine "---------------------------------------------------------"
Loop
writeFile.Close
readFile.Close
Wscript.Echo "Skrypt zakończony..."



6 komentarzy:

  1. Pytanie odnośnie plików txt. Zakładam, że plik SysInfo ma być pusty, a plik z listą komputerów ma jakąś strukturę. Czy mógłbyś umieścić przykład jak ma wyglądać taki plik, ewentualnie czy można jeśli jest to lista adresów ip załatwić skanowanie takim wpisem 10.1.1.0/22 czy trzeba wszystkie kompy z palca do pliku wpisać

    OdpowiedzUsuń
  2. SysInfo ma być pusty, natomiast listę komputerów polecam zrobić programem Look At Lan, można wyeksportować raport do Exel'a, w ten sposób będzie można wyciągnąć wszystkie adresy IP, adresy wrzucamy jeden pod drugim w wiersze pliku, ważne żeby na końcu nie było spacji. Nie próbowałem robić skanowania podając klasę adresu oraz jego maskę, w moim przypadku wszystko robiłem podając nazwy komputerów, ich nazwy wyciągnąłem z AD.

    OdpowiedzUsuń
  3. sysinfo miałem pusty listę zrobiłem look at lan, uruchomiłem skrypt w konsoli wpisując polecenie cscript skaner.vbs. Skrypt co kilka sekund zwiększał rozmiar pliku sysinfo o 1kB, po 30 minutach przerwałem działanie skryptu, otwarłem plik i okazało się, że plik jest pusty w środku, ale ma 4MB wagi.
    Plik wypełniony był w ten sposób:
    ------------------------------------------------


    -----------------------------------------------
    w regularnych odstępach.
    wyczyściłem plik z listą kompów, pozostawiając jeden adres, po całej nocy działania skryptu sytuacja się powtórzyła tylko że plik miał 60MB.
    Co robię nie tak?

    OdpowiedzUsuń
  4. Proszę napisać mi jakie systemy operacyjne działają na maszynach? Ja ten skrypt napisałem gdy wszystkie komputery w firmie miały XP, gdy potrzebowałem zestawienie , które komputery mamy do wymiany. Możliwe że zaszły zmiany w Wscript odnośnie zdalnego połączenia do rejestru, musiałbym sprawdzić ten skrypt czy działa teraz na naszych nowych komputerach.

    OdpowiedzUsuń
  5. W sieci działają XP Home i XP Prof, mam też XP Prof x64, win 7, win 7 x64. Test zrobiłem na próbce jednego komputera z win xp z wyłączonym firewallem, wynik był taki sam jak dla wcześniejszych prób. Kolejna sprawa skrypt się zapętla i jeśli go nie przerwę to będzie szedł bez końca. Następna kwestia to notorycznie wyskakujące okienko z przyciskiem "ok" ile razy bym nie kliknął tyle razy ono znowu się pojawi, równie dobrze można je olać i skrypt dalej będzie się kotłował

    OdpowiedzUsuń
  6. Zaktualizowałem nieco wpis, sprawdziłem działanie skryptu na XP jest poprawnie, natomiast problemy pojawiają się w przypadku Win 7, jeżeli lokalnie go uruchamiam nawet po nazwie jest ok, natomiast zdalne pobieranie danych stwarza problem (podejrzewam, że zewnętrzny antywirus może blokować), w firmie pominąłem te komputery, ponieważ nie podlegały wymianie. Sprawdziłem dodatkowo skrypt skanują 5 serwerów, na których działa 2003 oraz 2008 i dane również się pojawiły. W momencie gdy jakiś adres/nazwa nie odpowiada zapisane zostają jedynie linie przerywane lub też dublują się wpisy.

    OdpowiedzUsuń