Войти

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

TERMINAL
08-11-2008, 18:06
Maza Faka, Желательно того на которое драйвера не установлены.

litus
08-11-2008, 18:07
По поводу удаления фостов после отработки скрипта есть остатки в :
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache]
"C:\\MyProga.exe"="MyProga"
Возможно ли удалить этот хвост если скрипт будет запускаться с разных деректорий.

TERMINAL
08-11-2008, 18:10
litus, RegDelete посмотри....

litus
08-11-2008, 20:38
Я и использую функцию "RegDelete" вот посмотрите даные реестра скрипт "nvda_L"

[HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache]
"C:\\SintezPark\\nvda\\nvda_L.exe"="nvda_L"
код :
RegDelete("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", ""nvda_L.exe"="nvda_L"")

Хотя даные "nvda_L.exe"="nvda_L" я уже тестировал как токо можно результат равен "неудача" этот премер вовсе выдал ошибку.
Тем более что в начале идет "c: что значит если я буду запускать скрипт с флешки то значение не удалиться а написать "F" здесь тоже не будет мнекажеться правельно так как неизвесно какая буква определиться на другой машине.

Creat0R
08-11-2008, 21:36
Я и использую функцию "RegDelete" вот посмотрите даные реестра »
Неверно используете ;)

Нужно так:

RegDelete("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", "nvda_L.exe")
Т.е нужно указывать ключ который следует удалить, значение не нужно.

Тем более что в начале идет "c: что значит если я буду запускать скрипт с флешки то значение не удалиться »
Для этого можно импровизировать, и удалять ключ по его значению (первое попавшееся):


_RegDeleteEx("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", "nvda_L")

Func _RegDeleteEx($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc

semiono
09-11-2008, 13:39
Есть идея, но неполучается релизовать. Я подумал, а может написать утилиту на AutoIt положить её в system32 и пользоваться. Надо зделать так чтоб файлик читал команду на входе и передавал её cmd.exe,
в его задачу только бы входило скрывать консоль. Вот что я мудрил тут, но безуспешно -
Run(@ComSpec & " /c " & '%1', "", @SW_HIDE)
Почему не работает и как это довести до ума?
Все проги типа hide cmd нифига не умеют, максимум что могут лишь батник запустить! А мне надо чтобы налету комманды передавались команд процессору, причём какие угодно, например: "/k start /w command1 & command2 & command3 & exit"
cmdow и chp вообще не могут работать без explorer.exe - лажёвые утилиты блин.

Может у когонибудь сохранилась утилита http://www.siginetsoftware.com/forum/showthread.php?t=18 ато ссылка битая, поглядеть бы что за тулс?

Есть ещё проблемма по автоиту, если скажем скрипт был запакован в SFX архив, который распаковывается во временную папку, то скрипт не может удалить исходный файл архива! Нсмотря на то что по идее сабж уже
находится в темп папке и исходный архив по идее уже и не нужен как бы! Ведь сабж уже в темп фолдере!
Тем не менее запускающий архив защищён, можно подумать что контент обратно в него из темпа заархивируется
после выполнения -чушь! Но такова реальность! 0_.

Creat0R
09-11-2008, 14:01
semiono, Почему не работает »
Как проверяется что оно не работает? :) Я уверен что в списке процессов у тебя висит скрытый cmd.exe ;)
Чтобы скрыть консольное окно нужно использовать WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE).

запускающий архив защищён, можно подумать что контент обратно в него из темпа заархивируется
после выполнения »
На самом деле оно так и есть, некоторые архивы перепаковываются по необходимости (так по крайней мере, себя ведёт упаковщик от Winrar).

Удалить можно после выхода скрипта, через тот же @ComSpec, но это при условии что после выхода скрипта архив не запускает/использует другие программы/файлы:

Run(@ComSpec & ' /c ping -n 2 localhost > nul & del /q /f "' & $sArchiveFile & '"', '', @SW_HIDE)

semiono
09-11-2008, 14:26
Как проверяется что оно не работает? »
Команды не "ловит", оно может и висит, так как я его из консоли запускал, но
MyProg.exe "notepad.exe new.txt" не получается! Или что либо в этом роде...

Удалить можно после выхода скрипта, »

То-есть нужна лишь задержка времени пингом? Кстати, а кроме пинга нету альтернативных вариантов оттягивания времени, просто интересно?

Я извиняюсь, а как WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) совместить с запуском Run()

Или это все консоли скрывает которые на пути попадаются :) Можно кусочек кода показать?
В часности как Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) объединить с этим всем?

