Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
думаю, можно узнать список установленных TCP-соединений (а-ля NETSTAT), »
Расскажи по-подробнее пожалуйста, как это можно сделать?
leprecon
27-06-2008, 15:41
вплоть до управления скриптом по сети... »
А я почему то думал, что на Autoit нельзя создать что-то типа клиент-сервер :unsure:
leprecon
27-06-2008, 17:47
Выкладываю немного адаптированый под 3-ю версию радмина скрипт от Amel27(из-за кривых рук не смог нормально заставить работать Au3toPost :( , поэтому выкладываю нераскрашеный код):
$objWMI = ObjGet("winmgmts:{(Security)}\\.\root\cimv2")
; Создаем фильтр событий, фиксируемых скриптом
$colEvents = $objWMI.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
"TargetInstance ISA 'Win32_NTLogEvent' " & _ ; источник событий - журнал событий
"AND TargetInstance.Logfile='Application' " & _ ; только журнал приложений
"AND TargetInstance.SourceName='RServer3'") ; только Remote Administrator
While 1
$objEvent = $colEvents.NextEvent ; Ожидание события
$sText = ""
For $s in $objEvent.TargetInstance.InsertionStrings
$sText &= $s ; Текст события
Next
Switch $objEvent.TargetInstance.EventIdentifier
Case 1001 ; Код обработки события отключения
Consolewrite( "Text: " & $sText & @CR )
BlockInput( 1 )
Case 2000 ; Код обработки события подключения
Consolewrite( "Text: " & $sText & @CR )
BlockInput(0)
EndSwitch
Wend
Но у этого скрипта есть недостаток, для меня не сильно принципиальный но все же недостаток: Не работает клавиатура, ни удаленная, ни локальная, хотя мышь (локальная) работает нормально.
Так же на удаленной клавиатуре можно разблокировать клавиатуру нажатием CTRL-ALT-DEL . Да, я знаю, что это опция Windows API. Но все же я видел программу(тоже связаную с удаленным администратированием), которая блокировала клавиатуру полностью и CTRL-ALT-DEL тоже не срабатывала.
Расскажи по-подробнее пожалуйста, как это можно сделать? »
оказалось, на оффсайте есть готовое решение (вопросы можно сюда) :
Netstat in AutoIt - GetTcpTable (iphlpapi.dll), Sometimes crashes and sometimes works, why? (http://www.autoitscript.com/forum/index.php?showtopic=37304&hl=GetTCPTable)
А я почему то думал, что на Autoit нельзя создать что-то типа клиент-сервер »на оффсайте достаточно инфы и примеров: http://www.google.com/search?as_q=server+client&hl=ru&client=opera&rls=ru&num=100&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&as_epq=&as_oq=&as_eq=&lr=&cr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=www.autoitscript.com%2Fforum&as_rights=&safe=images
все же я видел программу(тоже связаную с удаленным администратированием), которая блокировала клавиатуру полностью и CTRL-ALT-DEL тоже не срабатывала »ТУТ (http://www.codeproject.com/KB/winsdk/AntonioWinLock.aspx) есть интересная DLL-ка (с исходниками и демкой), которая кроме прочего имеет ф-цию включения/отключения <Ctrl+Alt+Del> пример:$hDll = DllOpen("WinLockDll.dll")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "0")
MsgBox(48,"Message","Ctrl+Alt+Del Disabled," &@CRLF& "Press any key for enable")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "1")
Maza Faka
30-06-2008, 14:09
интересная DLL-ка (с исходниками и демкой) »
Вот спасибо! Отличная dll-ка :up:
amel27,
кроме прочего имеет ф-цию включения/отключения <Ctrl+Alt+Del> »
А вот можно таже отслеживать нажатия этих клавиш? т.е нужен метод определяющий были ли вызваны сочетания клавиш «Ctrl+Alt+Del».
Maza Faka
30-06-2008, 19:10
А вот можно таже отслеживать нажатия этих клавиш? »
Так сойдёт?
Global Const $VK_CTRL = 0x11
Global Const $VK_ALT = 0x12
Global Const $VK_DEL = 0x2E
HotKeySet("{ESC}", "_Exit")
$hDll = DllOpen(@ScriptDir & "\WinLockDll.dll")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "0")
While 1
$aCtrlRet = DllCall("user32", "ushort", "GetKeyState", "int", $VK_CTRL)
$aCtrlAlt = DllCall("user32", "ushort", "GetKeyState", "int", $VK_ALT)
$aCtrlDel = DllCall("user32", "ushort", "GetKeyState", "int", $VK_DEL)
If ($aCtrlRet[0] > 1) And ($aCtrlAlt[0] > 1) And ($aCtrlDel[0] > 1) Then MsgBox(262144, "Catch", "Ctrl - Alt - Del is pressed")
Sleep(1)
WEnd
Func _Exit()
Local $aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "1")
DllClose($hDll)
Exit
EndFunc
Maza Faka, Так сойдёт? »
Ещё как сойдёт! (мне в принципе нужна только часть в цикле).
Я давно хотел узнать как отслеживать это сочетание, мне это нужно для моей утилитки KeyBoard and Mouse Cleaner (http://creator-lab.ucoz.ru/load/5-1-0-15), до сих пор приходилось проверять различия в позициях курсора мышки (до, и после BlockInput()), если есть различия, значит юзер нажал «Ctrl + Alt + Del», т.к по другому выйти с режима блокировки вроде нельзя :).
Спасибо.
Creat0R, Maza Faka
все это хорошо, я даже почти поверил что это можно осуществить только средствами AutoIT (хотя и не просто), но не дает покоя один момент - если параметр передавать в функцию без кавычек, то блокировка не снимается... почему?.. все равно AutoIT перед передачей преобразует тип к "int", прямо мистика какая-то... :o
amel27, если параметр передавать в функцию без кавычек, то блокировка не снимается... почему? »
Возможно на стороне функции параметр преобразуется обратно в String? :dont-know
Хотя всё ровно не логично... но также и не удевительно (для меня), я уже сталкивался с багами подобного характера (в более простых приминениях, сейчас точно не вспомню где конкретно).
Как я понял всё же есть вариант на чистом AutoIt'е? проблема только в передаче параметра без кавычек? Пусть будут кавычки :)
Creat0R
Возможно на стороне функции параметр преобразуется обратно в String? »нет, точно не преобразуется - в исходнике видно что там тип BOOL, который основан на том же INT
я уже сталкивался с багами подобного характера »самое забавное, что на AutoHotKey тот же эффект, сказываются общие корни? =)
Как я понял всё же есть вариант на чистом AutoIt'е? »нет, я просто просмотрел исходник на Си и комменты автора - в принципе если задача обойтись без DLL, то ничего невозможного нет... хотя "чистым AutoIT" это уже назвать не выйдет - придется собирать кусок ASM-кода (как это делал Piccaso в CallBack) и инжектировать в процесс Winlogon. Кстати, возможны проблемы с некоторыми файерволами... к примеру, Outpost (http://wasm.ru/article.php?article=fwb) блокирует подобное поведение
проблема только в передаче параметра без кавычек? »просто зацепило :)
leprecon
01-07-2008, 19:59
на оффсайте достаточно инфы и примеров »
Ну для меня Оффсайт дремучий лес, так как я в английском полный ноль :(
Maza Faka
03-07-2008, 12:20
amel27,
Нужна твоя помощь :) Необходимо получить список компьютеров локальной сети, в принципе решение есть (твой скрипт для Nicklock-a), но из "спортивного" интереса хотелось бы получить список с помощью нижеуказанных функций:
Global Const $RESOURCE_CONTEXT = 0x5
Global Const $RESOURCETYPE_DISK = 0x1
Global Const $NO_ERROR = 0
Global Const $ERROR_NO_MORE_ITEMS = 259
Global Const $ERROR_INVALID_ADDRESS = 487
$lpBuffer = DllStructCreate("dword[16384]")
$pBuffer = DllStructCreate("hwnd")
$aRet = DllCall("mpr.dll", "dword", "WNetOpenEnum", "dword", $RESOURCE_CONTEXT, "dword", $RESOURCETYPE_DISK, "dword", 0, "ptr", 0, _
"ptr", DllStructGetPtr($pBuffer))
If $aRet[0] <> $NO_ERROR Then
MsgBox(16, "Error", "Dll call error")
Exit
EndIf
$hWnd = DllStructGetData($pBuffer, 1)
$aRet = DllCall("mpr.dll", "int", "WNetEnumResource", "hwnd", $hWnd, "dword", -1, _
"ptr", DllStructGetPtr($lpBuffer), "dword", DllStructGetSize($lpBuffer))
ConsoleWrite("!> Ret: " & $aRet[0] & @LF)
DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hWnd)
Ссылки:
WNetOpenEnum (http://msdn.microsoft.com/en-us/library/aa385478(VS.85,printer).aspx)
WNetEnumResource (http://msdn.microsoft.com/en-us/library/aa385449(VS.85,printer).aspx)
Maza Faka
примерно так, но функция сама не ищет во вложенных контейнерах,
в твоем случае она возвратит только объект "Вся сеть" ;)
Global Const $NO_ERROR = 0
Global Const $ERROR_NO_MORE_ITEMS = 259
Global Const $ERROR_MORE_DATA = 234
Global Const $MAX_RESOURCES = 256
Global Const $NOT_A_CONTAINER = -1
Global Const $RESOURCETYPE_ANY = 0
Global Const $RESOURCETYPE_DISK = 1
Global Const $RESOURCETYPE_PRINT = 2
Global Const $RESOURCE_CONNECTED = 1
Global Const $RESOURCE_GLOBALNET = 2
Global Const $RESOURCE_REMEMBERED = 3
Global Const $RESOURCE_CONTEXT = 5
Func _WNet_EnumResource($iType = $RESOURCETYPE_ANY, $iScope = $RESOURCE_CONTEXT)
Local $tBuf = DllStructCreate("hwnd"), $pBuf = DllStructGetPtr($tBuf)
Local $aRet = DllCall("mpr.dll", "int", "WNetOpenEnum", "int", $iScope, "int", $iType, "int", 0, "ptr", 0, "ptr", $pBuf)
If $aRet[0] Then Return SetError(2, $aRet[0])
Local $hEnum = DllStructGetData($tBuf,1)
Local $tCount = DllStructCreate("int"), $pCount = DllStructGetPtr($tCount)
Local $tBSize = DllStructCreate("int"), $pBSize = DllStructGetPtr($tBSize)
DllStructSetData($tCount, 1, -1)
$aRet = DllCall("mpr.dll", "int", "WNetEnumResource", "hwnd", $hEnum, "ptr", $pCount, "ptr", $pBuf, "ptr", $pBSize)
If $aRet[0]=0 Then
DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
Return SetError(1, 0)
ElseIf $aRet[0]<>$ERROR_MORE_DATA Then
DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
Return SetError(3, $aRet[0])
EndIf
DllStructSetData($tCount, 1, -1)
$tBuf = DllStructCreate("byte["& DllStructGetData($tBSize,1) &"]")
$pBuf = DllStructGetPtr($tBuf)
$aRet = DllCall("mpr.dll", "int", "WNetEnumResource", "hwnd", $hEnum, "ptr", $pCount, "ptr", $pBuf, "ptr", $pBSize)
If $aRet[0] Then
DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
Return SetError(4, $aRet[0])
EndIf
DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
Return SetError(0, DllStructGetData($tCount,1), $tBuf)
EndFunc
Maza Faka
04-07-2008, 15:38
amel27
Спасибо за пример. А поиск во вложенных контейнерах сложная задача?
Информация к размышлению. Сам только что случайно увидел.
При копировании файла с одного диска на другой время последнего изменения у нового файла увеличивается на 1 секунду. Это происходит и при копировании в эксплорере, и в автоите функцией FileCopy. Можно этого как-нибудь избежать (кроме варианта с FileSetTime, менять время у кучи файлов непонтово)?
Maza Faka
04-07-2008, 17:04
Mogidin
Вроде бы уже обсуждали такую проблему, поищи в версии для печати.
Алексей Н.
04-07-2008, 19:09
Есть ли возможность принудительно завершить скрипт через какое-то время, если не были приняты никакие действия?
Сейчас я делаю это через задницу. У меня есть два скрипта один из которых запускает второй и через 20 секунд прибивает его. Но хочется сделать одним скриптом и покрасивее. С прогрессбаром.
Вот код скрипта
GuiCreate("Переименование учетной записи администратора", 300, 100)
$name=GUICtrlCreateInput("",25,30)
GuiCtrlCreateLabel("Введите имя Вашей учетной записи", 5, 1, 300, 10)
$rename=GuiCtrlCreateButton("Переименовать", 10, 60, 100, 30)
$chanel=GuiCtrlCreateButton("Отменить", 190, 60, 100, 30)
$progressbar = GUICtrlCreateProgress (10,10,200,20)
; GUI MESSAGE LOOP
GuiSetState()
For $i = 1 To 100
GUICtrlSetData ($progressbar,(100 - $i))
Sleep(30)
Next
ProcessClose("Rename_User.exe")
While 1
$msg = GUIGetMsg()
Select
Case $msg = $rename
FileCopy("RENUSER.EXE",@SystemDir)
Sleep (1000)
Run("RENUSER.EXE Администратор " & GUICtrlRead($name))
Sleep (1000)
FileDelete(@SystemDir & "\RENUSER.EXE")
ExitLoop
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $chanel
ExitLoop
EndSelect
WEnd
После завершения прогрессбара скрипт закрывается как и нужно. Но проблема в том, что он в это время не обрабатывает сообщения. Можно как-то сделать, чтобы он и сообщения обрабатывал и закрывался самостоятельно?
Понадобилась снова помощь по регулярным выражениям...
Имеем исходный код страницы (это только часть, оно повторяется по той же структуре далее):
<div class="vldescbox">
<div class="vltitle">
<div class="vlshortTitle">
<a href="/watch?v=UiPhfbZsS54" title="WTTC 2008 table tennis best points.... enjoy">WTTC <b>2008 table tennis</b> best points.... enjoy</a>
</div>
<div class="vllongTitle">
<a href="/watch?v=UiPhfbZsS54" title="WTTC 2008 table tennis best points.... enjoy">WTTC <b>2008 table tennis</b> best points.... enjoy</a>
</div>
</div>
<div class="vldesc">
the WTTC <b>2008 table tennis</b> best points.... enjoy <b>...</b> WTTC <b>2008 table tennis</b> best points extreme ma lin <b>...</b>
</div>
</div>
<div class="vlclearaltl"></div>
</div>
<div class="vlfacets">
<div class="vladded">
<span class="grayText">Added:</span> 3 months ago<br/>
</div>
<div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/kioka2" >kioka2</a></span></div>
<div class="clearL"></div>
<span class="grayText">Views:</span> 59,747<br/>
<div class="video-thumb-duration-rating">
<div>
<img class="ratingVS ratingVS-5.0" alt="4.9" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" />
</div>
<div class="runtime">07:26</div>
</div>
<div class="clear"></div>
<div class="vlcategory">
<span class="smgrayText">More in</span> <a href="/results?search_category=17&search_query=table%20tennis%202008" >Sports</a>
</div>
</div>
<div class="vlclearaltl"></div>
</div> <!-- end vEntry -->
</div>
<div class="vlclear"></div>
<div class="vlcell" style="width:24.9%">
<div class="vlentry" >
<div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=EcIsmXhduVc" ><img src="http://i.ytimg.com/vi/EcIsmXhduVc/default.jpg" class="vimg120" title="Highlights of the 2008 Asian Olympic Table Tennis Quali" alt="video"></a><div class="addtoQL90"><a href="#" ql="EcIsmXhduVc" title="Add Video to QuickList"><img class="QLIconImg" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" border="0"
onclick="clicked_add_icon(this, this.parentNode.getAttribute('ql'), 0);_hbLink('QuickList+AddTo','na');return false;"
onmouseover="mouseOverQuickAdd(this, this.parentNode.getAttribute('ql'))"
onmouseout="mouseOutQuickAdd(this, this.parentNode.getAttribute('ql'))"></a><div class="hid quicklist-inlist">in <a href="/watch_queue?all">QuickList</a></div></div>
</div></div>
</div>
<div class="vldescbox">
<div class="vltitle">
<div class="vlshortTitle">
<a href="/watch?v=EcIsmXhduVc" title="Highlights of the 2008 Asian Olympic Table Tennis Quali">Highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Quali</a>
</div>
<div class="vllongTitle">
<a href="/watch?v=EcIsmXhduVc" title="Highlights of the 2008 Asian Olympic Table Tennis Quali">Highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Quali</a>
</div>
</div>
<div class="vldesc">
<span id="BeginvidDescEcIsmXhduVc">
highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Qualification. You will enjoy it! It concludes Wang Nan and Wang Liqin <b>...</b>
</span>
<span id="RemainvidDescEcIsmXhduVc" style="display: none">In this video you can see the highlights of the 2008 Asian Olympic Table Tennis Qualification. You will enjoy it! It concludes Wang Nan and Wang Liqin.</span>
<span id="MorevidDescEcIsmXhduVc" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescEcIsmXhduVc'); hideDiv('MorevidDescEcIsmXhduVc'); hideDiv('BeginvidDescEcIsmXhduVc'); showDiv('LessvidDescEcIsmXhduVc'); return false;">more</a>)</span>
<span id="LessvidDescEcIsmXhduVc" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescEcIsmXhduVc'); hideDiv('LessvidDescEcIsmXhduVc'); showDiv('BeginvidDescEcIsmXhduVc'); showDiv('MorevidDescEcIsmXhduVc'); return false;">less</a>)</span>
</div>
</div>
Нужно получить значения в массив либо между <div class="vldesc"> и </div>, либо между <div class="vldesc"><span id="BeginvidDesc.*?"> и </span>.
Оно может встречаться и так и так, нужно получить текст описании роликов (это с YouTube исходник).
Вот что должно быть на выходе:
$avArray[0] = "WTTC <b>2008 table tennis</b> best points.... enjoy <b>...</b> WTTC <b>2008 table tennis</b> best points extreme ma lin <b>...</b>"
$avArray[1] = "highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Qualification. You will enjoy it! It concludes Wang Nan and Wang Liqin <b>...</b>"
У меня получилось сделать только так:
#include <Array.au3>
$sSource = FileRead("Src.txt")
$avArray = StringRegExp($sSource, '(?i)(?s)<div class="vldesc">.*?[(<span id="BeginvidDesc.*?">|)](.*?)</span>', 3)
_ArrayDisplay($avArray)
Как видно, добавляется в начало span id="BeginvidDesc....">, а иногда и в конце тоже добавляются теги. Реально ли одно-разовым вызовом StringRegExp (и без дополнительных циклов) получить то что нужно?
Алексей Н., Есть ли возможность принудительно завершить скрипт через какое-то время, если не были приняты никакие действия? »
См. функцию _Timer_SetTimer() в справке.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC