[VBS] // Загруженность процессора - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Alowir, Sanoxxx  
[VBS] // Загруженность процессора
SysWOW Дата: Пятница, 24.04.2020, 17:13 | Сообщение # 1
Боец
Сообщений: 103
Статус: Offline


Поможет Вам проверить загруженность процессора.


Код
option explicit

dim oFSO, LogFile_full, LogFile_cur, oShell, cur, ver
ver = "1.2"

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")

' Make me Admin :) Получаем права Администратора
if WScript.Arguments.Count = 0 then
    if not isAdminRights() then
        Elevate()
        WScript.Quit
    end if
end if

cur = oFSO.GetParentFolderName(WScript.ScriptFullName)

LogFile_full = cur & "\ProcessCPU_Average.csv"
LogFile_cur  = cur & "\ProcessCPU_Current.csv"

on error resume next
if oFSO.FileExists(LogFile_full) then oFSO.DeleteFile(LogFile_full)
if oFSO.FileExists(LogFile_cur)  then oFSO.DeleteFile(LogFile_cur)
if Err.Number <> 0 then msgbox "Ошибка! Закройте, пожалуйста, книги Excel и запустите скрипт еще раз.", vbCritical, "GetCPUUsage v." & ver & " by Dragokas": WScript.Quit 1
on error goto 0

oShell.Popup "Пожалуйста, подождите...", 4, "GetCPUUsage by Dragokas"

CPUTimeToLog
msgbox "Готово." & vblf & "Выложите в теме, где Вам оказывают помощь, файлы:" & vblf & vblf &_
    "1. ProcessCPU_Current.csv" & vblf & "2. ProcessCPU_Average.csv" & vblf & vblf &_
    "упаковав в архив формата zip.", vbInformation, "GetCPUUsage v." & ver & " by Dragokas"
WScript.Quit

Set oFSO = Nothing: Set oShell = Nothing

Sub CPUTimeToLog()
    dim Kernel_t1, User_t1, Total_t1
    dim Kernel_t2, User_t2, Total_t2
    dim oSCR_t1, oSCR_t2, oSCR_PID, oSCR_path, oSCR_Serv, oSCR_parentPID, oTS, WMI, oProcesses, oProcess, Key
    dim Proc_t1, Proc_t2, Delta_Proc, Delta_System, oServices, oService, Service_Name, ParentPID, ParentPath

    'PID -> TotalTime
    set oSCR_t1 = CreateObject("Scripting.Dictionary")
    set oSCR_t2 = CreateObject("Scripting.Dictionary")
    'PID -> Name
    set oSCR_PID = CreateObject("Scripting.Dictionary")
    'PID -> Путь и параметры командной строки
    set oSCR_path = CreateObject("Scripting.Dictionary")
    'PID -> Service
    set oSCR_Serv = CreateObject("Scripting.Dictionary")
    'PID -> ParentPID
    set oSCR_parentPID = CreateObject("Scripting.Dictionary")

    Set WMI = GetObject("winmgmts:\root\cimv2")

    Set oServices = WMI.ExecQuery("SELECT * FROM Win32_Service") 'Получаю имена и описания служб -> привязываю к PID (ключ - это PID)
    For each oService in oServices
        if oSCR_Serv.Exists(oService.ProcessID) then
            oSCR_Serv(oService.ProcessID) = oSCR_Serv(oService.ProcessID) & _
                oService.Name & " (" & oService.Caption & "), "
        else
            oSCR_Serv.Add oService.ProcessID, oService.Name & " (" & oService.Caption & "), "
        end if
    Next

    WScript.Sleep(500) ' Нормализация % скачка CPU, вызванного запуском этого скрипта

    ' 1-я засечка
    Set oProcesses = WMI.ExecQuery("SELECT * FROM Win32_Process")
    For each oProcess in oProcesses
        with oProcess
            Kernel_t1 = Kernel_t1 + cdbl(.KernelModeTime)
            User_t1   = User_t1   + cdbl(.UserModeTime)
            oSCR_t1.Add        .ProcessID, cdbl(.KernelModeTime) + cdbl(.UserModeTime)
            oSCR_PID.Add       .ProcessID, .Caption             'PID -> Name
            oSCR_path.Add      .ProcessID, .ExecutablePath      'PID -> Path
            oSCR_parentPID.Add .ProcessID, .ParentProcessId     'PID -> ParentPID
        end with
    Next
    'Всего времени всех процессов
    Total_t1 = Kernel_t1 + User_t1

    set oTS = oFSO.CreateTextFile(LogFile_full, true)
    oTS.WriteLine "CPU (%);Process Name;PID;Service;Path;ParentPath"

    SpecialSortDict oSCR_t1, true 'Сортировка словаря в обратном порядке по % CPU.
    
    For each Key in oSCR_t1.Keys
        Proc_t1 = oScr_t1(Key)
        if (oSCR_Serv.Exists(Key) and Key <> 0) then Service_Name = oSCR_Serv(Key) else Service_Name = ""
        ParentPID = oSCR_parentPID(Key)
        if (oSCR_path.Exists(ParentPID) and Key <> 0) then ParentPath = oSCR_path(ParentPID) else ParentPath = ""
        oTS.Write round(Proc_t1 / Total_t1 * 100, 2) & ";"      'CPU (%)
        oTS.Write oSCR_PID(Key) & ";"                           'Process Name
        oTS.Write Key & ";"                    'PID
        oTS.Write Service_Name & ";"                            'Service
        oTS.Write oScr_path(Key) & ";"                          'Path
        oTS.Write ParentPath & ";"                    'Parent Path
        oTS.WriteLine ""
    Next
    oTS.Close

    WScript.Sleep(2000) 'выжидаю 2 сек.

    ' 2-я засечка
    Set oProcesses = WMI.ExecQuery("SELECT * FROM Win32_Process")
    For each oProcess in oProcesses
        with oProcess
            Kernel_t2 = Kernel_t2 + cdbl(.KernelModeTime)
            User_t2   = User_t2   + cdbl(.UserModeTime)
            oSCR_t2.Add .ProcessID, cdbl(.KernelModeTime) + cdbl(.UserModeTime)
            if not oSCR_PID.Exists(.ProcessID) then
                oSCR_PID.Add       .ProcessID, .Caption             'PID -> Name (если появились новые)
                oSCR_path.Add      .ProcessID, .ExecutablePath      'PID -> Path (если появились новые)
                oSCR_parentPID.Add .ProcessID, .ParentProcessId     'PID -> ParentPID
            end if
        end with
    Next
    'Всего времени всех процессов
    Total_t2 = Kernel_t2 + User_t2

    ' Словарь PID -> Дельта CPU:
    ' Записываю разницу по формуле:
    ' % нагрузки процесса = Дельта времени процесса / дельта времени системы * 100
    Dim oSCR_delta: set oSCR_delta = CreateObject("Scripting.Dictionary")
    For each Key in oSCR_t2.Keys
        Proc_t1 = oScr_t1(Key)
        Proc_t2 = oScr_t2(Key)
        Delta_Proc   = Proc_t2  - Proc_t1
        Delta_System = Total_t2 - Total_t1
        oSCR_delta.Add key, round(Delta_Proc / Delta_System * 100, 2)
    Next

    SpecialSortDict oSCR_delta, true ' Сортировка словаря в обратном порядке по % CPU.

    set oTS = oFSO.CreateTextFile(LogFile_cur, true)
    oTS.WriteLine "CPU (%);Process Name;PID;Service;Path;ParentPath"

    For each Key in oSCR_delta.Keys
        if (oSCR_Serv.Exists(Key) and Key <> 0) then Service_Name = oSCR_Serv(Key) else Service_Name = ""
        ParentPID = oSCR_parentPID(Key)
        if (oSCR_path.Exists(ParentPID) and Key <> 0) then ParentPath = oSCR_path(ParentPID) else ParentPath = ""
        oTS.Write oSCR_delta(key) & ";"                    'CPU (%)
        oTS.Write oSCR_PID(Key) & ";"                    'Process Name
        oTS.Write Key & ";"                    'PID
        oTS.Write Service_Name & ";"                    'Service
        oTS.Write oScr_path(Key) & ";"                    'Path
        oTS.Write ParentPath & ";"                    'ParentPath
        oTS.WriteLine ""
    Next
    oTS.Close

    Set oProcess = Nothing: set oProcesses = Nothing: set WMI = Nothing: set oTS = Nothing
    Set oSCR_PID = Nothing: set oSCR_t1 = Nothing: set oSCR_t2 = Nothing: set oSCR_path = Nothing
    Set oSCR_Serv = Nothing: set oSCR_parentPID = Nothing
