Что нового

[Сеть, интернет] проверка актуальности файлов

AtoS

Новичок
Сообщения
57
Репутация
2
Всем доброго времени суток! Есть сеть "звезда", возможна ли проверка целостности/актуальности файла в каждом из удаленных машин, например, по контрольной сумме средствами autoit и консолидация информации на сервере ввиде лога?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AtoS
Предупреждение
На будущее, оформляй запросы в раздел "Стол заказов" в соответствие с правилами - http://autoit-script.ru/index.php?topic=124.0

В связи с чрезмерной расплывчатостью задания, переношу тему в раздел для новичков для решение задачи в режиме "Вопрос-Ответ".


Добавлено:
Сообщение автоматически объединено:

Если по теме, то
1. Файлы, при соответствующих правах доступа могут быть прочитаны средствами AutoIt так же как и любые другие файлы с использованием UMC-путей.
2. ЕМНИП, то есть целая UDF для вычисления контрольных сумм. Но сейчас нет времени искать. Вот кусок, который я брал для своих целей - вычисление MD5-хеша
Код:
; #FUNCTION# ;===============================================================================
;
; Name...........: _MD5ForFile
; Description ...: Calculates MD5 value for the specific file.
; Syntax.........: _MD5ForFile ($sFile)
; Parameters ....: $sFile - Full path to the file to process.
; Return values .: Success - Returns MD5 value in form of hex string
;                          - Sets @error to 0
;                  Failure - Returns empty string and sets @error:
;                  |1 - CreateFile function or call to it failed.
;                  |2 - CreateFileMapping function or call to it failed.
;                  |3 - MapViewOfFile function or call to it failed.
;                  |4 - MD5Init function or call to it failed.
;                  |5 - MD5Update function or call to it failed.
;                  |6 - MD5Final function or call to it failed.
; Author ........: trancexx
;
;==========================================================================================
Func _MD5ForFile($sFile)

    Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _
            "wstr", $sFile, _
            "dword", 0x80000000, _ ; GENERIC_READ
            "dword", 1, _ ; FILE_SHARE_READ
            "ptr", 0, _
            "dword", 3, _ ; OPEN_EXISTING
            "dword", 0, _ ; SECURITY_ANONYMOUS
            "ptr", 0)

    If @error Or $a_hCall[0] = -1 Then
        Return SetError(1, 0, "")
    EndIf

    Local $hFile = $a_hCall[0]

    $a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _
            "hwnd", $hFile, _
            "dword", 0, _ ; default security descriptor
            "dword", 2, _ ; PAGE_READONLY
            "dword", 0, _
            "dword", 0, _
            "ptr", 0)

    If @error Or Not $a_hCall[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
        Return SetError(2, 0, "")
    EndIf

    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)

    Local $hFileMappingObject = $a_hCall[0]

    $a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _
            "hwnd", $hFileMappingObject, _
            "dword", 4, _ ; FILE_MAP_READ
            "dword", 0, _
            "dword", 0, _
            "dword", 0)

    If @error Or Not $a_hCall[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        Return SetError(3, 0, "")
    EndIf

    Local $pFile = $a_hCall[0]
    Local $iBufferSize = FileGetSize($sFile)

    Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
            "dword buf[4];" & _
            "ubyte in[64];" & _
            "ubyte digest[16]")

    DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))

    If @error Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        Return SetError(4, 0, "")
    EndIf

    DllCall("advapi32.dll", "none", "MD5Update", _
            "ptr", DllStructGetPtr($tMD5_CTX), _
            "ptr", $pFile, _
            "dword", $iBufferSize)

    If @error Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        Return SetError(5, 0, "")
    EndIf

    DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))

    If @error Then
        DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
        Return SetError(6, 0, "")
    EndIf

    DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)
    DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)

    Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))

    Return SetError(0, 0, $sMD5)

EndFunc   ;==>_MD5ForFile
 
Автор
A

AtoS

Новичок
Сообщения
57
Репутация
2
Kaster сказал(а):
Если по теме, то
1. Файлы, при соответствующих правах доступа могут быть прочитаны средствами AutoIt так же как и любые другие файлы с использованием UMC-путей.
2. ЕМНИП, то есть целая UDF для вычисления контрольных сумм. Но сейчас нет времени искать. Вот кусок, который я брал для своих целей - вычисление MD5-хеша
ну тут не обязательно сравнивать по контрольной сумме, принципиален сам процесс подключения и проверки файла(например, с сервера 192.168.1.1 проверить файл var.rar по эталонному размеру на компьютерах 192.168.1.2, 192.168.1.5, 192.168.1.11, 192.168.1.50 и сохранить отчет о проверке на сервере 192.168.1.1 вида:
192.168.1.2 - ок
192.168.1.5 - ок
192.168.1.11 - error
192.168.1.50 - ок
)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Примерно так. Проверить не на чем
Код:
$iRAR_size = 65536;
$sFile = 'var.rar'
$iCompsN = 4
Dim $aComps[$iCompsN] = [ _
'192.168.1.2', _
'192.168.1.5', _
'192.168.1.11', _
'192.168.1.50', _
]
$sShared_folder = 'SharedFolder'
$sServerIP = '192.168.1.1'
$sLog_folder = 'Shared log folder'
$sLog = @MDAY & @MON & @YEAR & '_actual.log'