Creat0R
09-11-2008, 15:51
semiono,
Команды не "ловит", оно может и висит, так как я его из консоли запускал, но
MyProg.exe notepad.exe new.txt не получается! »
Затрудняюсь понять. Что конкретно требуется? задать уже открытому консольному окну параметры/команды? Думаю что только если послать их через ControlSend... хотя я вроде где то видел решение, которое позволяет подключаться к потоку Std другого процесса, тогда можно писать в него через StdInWrite.

нужна лишь задержка времени пингом? »
Да.

кроме пинга нету альтернативных вариантов оттягивания времени »
Встроенными средствами cmd'а вроде нет (по крайней мере не в XP).

как WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) совместить с запуском Run() »
Никак :) - Эта команда скроет консольное окно (то что на фронте).

Или это все консоли скрывает которые на пути попадаются »
Чтобы скрыть все, нужно пройтись по списку окон через WinList("[CLASS:ConsoleWindowClass]").

как Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) объединить с этим всем? »
Лучше опиши подробнее задачу, что именно нужно с точки зрения пользователя.

semiono
09-11-2008, 16:40
Ok! Я уже пытался объяснить, ща попробую ещё...
В поисках утилит скрывающих cmd.exe window я вдруг подумал, а ведь наверняка это можно реализовать самому на AutoIt!
Конкретно, нужно написать скрыватель окна cmd.exe.
Как мне представляется - наша прога, кампилированный (Aut2Exe) скрипт пусть называется hidec.exe
Мы вводим в коммандной строке, или в батнике, или в меню Пуск >Выполнить (не знаю есть ли различие),
вводим кароче такое:
# hidec.exe notepad.exe && calc.exe && mmsys.cpl && exit
в реале у нас получается, что hidec.exe просто передаёт все эти комманды cmd.exe процессору на выполнение, то-есть всё просто пропускает через себя и перенаправляет в cmd.exe.
Единственную цель тут выполнить hidec.exe должен - это не позволить открываться окну cmd.exe

Если что-то не понятно, я пишу, я объясню ещё...

Кстати, утилита http://legroom.net/software/openargs - такой же автоит только там с другими задачами, так что идея создания утилиты не мной придумана
:)

Вроде бы Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) должен работать, но он чёто молча поглощает ввод :)

litus
09-11-2008, 17:06
После запуска с флешки "MyProga"остаються даные от autorun.inf
Даные реестра:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action]
@="Запустить MyProga"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel]
@="MyProga"
Здесь ключ реестра как я понимаю "@" если я прописываю его то значение не удаляеться. Тогда произвожу удаление по значению .
Код:
_RegDeleteEx1("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")

