PDA

Показать полную графическую версию : [Архив - Часть 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

tyrty_a
27-06-2008, 12:54
думаю, можно узнать список установленных 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 тоже не срабатывала.

amel27
28-06-2008, 12:36
Расскажи по-подробнее пожалуйста, как это можно сделать? »
оказалось, на оффсайте есть готовое решение (вопросы можно сюда) :
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

amel27
30-06-2008, 12:25
все же я видел программу(тоже связаную с удаленным администратированием), которая блокировала клавиатуру полностью и 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:

Creat0R
30-06-2008, 16:53
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

Creat0R
30-06-2008, 19:45
Maza Faka, Так сойдёт? »
Ещё как сойдёт! (мне в принципе нужна только часть в цикле).
Я давно хотел узнать как отслеживать это сочетание, мне это нужно для моей утилитки KeyBoard and Mouse Cleaner (http://creator-lab.ucoz.ru/load/5-1-0-15), до сих пор приходилось проверять различия в позициях курсора мышки (до, и после BlockInput()), если есть различия, значит юзер нажал «Ctrl + Alt + Del», т.к по другому выйти с режима блокировки вроде нельзя :).

Спасибо.

amel27
01-07-2008, 05:13
Creat0R, Maza Faka

все это хорошо, я даже почти поверил что это можно осуществить только средствами AutoIT (хотя и не просто), но не дает покоя один момент - если параметр передавать в функцию без кавычек, то блокировка не снимается... почему?.. все равно AutoIT перед передачей преобразует тип к "int", прямо мистика какая-то... :o

Creat0R
01-07-2008, 05:43
amel27, если параметр передавать в функцию без кавычек, то блокировка не снимается... почему? »
Возможно на стороне функции параметр преобразуется обратно в String? :dont-know
Хотя всё ровно не логично... но также и не удевительно (для меня), я уже сталкивался с багами подобного характера (в более простых приминениях, сейчас точно не вспомню где конкретно).

Как я понял всё же есть вариант на чистом AutoIt'е? проблема только в передаче параметра без кавычек? Пусть будут кавычки :)

amel27
01-07-2008, 07:16
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)

amel27
04-07-2008, 13:29
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
Спасибо за пример. А поиск во вложенных контейнерах сложная задача?

Mogidin
04-07-2008, 15:56
Информация к размышлению. Сам только что случайно увидел.
При копировании файла с одного диска на другой время последнего изменения у нового файла увеличивается на 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


После завершения прогрессбара скрипт закрывается как и нужно. Но проблема в том, что он в это время не обрабатывает сообщения. Можно как-то сделать, чтобы он и сообщения обрабатывал и закрывался самостоятельно?

Creat0R
04-07-2008, 20:07
Понадобилась снова помощь по регулярным выражениям...

Имеем исходный код страницы (это только часть, оно повторяется по той же структуре далее):

<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&amp;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