Sfc сканер для всех, кто хочет внести свои пожелания или потестировать сборки

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
  • Первое сообщение
  • #1
Привет.
Собственно решил, что возможно людям будет интересно участие в создании более гибкой версии скрипта sfc /scannow ?
Собрал стартовый код, который выполняет саму проверку, пока базовую.

Считай, с нуля - все хотелки можно учитывать сразу...
Вариант на питоне

Python:
import wx
import os
import shutil

#Текущий катлог
StrDir_ = os.getcwd()
#Системная директория
WinDir_ = os.getenv('windir')
#Путь к кталогу CBS
WinCbs_ = WinDir_ + '\\Logs\\CBS\\'
sf_pr='C:\\Windows\\system32\\sfc.exe /scannow'

#Функция проверки наличия каталога
def Dir_ (str_):
    str_ = StrDir_ + '\\' + str_
    return (os.path.isdir(str_))

#Проверка существования файла
def File_Exist(files_):
    print(os.path.exists(files_))

#Проверяем хитектуру системы
if ("64" in os.getenv('PROCESSOR_ARCHITECTURE')) or ("64" in os.getenv('PROCESSOR_ARCHITEW6432')):
    arh = "64"

else:
    arh ="32"




class scanOs(wx.Frame):
    def __init__(self):
         wx.Frame.__init__(self, None, -1, 'SFC Scan',
                  size=(500, 200))
         panel = wx.Panel(self, -1)
         self.button = wx.Button(panel, -1, "Start Scan SFC", pos=(50, 20))
         self.Bind(wx.EVT_BUTTON, self.OnClick, self.button)
         self.button.SetDefault()


    #Функция, вызываемая при нажатии левой кнопкой мыши
    def OnClick(self, event):
        #Если каталог Log в текущем катлоге отсутствует - создаем
        if Dir_('Log'):
            print('Рабочий каталог обнаружен:')
            print(StrDir_ + '\Log')
            print()
        else:
            os.mkdir('Log')
            print('Создан рабочий каталог: ' + StrDir_ )
            print('')



        #Проверяналичие файла- логаб если найден - бэкапим
        if os.path.exists(StrDir_ + '\Log' + 'sfcdoc.log'):
            os.rename(StrDir_ + '\Log' + 'sfcdoc.log', StrDir_ + '\Log' + '\sfcdoc.bak.log')
            print('Создана резервная копия лога')
            print('')

        #Завершаем процесс TiWorker, если он есть
        os.system('C:\\Windows\\system32\\taskkill /im TiWorker.exe /f')

        #Меняем текст кнопки
        if self.button.GetLabel() == 'Start Scan SFC':
            self.button.SetLabel("Scanning SFC...")
            wx.Execute(sf_pr,wx.EXEC_SYNC, callback=None)
            #Копируем cbs.log
            shutil.copy(WinCbs_ + 'cbs.log', StrDir_ + '\Log')
 
            self.button.SetLabel("Start Scan SFC")
            #Завершаем процесс TiWorker, если он есть
            os.system('C:\\Windows\\system32\\taskkill /im TiWorker.exe /f')
        else:
            self.button.SetLabel("Start Scan SFC")

if __name__ == '__main__':
    app = wx.App()
    frame = scanOs()
    frame.Show()
    app.MainLoop()

Вариант на vb6:
VB.NET / VBA:
Option Explicit

Private Const MAX_PATH As Long = 260&

Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function lstrcmpi Lib "kernel32.dll" Alias "lstrcmpiW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Const TH32CS_SNAPPROCESS        As Long = 2
Private Const SYNCHRONIZE               As Long = &H100000
Private Const INFINITE                  As Long = -1
Private Const INVALID_HANDLE_VALUE      As Long = -1
Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function IsIconic Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Private Declare Function GetProcessIoCounters Lib "kernel32.dll" (ByVal hProcess As Long, IoCounters As Any) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Type IO_COUNTERS
    ReadOperationCount As Currency
    WriteOperationCount As Currency
    OtherOperationCount As Currency
    ReadTransferCount As Currency
    WriteTransferCount As Currency
    OtherTransferCount As Currency
End Type

Private Type tagINITCOMMONCONTROLSEX
  dwSize  As Long
  dwICC  As Long
End Type

Private Declare Function InitCommonControlsEx Lib "comctl32.dll" (lpInitCtrls As tagINITCOMMONCONTROLSEX) As Boolean

Dim IO_C As IO_COUNTERS
Dim selfPatch_ As String              'Переменная хранения относительных путей
Dim WshShell As Object                '
Dim objWMIService, colProcesses       '
Dim Process                           'Тут хранится имя процессов,с которыми планируем работать
Dim runas                             'Глагол для запуска программ /позже переназвать и вставить как парметр функции
Dim WinDir_ As String                 'Директория установки Windows
Dim WinDrv_ As String                 'Диск, на котором установлена система
Dim sProcName As String
Dim PID As Long
Dim hProc As Long


Private Sub Form_Initialize()
  On Error Resume Next
  Dim ICC As tagINITCOMMONCONTROLSEX

  ' Enable visual styles
  With ICC
      .dwSize = Len(ICC)
      .dwICC = &HFF& 'http://www.geoffchappell.com/studies/windows/shell/comctl32/api/commctrl/initcommoncontrolsex.htm
  End With
  InitCommonControlsEx ICC