Func _RegDeleteEx1($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc


_RegDeleteEx2("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "MyProga")

Func _RegDeleteEx2($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc

_RegDeleteEx1("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")

Func _RegDeleteEx1($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc
Но мне кажеться получаеться не сильно элигантноне подскажете как можно упростить код .

Creat0R
09-11-2008, 23:29
hidec.exe просто передаёт все эти комманды cmd.exe процессору на выполнение, то-есть всё просто пропускает через себя и перенаправляет в cmd.exe »
Можно так:

Run(@ComSpec & " /c " & $CmdLineRaw, "", @SW_HIDE)

Но это всего лишь запустить новую инстанцию cmd.exe и передаст все параметры ком. строки (переданные в скрипт).
Для того чтобы скрыть то окно в котором утилита запускается, нужно использовать ту строку что я привёл ранее (с WinSetState). Также можно определить PID (идентификатор) родительского процесса, и скрыть окно по заголовку этого процесса.

Creat0R
09-11-2008, 23:45
litus,
Здесь ключ реестра как я понимаю "@" »
Нет, этот символ означает значение “По умолчанию” (самое верхнее в ветке).
Это нужно удалять так:

RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "")
RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "")

как можно упростить код »
Для начала вам нужно понять, что функцию не нужно включать более чем один раз, она обычно задаётся в конце, и вызывается там где нужно:


_RegDeleteEx("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")
_RegDeleteEx("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "MyProga")

Func _RegDeleteEx($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc

semiono
10-11-2008, 02:07
Creat0R, мне действительно помогло вставка вначале скрипта:
WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE)
Которое схлопывает моментально консоль!
Консоль, в это время исполняет код записанный InnoSetup:
[Registry]
Root: HKLM32; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Alcohol-Setup"; ValueData: "{sys}\cmd.exe /k start /w {sys}\Alcohol.exe & del /f /q {sys}\Alcohol.exe & reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v Alcohol-Setup /f & Exit"; Flags: noerror; Permissions: admins-full

Практически ничего не стал менять, лишь прикрыл внешнюю консоль из скрипта! Спасибо!
Что важно, что реестр удаляет архив из которого стартовал скрипт! ;-

Хотя вот последнее твоё Run(@ComSpec & " /c " & $CmdLineRaw, "", @SW_HIDE) - это интересно, надо проверить! Потому-что идея разработки hidec утилиты очень даже пригодиться!

amel27
10-11-2008, 05:13
TERMINAL
Желательно того на которое драйвера не установлены »
проще всего при помощи DevCon (http://support.microsoft.com/kb/311272/ru), пример использования в AutoIT:
#include <Constants.au3>

$out = ""
$txt = ""
; Запуск DEVCON
$foo = Run(@ComSpec & " /C DevCon ListClass Unknown", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
; Чтение результата
While 1
$out &= StdoutRead($foo)
If @error Then ExitLoop
Wend
; Парсинг результата в массив
$arr = StringRegExp($out, "(?:[&\w]+\\)+[&\w]+", 3)
; Вывод массива на экран
If IsArray($arr) Then
For $i=0 To UBound($arr)-1
$txt &= $arr[$i] &@CRLF
Next
EndIf
MsgBox(0,"",$txt)

P.S. для скрипта devcon.exe должен лежать в System32

amel27
10-11-2008, 06:18
Необходимо прочитать текст из cmd.exe, точнее с любого консольного окна. Запускаю cmd.exe затем telnet хочу дождаться приглашения другого компа »
Смотри функцию StdoutRead() »
к сожалению, для Telnet StdoutRead() не поможет, как вариант - через файл:
$Server = "192.168.1.1"
$Port = ""

$LogFile = @TempDir & "\Telnet.Log"
$CmdText = @ComSpec & " /C " & 'Telnet -f "' & $LogFile & '" ' & $Server & " " & $Port
$CmdPID = Run($CmdText, "")

Sleep(1000)
$hWnd = WinGetHandle("Telnet " & $Server)
If @error Then Exit

ControlSend($hWnd, "", "","admin{enter}")
Sleep(1000)
ControlSend($hWnd, "", "","password{enter}")
Sleep(3000)

$data = FileRead($LogFile)
MsgBox(0, "", $data)

ControlSend($hWnd, "", "", "quit{enter}")
ControlSend($hWnd, "", "", "^c")

WinWaitClose($hWnd)
FileDelete($LogFile)

TERMINAL
10-11-2008, 10:59
amel27, что-то неопределяет...скопировал в System32, запустил твой скрипт...

и непонятно откуда взялась такая команда у тебя- /C DevCon Find =Unknown

Справка по программе Device Console (DevCon)
devcon.exe [-r] [-m:\\<компьютер>] <команда> [<арг>...]
-r Перезагрузить компьютер после выполнения команды, если это необходимо.
<компьютер> Имя компьютера назначения.
<команда> Подлежащая выполнению команда (см. ниже).
<арг>... Один или несколько аргументов (если необходимы).
Для получения справки по определенной команды введите: devcon.exe help <команда>
classfilter Разрешить изменение фильтров классов.
classes Отобразить все классы настройки устройств.
disable Отключить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
driverfiles Отобразить установленные файлы драйверов.
drivernodes Отобразить все узлы драйверов устройств.
enable Включить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
find Найти устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
findall Найти устройства, включая отсоединенные.
help Отображение справочной информации.
hwids Отобразить идентификаторы оборудования.
install Установить устройство в ручном режиме.
listclass Отобразить все устройства для класса настройки.
reboot Перезагрузить локальный компьютер.
remove Удалить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
rescan Выполнить поиск нового оборудования.
resources Отобразить ресурсы устройств.
restart Перезагрузить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
stack Отобразить ожидаемый стек драйверов устройств.
status Отобразить рабочее состояние устройств.
update Обновить устройство в ручном режиме.
UpdateNI Обновить устройство в ручном режиме без уведомления пользователя.
SetHwID Добавить, удалить или изменить порядок идентификаторов оборудования для устройств с корневым перечислением.

amel27
10-11-2008, 11:23
непонятно откуда взялась такая команда у тебя »
DevCon Help Find
DevCon Classes
попробуй другой класс устройств:
DevCon Find =Media

З.Ы. что касается /C, то это часть команды "CMD /C ", где CMD раскрывается макросом @ComSpec

TERMINAL
10-11-2008, 11:32
amel27, всё перепробовал, мне кажется что где-то в скрипте ошибка-у себя на компе можешь проверить?

amel27
10-11-2008, 11:40
TERMINAL, без скрипта проверь в командной строке указанные команды, выдают список DevID?




© OSzone.net 2001-2012