Войти

Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [65] 66 67 68 69 70 71 72 73 74 75 76 77 78

Maza Faka
14-12-2008, 07:39
как при автоматической установки программ в файле RunOnceEx сделать паузы между командами »
IMHO - вариант с паузой ненадёжен, кто знает сколько времени понадобится CMD-файлу на запуск?
Лучше доверить это дело самому CMD-файлу:

Start /WAIT "" "%systemdrive%\install\winrar\win.exe" /(ключ)

В этом случае CMD-файл дождётся завершения работы программы и только потом завершиться сам, а файл RunOnceEx в свою очередь будет ждать завершения работы CMD-файла :)

morgan1991
15-12-2008, 01:41
А вот у меня такой вопросик, может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу?
Можно с подключением библиотек только можно попонятней если с библиотеками?

Creat0R
15-12-2008, 01:49
morgan1991, может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу? »
Первое (и единственное :)) что приходит на ум, так это проверять ком. строку запуска у всех процессов, и если присутствует путь к нашему файлу, то блокировать/убивать процесс (выводя сообщение, ну или без).

amel27
15-12-2008, 11:27
может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу? »какому пользователю и к какому файлу?.. нужен пример или описание сути проблемы
Первое (и единственное ) что приходит на ум »мне первой пришла в голову установка NTFS-прав на файл через CACLS

Creat0R
15-12-2008, 11:49
мне первой пришла в голову установка NTFS-прав на файл через CACLS »
А оно не требует NTFS системы?

Maza Faka
15-12-2008, 12:38
А оно не требует NTFS системы? »
Хм... как ты себе представляешь разграничение прав на FAT? :)

Creat0R
15-12-2008, 13:00
как ты себе представляешь разграничение прав на FAT? »
Да вообще то никак, поэтому и спрашиваю. Мне никогда не приходилось ограничивать какие либо права для юзера :) Ну тогда как на Fat заблокировать? только озвученным мной ранее методом? :biggrin:

Maza Faka
15-12-2008, 13:44
Ну тогда как на Fat заблокировать? »
Вопрос интересный, сам не раз об этом думал, ведь есть же программы позволяющие блокировать доступ к файлам по паролю, независимо от типа ФС.

morgan1991
15-12-2008, 14:52
Вообщем хочется сделать чтобы независимо какой файл можно было заблокировать, допустим будет выбрано несколько файлов а программа будет запрещеть доступ к ним независимо от прав пользователя.

Maza Faka
15-12-2008, 16:19
Вообщем хочется сделать чтобы независимо какой файл можно было заблокировать »
Примитивный вариант:
$sFile = FileOpenDialog("Select a file", "", "All files (*.*)")
If @error Then Exit

Global $sPass = InputBox("File security", "Please set a password", "", "*")
If @error Then Exit

Global $hFile = _CreateFile($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")

HotKeySet("^d", "_Decrypt") ;Ctrl + d

While 1
Sleep(100)
WEnd

Func _CreateFile($sFile)
Local Const $GENERIC_READ = 0x80000000
Local Const $GENERIC_WRITE = 0x40000000
Local Const $OPEN_EXISTING = 3

$sFile = "\\.\" & $sFile

Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
"str", $sFile, _
"int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
"int", 0, _
"ptr", 0, _
"int", $OPEN_EXISTING, _
"int", 0, _
"int", 0)
Return $aRet[0]
EndFunc ;==>_CreateFile

Func _Decrypt()
Local $sCurPass = InputBox("File security", "Please enter a password", "", "*")
If @error Then Return 0

If $sCurPass == $sPass Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
MsgBox(64, "Success", "File decrypted")
Exit
Else
MsgBox(16, "Error", "Access denied")
EndIf
EndFunc ;==>_Decrypt
Тестировалось на:
WinXP SP3 FS:NTFS