End Sub

Sub Elevate()
    Dim colOS, oOS, strOSLong, oShellApp
    Const DQ = """"
    Set colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
    For Each oOS In colOS: strOSLong = oOS.Version: Next
    If Left(strOSLong, 1) = "6" and Not isAdminRights Then
        Set oShellApp = CreateObject("Shell.Application")
        oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ & " " & DQ & "Twice" & DQ, "", "runas", 1
        WScript.Quit
    End If
    set oOS = Nothing: set colOS = Nothing: set oShellApp = Nothing
End Sub

Function isAdminRights()
    Dim oReg, strKey, intErrNum, flagAccess
    Const KQV = &H1, KSV = &H2, HKCU = &H80000001, HKLM = &H80000002
    Set oReg = GetObject("winmgmts:root\default:StdRegProv")
    strKey = "System\CurrentControlSet\Control\Session Manager"
    intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
    isAdminRights = flagAccess
    Set oReg = Nothing
End Function

'Сортировка словаря методом вставок -> исходный словарь реконструируется
Sub SpecialSortDict(inDict, Reverse)
    Dim arrPos: arrPos = inDict.keys                    'Инициализация массива позиций ключей словаря
    Dim arrTemp: arrTemp = inDict.Items                 'Виртуализация значений словаря

    Dim i, j, xItem
    For i = 1 To UBound(arrTemp)                        'Сортировка методом вставок
        For j = i To 1 Step -1
            If arrTemp(j) < arrTemp(j - 1) Then
                xItem = arrTemp(j)                      'Обмен значений
                arrTemp(j) = arrTemp(j - 1)
                arrTemp(j - 1) = xItem
                xItem = arrPos(j)                       'Обмен ключей
                arrPos(j) = arrPos(j - 1)
                arrPos(j - 1) = xItem
            Else
                Exit For
            End If
        Next
    Next

    dim iStart, iEnd, iStep
    if Reverse then iStep = -1: iStart = UBound(arrPos): iEnd = 0 else iStep = 1: iStart = 0: iEnd = UBound(arrPos)

    Dim virtDict: Set virtDict = CreateObject("Scripting.Dictionary")   
    For i = iStart To iEnd step iStep                         'Расставляем значения в виртуальный словарь согласно массива ключей
        virtDict.Add arrPos(i), inDict(arrPos(i))
    Next

    Set inDict = virtDict
End Sub


// //


Сообщение отредактировал SysWOW - Пятница, 24.04.2020, 17:14
  • Страница 1 из 1
  • 1
Поиск: