Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
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
А вот у меня такой вопросик, может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу?
Можно с подключением библиотек только можно попонятней если с библиотеками?
morgan1991, может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу? »
Первое (и единственное :)) что приходит на ум, так это проверять ком. строку запуска у всех процессов, и если присутствует путь к нашему файлу, то блокировать/убивать процесс (выводя сообщение, ну или без).
может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу? »какому пользователю и к какому файлу?.. нужен пример или описание сути проблемы
Первое (и единственное ) что приходит на ум »мне первой пришла в голову установка NTFS-прав на файл через CACLS
мне первой пришла в голову установка NTFS-прав на файл через CACLS »
А оно не требует NTFS системы?
Maza Faka
15-12-2008, 12:38
А оно не требует NTFS системы? »
Хм... как ты себе представляешь разграничение прав на FAT? :)
как ты себе представляешь разграничение прав на 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
А вот вариант куда более примитивный (для 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
Всё, разобрался сам, спасибо)
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. На что это можно заменить?
AutoIt3\Include\WindowsConstants.au3
Global Const $WS_POPUP = 0x80000000
Та же фигня была. Потом пропало. Не знаю, почему.
М. б. из-за того что установил полный SciTE4AutoIt3 (http://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe). Не знаю точно.
А если ещё кто-нибудь знает как отловить обращение к файлу/папке, то можно написать неплохую программку »
Пока придумал только отлов системного сообщения, утилиту запаковал сюда (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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.