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

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,062
Реакции
5,782
  • Первое сообщение
  • #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
Последнее редактирование:
Ты, Каким образом?????

Python:
import subprocess
from os import system
или
import subprocess
subprocess.Popen( ['runas', '/user:Administrator', 'sfc /scannow'] )

print('1. sfc scan')
print('2. DISM')

key = int(input('Input your choice: '))
if key == 1:
    system("sfc /scannow")
elif key == 2:
    system("DISM /Online /Cleanup-Image /CheckHealth")

P.S
Для вам сюрприз @Кирилл Требуем доработки Python... Специально написал для тебя.
А в чем заключается сюрприз?
 
А в чем заключается сюрприз?
В, том что он не мог написать на питон, потому что забросил, его решения. Ну, вообще ему было сложно написать. Ну, есть какие-то недостатки.
Я, ему решил помочь)
 
Cам написал Код проще на VBS...: Похожи на .VB, это как сокращенный, код не требуется множеств кодов.
VBS менее надёжен для такого рода задач и через чуж ограничен.
Сюда относится его зависимость от ассоциаций и блокировки скриптов.
Эм. Одна проблема, VB6 не нашел. Сбросите мне инфу где качать?
Это против правил форума. Среда разработки Visual Basic 6 платная.
Просьба не оффтопить в данной теме. По VB6 есть целый раздел на форуме. Если есть вопросы, пожалуйста, задавайте их там:
 
Последнее редактирование:
Для вам сюрприз @Кирилл Требуем доработки Python... Специально написал для тебя
А разве мы сможем запустить этот скрипт на любой системе? Без установки дополнительного программного обеспечения?

Cам написал Код проще на VBS...: Похожи на .VB, это как сокращенный, код не требуется множеств кодов.
Молодец, но только тогда теряется суть проекта - мы пишем многофункциональную диагностическую программу, верно?
Я намеренно делаю все не спеша и с нуля - на самом деле у меня уже был проект.

Доработал код стандартной проверки sfc - просьба произвести тестовые запуски на системах старше ХР.
Что делаем дальше:
1) нам нужен код проверки наличия доступа к сети интернет
2) проверяем наличие определенного обновления KB...
3) предложения, пожелания, замечания по текущей версии - принимаются

p.s. так же оформил и закрепил первый пост - там же будет актуальный исходный код
 

Вложения

  • test.7z
    5.8 KB · Просмотры: 3
Последнее редактирование:
После завершение сканирования (консольное окно закрылось)
43210
 
Ну тогда вот класс для работы с HTTP с поддержкой прокси (подтягивается автоматически из IE).
Отправляешь запрос на любую страничку и проверяешь ответ.
 
Ну тогда вот класс для работы с HTTP с поддержкой прокси (подтягивается автоматически из IE).
Отправляешь запрос на любую страничку и проверяешь ответ.
Может сразу тогда укажешь как обращаться к нему...точнее каковы аргументы, которые должны приниматься модулями класса.
 
Последнее редактирование:
Ты, Каким образом?????

Python:
import subprocess
from os import system
или
import subprocess
subprocess.Popen( ['runas', '/user:Administrator', 'sfc /scannow'] )

print('1. sfc scan')
print('2. DISM')

key = int(input('Input your choice: '))
if key == 1:
    system("sfc /scannow")
elif key == 2:
    system("DISM /Online /Cleanup-Image /CheckHealth")

P.S
Для вам сюрприз @Кирилл Требуем доработки Python... Специально написал для тебя.
Молодец, скопировал отсюда Python cmd command sfc /scannow
скорее всего, это реализовать можно, но для этого нужно либо юзеру подгружать модули нештатные, либо жестко мучаться.
 
Последнее редактирование:
Ну вот, вроде стандартная проверка доведена - можно тестировать.
Если замечаний не будет - можно приступать ка распарсиванию лога, выводу собственного и операциям с хранилищем компонентов.
Сборку залил в первый пост - исходный код тоже.
 
Добрый день! Хотел запустить сканер, вылетела ошибка
---------------------------
Проект1
---------------------------
Run-time error '53':
File not found
---------------------------
ОК
---------------------------
windows 7_32
 
Добрый день! Хотел запустить сканер, вылетела ошибка
Сделал исправления для 32 систем - накатил пару виртуалок, проверил, все норм.
Должно теперь у тебя работать.

SyntaxError: multiple statements found while compiling a single statement
это оно к wx
@Moxito на python далее этот проект пока не развиваем - нет смысла.
Если есть желание то можем что то другое на нем сделать.
 
Последнее редактирование:
У меня так и не зпускается, наверное проблемы у меня, также выдает
Run-time error '53':
File not found
-------------------
А у тебя среда разработки установлена?
Файлы taskkill.exe и sfc.exe по какому пути находятся? В названии есть верхний регистр?
 
Назад
Сверху Снизу