$sLog_path = '\\' & $sServerIP & '\' & $sLog_folder & '\' & $sLog
$hWrite = FileOpen($sLog_path, 2)
For $i = 0 to $iCompsN - 1
	If FileGetSize('\\' & $aComps[$i] & '\' & $sShared_folder & '\' & $sFile) = $iRAR_size Then
		$sAns = 'OK'
	Else
		$sAns = 'Error'
	EndIf
	FileWriteLine($aComps[$i] & @TAB & '-' & @TAB & $sAns)
Next
FileClose($hWrite)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Kaster
Если Вам не сложно,

Kaster [?]
есть целая UDF для вычисления контрольных сумм. Но сейчас нет времени искать.
Правильное название этой UDF напишите, пожалуйста. Очень она нужна.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
http://autoit.rv.ua/files/Encoding Encryption/hash.au3
косяки со ссылками на http://autoit.rv.ua, форум их конвертирует во что-то свое, неправильное.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Kaster
Большое спасибо. До того, как узнал про эту UDF, пользовался утилитой HashMyFiles.exe от NirSoft.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AtoS
Проблема решена?
 

boriska89

Новичок
Сообщения
1
Репутация
0
Нахождение MD5 для больших файлов (проверял на 10 Гб)

Код:
Opt("MustDeclareVars", 1)

Global $sFile = FileOpenDialog("Choose file", "", "All files (*)")
If @error Then Exit

Global $hTimer, $iTimer, $sData

; MD55:
$hTimer = TimerInit()

$sData = _MD5ForBigFile($sFile)
$iTimer = TimerDiff($hTimer)

ConsoleWrite("! MD5 took " & $iTimer & " ms" & @CRLF)
ConsoleWrite("Result: " & $sData & @CRLF & @CRLF)

Exit @error

; #FUNCTION# ;===============================================================================
;
; Name...........: _MD5ForBigFile
; Description ...: Calculates MD5 value for the specific file.
; Syntax.........: _MD5ForBigFile ($sFile)
; Parameters ....: $sFile - Full path to the file to process.
; Return values .: Success - Returns MD5 value in form of hex string
;                          - Sets @error to 0
;                  Failure - Returns empty string and sets @error:
;                  |1 - CreateFile function or call to it failed.
;                  |2 - CreateFileMapping function or call to it failed.
;                  |3 - MapViewOfFile function or call to it failed.
;                  |4 - MD5Init function or call to it failed.
;                  |5 - MD5Update function or call to it failed.
;                  |6 - MD5Final function or call to it failed.
; Author ........: trancexx ft. boriska
;
;==========================================================================================
Func _MD5ForBigFile($sFile)

	Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _
			"wstr", $sFile, _
			"dword", 0x80000000, _ ; GENERIC_READ
			"dword", 1, _ ; FILE_SHARE_READ
			"ptr", 0, _
			"dword", 3, _ ; OPEN_EXISTING
			"dword", 0, _ ; SECURITY_ANONYMOUS
			"ptr", 0)

	If @error Or $a_hCall[0] = -1 Then Return SetError(1, 0, "")

	Local $hFile = $a_hCall[0]

	$a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _
			"hwnd", $hFile, _
			"dword", 0, _ ; default security descriptor
			"dword", 2, _ ; PAGE_READONLY
			"dword", 0, _
			"dword", 0, _
			"ptr", 0)

	If @error Or Not $a_hCall[0] Then
		DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
		If Not FileGetSize($sFile) Then Return SetError(0, 0, "D41D8CD98F00B204E9800998ECF8427E")
		Return SetError(2, 0, "")
	EndIf

	DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)

	Local $hFileMappingObject = $a_hCall[0]

	Local $tMD5_CTX = DllStructCreate("dword i[2];" & _
			"dword buf[4];" & _
			"ubyte in[64];" & _
			"ubyte digest[16]")

	DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX))

	If @error Then
		DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)
		Return SetError(4, 0, "")
	 EndIf

 	Local $iMainBufferSize = FileGetSize($sFile)
 	Local $iMaxBufferSize = 1073741824 ;/ 2
	Local $dwFileOffset = 0
	Local $iError = @error

	While $iMainBufferSize And Not $iError

		Local $iBufferSize = $iMainBufferSize
		If $iBufferSize > $iMaxBufferSize Then
			$iBufferSize = $iMaxBufferSize
		EndIf

		$iMainBufferSize -= $iBufferSize

		Local $dwFileOffsetLow = Dec(Hex($dwFileOffset, 8))
		Local $dwFileOffsetHigh = Dec(StringLeft(Hex($dwFileOffset, 16), 8))

		$a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _
			"hwnd", $hFileMappingObject, _
			"dword", 4, _ ; FILE_MAP_READ
			"dword", $dwFileOffsetHigh, _
			"dword", $dwFileOffsetLow, _
			"dword", $iBufferSize)

		If @error Or Not $a_hCall[0] Then
			If @error Then $iError = 3
			ExitLoop
		EndIf

		$dwFileOffset += $iBufferSize

		Local $pFile = $a_hCall[0]

		DllCall("advapi32.dll", "none", "MD5Update", _
			"ptr", DllStructGetPtr($tMD5_CTX), _
			"ptr", $pFile, _
			"dword", $iBufferSize)

		If @error Then $iError = 5

		DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile)

	WEnd

	DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject)

	If $iError Then Return SetError($iError, 0, "")

	DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX))

	If @error Then Return SetError(6, 0, "")

	Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest"))

	Return SetError(0, 0, $sMD5)

EndFunc   ;==>_MD5ForBigFile
 
Верх