End Sub




Public Sub Command1_Click()

If Command1.Caption Like "Start scan SFC" Then
    Command1.Enabled = False
    Command1.Caption = "Ожидайте..."
    Call ff("taskkill.exe", "/IM TiWorker.exe /f", "0")
    Sleep 1000
    Call ff("sfc.exe", "/scannow", "1")
   
Else
    KillProc ("sfc.exe")
    Sleep 1000
    Command1.Caption = "Start scan SFC"
    Call ff("taskkill.exe", "/IM TiWorker.exe /f", "0")
End If
End Sub




'Функция проверки наличия файла в каталоге
Public Function f_search(f_ As String) As Boolean

If Trim$(Dir(f_)) <> "" Then
'Файл в директории существует
    f_search = True
Else
    f_search = False
End If
End Function




'Запуск процессов с аргументами
Public Sub ff(self As String, arg_ As String, size_ As String)

'Проверяем наличие запускаемого объекта по адресу: \windows\Sysnative\
'Если есть - назначем этот путь рабочей директорией
If f_search(WinDir_ & "\Sysnative\" & self) = True Then
    selfPatch_ = WinDir_ & "\Sysnative\"
Else
    selfPatch_ = WinDir_ & "\System32\"
End If

Dim Start
    Start = Shell(selfPatch_ & self & Chr(32) & arg_, size_)
    Sleep 2000 'Выдерживаем паузу 2 секунды
   
Call IfProc_(self)
'ооо тут стопанулся - последовательность старта функции
End Sub





'Убиваем процесс по имени БЕЗ принудительного завершения
Private Sub KillProc(KlPr_ As String)
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
                If Process.Caption Like KlPr_ Then
                        Process.Terminate
                End If
        Next
End Sub

Private Sub IfProc_(self)
sProcName = self
Sleep 1000 'Выдерживаем паузу 1 секунду

    If IsRunned(sProcName, PID) Then
    'попробовать замостить эту функцию для проверки наличия процесса
        hProc = OpenProcess(SYNCHRONIZE, False, PID)
       
        If hProc > 0 Then
            Sleep 1000 'Выдерживаем паузу 1 секунду
           
            Sleep 1000 'Выдерживаем паузу 1 секунду
            Call WaitForSingleObject(hProc, INFINITE)
        End If
        Text1.Text = Text1.Text & vbCrLf & "Процесс " & sProcName & " завершен." & vbCrLf
        If self Like "sfc.exe" Then Call ff("taskkill.exe", "/IM TiWorker.exe /f", "0")
        Command1.Caption = "Start scan SFC"
        Command1.Enabled = True
    Else
        If self Like "taskkill.exe" = False Then
            Text1.Text = Text1.Text & vbCrLf & "Процесс " & sProcName & " не запущен" & vbCrLf
        End If
    End If
End Sub

Private Sub Form_Load()
WinDir_ = Environ("WinDir")
WinDrv_ = Environ("SystemDrive")
End Sub

Function IsRunned(Optional ByRef ProcessName As String, Optional ByRef ProcessID As Long) As Boolean
    ' Запущен ли процесс, указанный по имени или ProcessID
    ' (регистр символов не учитывается)
    ' Если процесс найден, в переменную ProcessID передается PID найденного процесса (если поиск велся по имени),
    ' либо в переменную ProcessName возвращается имя найденного процесса (если поиск велся по PID).

    Dim hSnap   As Long
    Dim pe      As PROCESSENTRY32

    If Len(ProcessName) = 0 And ProcessID = 0 Then Exit Function

    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

    If hSnap = INVALID_HANDLE_VALUE Then Exit Function

    pe.dwSize = Len(pe)

    If Process32First(hSnap, pe) Then
        Do
            If Len(ProcessName) = 0 Then
                If pe.th32ProcessID = ProcessID Then
                    IsRunned = True
                    ProcessName = Left$(pe.szExeFile, InStr(pe.szExeFile, vbNullChar) - 1)
                    Exit Do
                End If
            Else
                If lstrcmpi(StrPtr(pe.szExeFile), StrPtr(ProcessName)) = 0 Then
                    IsRunned = True
                    ProcessID = pe.th32ProcessID
                    Exit Do
                End If
            End If
        Loop While Process32Next(hSnap, pe)
    End If
    CloseHandle hSnap
End Function
 

Вложения

  • test.7z
    6.9 KB · Просмотры: 10
Последнее редактирование:
msvbvm60.dll - системный файл. Если он удалён, или вырезан какой-то сборкой Васи Пупкина, то конечно, не запустится.
 
На этом компе стоит Shadow Defender, так что не накатилось, посмотрел журнал windows, там обнаружил неисправимые ошибки диска, проверил диск "chkdsk c: /f /r", что-то исправилось, после перезагрузки запустилась программа
 
В окошко рядом с кнопкой, планируется ли добавить краткие результаты анализа.
 
В окошко рядом с кнопкой, планируется ли добавить краткие результаты анализа.
Да, там будут отображаться результат проверки, туда же будет парситься лог и там же можно будет вводить собственные команды.
Все это будем делать последовательно, проверяя каждый этап
 
Назад
Сверху Снизу