Creat0R
15-12-2008, 16:25
А вот вариант куда более примитивный (для 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

:biggrin:

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

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

morgan1991
16-12-2008, 15:48
Этот вариант мне больше понравился:

$sFile = FileOpenDialog("Select a file", "", "All files (*.*)")
If @error Then Exit

Global $sPass = InputBox("File security", "Please set a password", "", "*")
If @error Then Exit

Global $hFile = _CreateFile($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")

HotKeySet("^d", "_Decrypt") ;Ctrl + d

While 1
Sleep(100)
WEnd

Func _CreateFile($sFile)
Local Const $GENERIC_READ = 0x80000000
Local Const $GENERIC_WRITE = 0x40000000
Local Const $OPEN_EXISTING = 3

$sFile = "\\.\" & $sFile

Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
"str", $sFile, _
"int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
"int", 0, _
"ptr", 0, _
"int", $OPEN_EXISTING, _
"int", 0, _
"int", 0)
Return $aRet[0]
EndFunc ;==>_CreateFile

Func _Decrypt()
Local $sCurPass = InputBox("File security", "Please enter a password", "", "*")
If @error Then Return 0

If $sCurPass == $sPass Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
MsgBox(64, "Success", "File decrypted")
Exit
Else
MsgBox(16, "Error", "Access denied")
EndIf
EndFunc ;==>_Decrypt

Только вот здесь нельзя выбрать несколько файлов и нельзя выбрать целую папку, в отличии от кода предложенного Creat0R-ом. А в коде Creat0R-а не совсем всё работает. Допустим если закрыть доступ к файлу и открыть его вордом то он без проблем откроется или музыкальный файл с таким же успехом открывается в любом плеере.

МОжет кто подправит?

BadEvent
16-12-2008, 18:30
Всё, разобрался сам, спасибо)

Creat0R
17-12-2008, 01:42
morgan1991, МОжет кто подправит? »
Другой вариант - (почти) Утилита BlockIt (http://creator-lab.ucoz.ru/AutoIt/BlockIt_Utility.au3). Основана на идее от Maza Faka :)

Maza Faka
17-12-2008, 07:19
нельзя выбрать целую папку »
Можно :)
$sFile = FileSelectFolder("Select the folder", "")
If @error Then Exit

Global $sPass = InputBox("File security", "Please set a password", "", "*")
If @error Then Exit

Global $hFile = _CreateFile($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")

HotKeySet("^d", "_Decrypt") ;Ctrl + d

While 1
Sleep(100)
WEnd

Func _CreateFile($sFile)
Local Const $GENERIC_READ = 0x80000000
Local Const $GENERIC_WRITE = 0x40000000

Local Const $FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
Local Const $OPEN_EXISTING = 3

$sFile = "\\.\" & $sFile

Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
"str", $sFile, _
"int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
"int", 0, _
"ptr", 0, _
"int", $OPEN_EXISTING, _
"int", $FILE_FLAG_BACKUP_SEMANTICS, _ ;Что бы получить дескриптор каталога, установите флажок FILE_FLAG_BACKUP_SEMANTICS
"int", 0)
Return $aRet[0]
EndFunc ;==>_CreateFile

Func _Decrypt()
Local $sCurPass = InputBox("File security", "Please enter a password", "", "*")
If @error Then Return 0

If $sCurPass == $sPass Then
DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
MsgBox(64, "Success", "File decrypted")
Exit
Else
MsgBox(16, "Error", "Access denied")
EndIf
EndFunc ;==>_Decrypt
А если ещё кто-нибудь знает как отловить обращение к файлу/папке, то можно написать неплохую программку :)

morgan1991
17-12-2008, 20:40
В автоите 3.2.8.1 это работает
GUICreate("MpF realmlist ver 0.6", 400, 400, -1, -1, $WS_POPUP)
А в автоите 3.2.12.1 ругается на $WS_POPUP. На что это можно заменить?

