Тема: AHK: Отключение интернета для конкретной программы
Здравствуйте, форумчане!
Нужен скриптик, который выключает интернет для какой-то конкретной программы, а не во всём компьютере. Как такое реализовать?
Заранее спасибо.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте, форумчане!
Нужен скриптик, который выключает интернет для какой-то конкретной программы, а не во всём компьютере. Как такое реализовать?
Заранее спасибо.
Программу такого рода называют брандмауэр, файервол, межсетевой экран... AutoHotkey под это совсем не заточена.
Программу такого рода называют брандмауэр, файервол, межсетевой экран... AutoHotkey под это совсем не заточена.
Ну, это я и так понимал. Но все таки надеялся, что можно будет как-то через AHK это сделать. Ну, или, как минимум автоматизировать этот процесс.
Скорее всего можно управлять штатным файерволом через ком. строку или реестр. Но создавать сетевой экран средствами AutoHotkey думаю крайне нерационально.
Скорее всего можно управлять штатным файерволом через ком. строку или реестр. Но создавать сетевой экран средствами AutoHotkey думаю крайне нерационально.
Угу, спасибо.
Тогда вопрос: Возможно ли автоматизировать процесс добавления/удаления/изменения правил выхода в интернет в брандмауэре Windows через AHK? Или, может, кто-то может подсказать другие варианты для запрета доступа выхода в интернет конкретной программе по нажатию кнопки и так же включения его обратно?
Поищите на англоязычном форуме. Взять к примеру "enable/disable Windows firewall rules?".
Run, netsh firewall add ;и так далее
Alex_Lexon В дополнение.
У меня из наработок есть набор функций , которые реализуют стандартный поток ввода/вывода(stdin/stdout/stderr), как в Си.
Этого нет в AHK, т.е. есть, но частично и не полностью.
; ======= Определение параметров и статуса Интернета ======
fnInternetState(arOut)
{
;global Internet, NetName :=1, NetDHCP :=2, NetIP :=3, NetGate :=4, NetState:=5, NetST:=1, FindKey :=2
global Internet, NetName, NetDHCP, NetIP, NetGate, NetState, NetST, FindKey
k:=1
for i, j in arOut
{
while(Internet[k,FindKey])
{
vFindKey:=Internet[k,FindKey]
l := StrLen(vFindKey)
vPos:=InStr(j, vFindKey)
if (vPos)
Internet[k,NetName]:=vStr0:=SubStr(j, vPos+l), k++
Break
}
}
Internet[NetState,NetST]:= false
if (Internet[NetDHCP,NetST]="Да")
Internet[NetState,NetST]:= true
return Internet[NetState,NetST]
}
; ======= Постпарсер RunCon ===============================
fnParseStdIn(StdIn)
{
Arr := [], i := 0
Loop, parse, StdIn, `r`n
{
Row := RegExReplace(A_LoopField, """| |" A_Tab)
If Row is space
Continue
Arr[++i] := Row
}
Return Arr
}
; ======= Функция RunCon ==================================
RunCon(CmdLine, Input, ByRef Output)
{
static BufSizeChar := 1024, hParent := 0
static Show := 0, Flags := 0x101 ; STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW
static Buf, BufSizeByte, ProcessInfo, StartupInfo, PipeAttribs
static piSize, siSize, paSize, flOffset, shOffset, ihOffset
static inOffset, outOffset, errOffset, thrOffset
If (!hParent) {
BufSizeByte := A_IsUnicode ? BufSizeChar * 2 : BufSizeChar
If (A_PtrSize = 8) {
piSize := 24, siSize := 104, paSize = 24
flOffset := 60, shOffset := 64, ihOffset := 16
inOffset := 80, outOffset := 88, errOffset := 96
thrOffset := 8
}
Else {
piSize := 16, siSize := 68, paSize = 12
flOffset := 44, shOffset := 48, ihOffset := 8
inOffset := 56, outOffset := 60, errOffset := 64
thrOffset := 4
}
VarSetCapacity(Buf, BufSizeByte, 0), VarSetCapacity(ProcessInfo, piSize, 0)
VarSetCapacity(StartupInfo, siSize, 0), VarSetCapacity(PipeAttribs, paSize, 0)
NumPut(siSize, StartupInfo, 0, "uint"), NumPut(Flags, StartupInfo, flOffset, "uint")
NumPut(Show, StartupInfo, shOffset, "ushort")
NumPut(paSize, PipeAttribs, 0, "uint"), NumPut(1, PipeAttribs, ihOffset, "int")
hParent := DllCall("GetCurrentProcess", "ptr")
}
DllCall("CreatePipe", "ptr *", hRead1_tmp, "ptr *", hWrite2
, "ptr", &PipeAttribs, "uint", 0)
DllCall("CreatePipe", "ptr *", hRead2, "ptr *", hWrite1_tmp
, "ptr", &PipeAttribs, "uint", 0)
NumPut(hRead2, StartupInfo, inOffset, "ptr")
NumPut(hWrite2, StartupInfo, outOffset, "ptr")
NumPut(hWrite2, StartupInfo, errOffset, "ptr")
DllCall("DuplicateHandle", "ptr", hParent, "ptr", hRead1_tmp
, "ptr", hParent, "ptr *", hRead1
, "uint", 0, "uint", 0
, "uint", 2) ; DUPLICATE_SAME_ACCESS
DllCall("CloseHandle", "ptr", hRead1_tmp)
DllCall("DuplicateHandle", "ptr", hParent, "ptr", hWrite1_tmp
, "ptr", hParent, "ptr *", hWrite1
, "uint", 0, "uint", 0
, "uint", 2)
DllCall("CloseHandle", "ptr", hWrite1_tmp)
DllCall("ExpandEnvironmentStrings", "str", CmdLine, "str", Buf, "uint", BufSizeChar)
CmdLine := Buf
Ret := DllCall("CreateProcess", "ptr", 0, "str", CmdLine, "ptr", 0, "ptr", 0
, "uint", 1, "uint", 0, "ptr", 0, "ptr", 0
, "ptr", &StartupInfo, "ptr", &ProcessInfo)
If (!Ret) {
MsgBox,, %A_ThisFunc%, Не удалось создать процесс.
Output := ""
Return 1
}
hChild := NumGet(ProcessInfo, 0, "ptr")
DllCall("CloseHandle", "ptr", NumGet(ProcessInfo, thrOffset, "ptr"))
DllCall("CloseHandle", "ptr", hRead2)
DllCall("CloseHandle", "ptr", hWrite2)
If (Input) {
InLen := StrLen(Input) + 2
VarSetCapacity(InBuf, InLen, 0)
StrPut(Input . "`r`n", &InBuf, "cp866")
DllCall("WriteFile", "ptr", hWrite1, "ptr", &InBuf, "uint", InLen
, "uint *", BytesWritten, "uint", 0)
}
DllCall("CloseHandle", "ptr", hWrite1)
Output := ""
Loop {
If not DllCall("ReadFile", "ptr", hRead1, "ptr", &Buf, "uint", BufSizeByte
, "uint *", BytesRead, "uint", 0)
Break
NumPut(0, Buf, BytesRead, "Char")
Output .= StrGet(&Buf, "cp866")
}
DllCall("CloseHandle", "ptr", hRead1)
DllCall("GetExitCodeProcess", "ptr", hChild, "int *", ExitCode)
DllCall("CloseHandle", "ptr", hChild)
Return ExitCode
}
Надеюсь, что пригодится.
И забыл...
Функции fnInternetState и fnParseStdIn - не важны, это надстройка для функции RunCon , она главная.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться