Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


А вот вариант куда более примитивный (для Fat):

Код: Выделить весь код
HotKeySet("{ESC}", "Quit")

;Global $sBlock_Password = "Pass"

Global $sBlockFiles_List = "C:\Temp\Readme.txt|C:\Temp\Web.doc|C:\Temp\DXSETUP.exe"
Global $aBlockFiles_List = StringSplit($sBlockFiles_List, "|")

While 1
    Sleep(1000)

    $aProcess_Info = _ProcessesGetInfo()

    For $i = 1 To UBound($aProcess_Info)-1
        For $j = 1 To $aBlockFiles_List[0]
            If StringInStr($aProcess_Info[$i][1], $aBlockFiles_List[$j]) Or $aProcess_Info[$i][7] = $aBlockFiles_List[$j] Then
                _BlockFile_Proc($aBlockFiles_List[$j], $aProcess_Info[$i][26])
                ExitLoop
            EndIf
        Next
    Next
WEnd

Func _BlockFile_Proc($sFile, $iProc)
    ;_ProcessSuspendSwitch($iProc, True)

    Local $hBlockedFile_Win = _ProcessGetWindow($iProc)

;~  Local $s_Password = InputBox(StringFormat("File Blocked (%s) - Attention!", StringRegExpReplace($sFile, "^.*\\", "")), _
;~      "Blocked File Execution attempt. Please insert password to unlock it:", "", "*", 300, 120, -1, -1, 0, $hBlockedFile_Win[1])

    MsgBox(262144+48, "File Blocker - Attention!", _
        StringFormat("You are not allowed to open this File (%s)", _
            StringRegExpReplace($sFile, "^.*\\", "")), 0, $hBlockedFile_Win[1])

    ;If $s_Password = $sBlock_Password Then Return _ProcessSuspendSwitch($iProc, False)
    Return ProcessClose($iProc)
EndFunc

Func _ProcessesGetInfo()
    Local $oColItems, $objWMIService, $objItem, $cI_Compname = @ComputerName
    Local $aProcessInfo[1000][42], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
    $oColItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL")

    If Not IsObj($oColItems) Then Return SetError(1, 2, 0)

    For $objItem In $oColItems
        $aProcessInfo[$i][0]  = $objItem.Name
        $aProcessInfo[$i][1]  = $objItem.CommandLine
        $aProcessInfo[$i][2]  = $objItem.CreationClassName
        $aProcessInfo[$i][3]  = $objItem.CreationDate
        $aProcessInfo[$i][4]  = $objItem.Description
        $aProcessInfo[$i][5]  = $objItem.CSCreationClassName
        $aProcessInfo[$i][6]  = $objItem.CSName
        $aProcessInfo[$i][7]  = $objItem.ExecutablePath
        $aProcessInfo[$i][8]  = $objItem.ExecutionState
        $aProcessInfo[$i][9]  = $objItem.Handle
        $aProcessInfo[$i][10] = $objItem.HandleCount
        $aProcessInfo[$i][11] = $objItem.KernelModeTime
        $aProcessInfo[$i][12] = $objItem.MaximumWorkingSetSize
        $aProcessInfo[$i][13] = $objItem.MinimumWorkingSetSize
        $aProcessInfo[$i][14] = $objItem.OSCreationClassName
        $aProcessInfo[$i][15] = $objItem.OSName
        $aProcessInfo[$i][16] = $objItem.OtherOperationCount
        $aProcessInfo[$i][17] = $objItem.OtherTransferCount
        $aProcessInfo[$i][18] = $objItem.PageFaults
        $aProcessInfo[$i][19] = $objItem.PageFileUsage
        $aProcessInfo[$i][20] = $objItem.ParentProcessId
        $aProcessInfo[$i][21] = $objItem.PeakPageFileUsage
        $aProcessInfo[$i][22] = $objItem.PeakVirtualSize
        $aProcessInfo[$i][23] = $objItem.PeakWorkingSetSize
        $aProcessInfo[$i][24] = $objItem.Priority
        $aProcessInfo[$i][25] = $objItem.PrivatePageCount
        $aProcessInfo[$i][26] = $objItem.ProcessId
        $aProcessInfo[$i][27] = $objItem.QuotaNonPagedPoolUsage
        $aProcessInfo[$i][28] = $objItem.QuotaPagedPoolUsage
        $aProcessInfo[$i][29] = $objItem.QuotaPeakNonPagedPoolUsage
        $aProcessInfo[$i][30] = $objItem.QuotaPeakPagedPoolUsage
        $aProcessInfo[$i][31] = $objItem.ReadOperationCount
        $aProcessInfo[$i][32] = $objItem.ReadTransferCount
        $aProcessInfo[$i][33] = $objItem.SessionId
        $aProcessInfo[$i][34] = $objItem.Status
        $aProcessInfo[$i][35] = $objItem.ThreadCount
        $aProcessInfo[$i][36] = $objItem.UserModeTime
        $aProcessInfo[$i][37] = $objItem.VirtualSize
        $aProcessInfo[$i][38] = $objItem.WindowsVersion
        $aProcessInfo[$i][39] = $objItem.WorkingSetSize
        $aProcessInfo[$i][40] = $objItem.WriteOperationCount
        $aProcessInfo[$i][41] = $objItem.WriteTransferCount

        $i += 1
    Next

    $aProcessInfo[0][0] = $i-1
    ReDim $aProcessInfo[$i][42]

    If $aProcessInfo[0][0] < 1 Then Return SetError(1, 1, 0)

    Return $aProcessInfo
EndFunc

Func _ProcessGetWindow($iPID)
    Local $aWinList = WinList()
    Local $aRet[2]

    If IsString($iPID) Then $iPID = ProcessExists($iPID)

    For $i = 1 To UBound($aWinList)-1
        If WinGetProcess($aWinList[$i][1]) = $iPID Then
            $aRet[0] = $aWinList[$i][0] ;Title
            $aRet[1] = $aWinList[$i][1] ;WinHandle

            Return $aRet
        EndIf
    Next

    Return SetError(1, 0, $aRet)
EndFunc

Func _ProcessSuspendSwitch($iPIDOrName, $iSuspend = True)
    If IsString($iPIDOrName) Then $iPIDOrName = ProcessExists($iPIDOrName)
    If Not $iPIDOrName Then Return SetError(1, 0, 0)

    Local $aNtSuspResumProc
    Local $ah_OpProcess = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', False, 'int', $iPIDOrName)

    If $iSuspend Then
        $aNtSuspResumProc = DllCall("ntdll.dll", "int", "NtSuspendProcess", "int", $ah_OpProcess[0])
    Else
        $aNtSuspResumProc = DllCall("ntdll.dll", "int", "NtResumeProcess", "int", $ah_OpProcess[0])
    EndIf

    DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ah_OpProcess)

    If IsArray($aNtSuspResumProc) Then Return 1
    Return SetError(2, 0, 0)
EndFunc

Func Quit()
    Exit
EndFunc


Работает не для всех файлов, зависит от приложения сопоставленного с типом файла.

Цитата Maza Faka:
Тестировалось на:
WinXP SP3 FS:NTFS »
Работает и в «WinXP SP2 FS:FAT»

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:25, 15-12-2008 | #1291