SyDr
17-12-2008, 21:10
AutoIt3\Include\WindowsConstants.au3
Global Const $WS_POPUP = 0x80000000

Та же фигня была. Потом пропало. Не знаю, почему.
М. б. из-за того что установил полный SciTE4AutoIt3 (http://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe). Не знаю точно.

Creat0R
17-12-2008, 23:25
А если ещё кто-нибудь знает как отловить обращение к файлу/папке, то можно написать неплохую программку »
Пока придумал только отлов системного сообщения, утилиту запаковал сюда (http://creator-lab.ucoz.ru/AutoIt/BlockIt_Utility.zip), если найдутся тестеры, можно дальше развивать ;).

shyra1976
18-12-2008, 17:37
помогите
написал тут код ,Но есть проблема
Я могу закрит иконку ,толко нажав ESC или Enter что надо даписат что бы иконка закривалас при нажатии мышки на нее?
TEMP = дорожка к *.png($temp = "E:\VBA\AutoIt\GUI\1.png" )

#NoTrayIcon
#include <GDIPlus.au3>; this is where the magic happens, people
#include <GuiComboBox.au3>
#include <File.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>

Global Const $AC_SRC_ALPHA = 1, $ULW_ALPHA = 2
Global $launchDir = @DesktopDir, $GUI
;~ Dim $temp1
$temp = "E:\VBA\AutoIt\GUI\1.png"
Transp_PNG($temp)

Func Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)


If $iOpacity < 0 Then $iOpacity = 0
If $iOpacity > 255 Then $iOpacity = 255

; Load PNG file as GDI bitmap
_GDIPlus_Startup()
$pngSrc = $temp
$hImage = _GDIPlus_ImageLoadFromFile($pngSrc)

; Extract image width and height from PNG
$width = _GDIPlus_ImageGetWidth($hImage)
$height = _GDIPlus_ImageGetHeight($hImage)


; Create layered window

$GUI = GUICreate("lod3n launcher", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)

GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUISetState()
WinSetOnTop($GUI, "", 1)

If $EnableFade Then
;fade in png background
For $i = 0 To $iOpacity Step 1
SetBitmap($GUI, $hImage, $i)
Next
Else
SetBitmap($GUI, $hImage, $iOpacity)
EndIf



; set default button for Enter key activation - renders outside GUI window
$BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)

While 1

Switch GUIGetMsg()

Case $GUI_EVENT_CLOSE, $BtnExit
ExitLoop

EndSwitch
WEnd

If $EnableFade Then
;fade out png background
For $i = $iOpacity To 0 Step -1
SetBitmap($GUI, $hImage, $i)
Next
Else
SetBitmap($GUI, $hImage, 0)
EndIf
EndFunc ;==>Transp_PNG

Func CancelPressed()
Exit
EndFunc
; ====================================================================================================

; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
; ====================================================================================================

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
If ($hWnd = $GUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc ;==>WM_NCHITTEST

; ====================================================================================================

; SetBitMap
; ====================================================================================================


Func SetBitmap($hGUI, $hImage, $iOpacity)
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

$hScrDC = _WinAPI_GetDC(0)
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize)
DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
$tSource = DllStructCreate($tagPOINT)
$pSource = DllStructGetPtr($tSource)
$tBlend = DllStructCreate($tagBLENDFUNCTION)
$pBlend = DllStructGetPtr($tBlend)
DllStructSetData($tBlend, "Alpha", $iOpacity)
DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
_WinAPI_ReleaseDC(0, $hScrDC)
_WinAPI_SelectObject($hMemDC, $hOld)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>SetBitmap

morgan1991
18-12-2008, 18:05
Пока придумал только отлов системного сообщения, утилиту запаковал сюда, если найдутся тестеры, можно дальше развивать . »
Если закрыть доступ к текстовому файлу с расширением .php (на других не пробовал) тогда документ открывается с помощью notepad.




© OSzone.net 2001-2012