1 (изменено: Alex_Lexon, 2017-01-06 14:50:54)

Тема: AHK: Отключение интернета для конкретной программы

Здравствуйте, форумчане!
Нужен  скриптик, который выключает интернет для какой-то конкретной программы, а не во всём компьютере. Как такое реализовать?
Заранее спасибо.

2

Re: AHK: Отключение интернета для конкретной программы

Программу такого рода называют брандмауэр, файервол, межсетевой экран... AutoHotkey под это совсем не заточена.

3 (изменено: Alex_Lexon, 2017-01-06 15:39:22)

Re: AHK: Отключение интернета для конкретной программы

ypppu пишет:

Программу такого рода называют брандмауэр, файервол, межсетевой экран... AutoHotkey под это совсем не заточена.

Ну, это я и так понимал. Но все таки надеялся, что можно будет как-то через AHK это сделать. Ну, или, как минимум автоматизировать этот процесс.

4

Re: AHK: Отключение интернета для конкретной программы

Скорее всего можно управлять штатным файерволом через ком. строку или реестр. Но создавать сетевой экран средствами AutoHotkey думаю крайне нерационально.

5

Re: AHK: Отключение интернета для конкретной программы

ypppu пишет:

Скорее всего можно управлять штатным файерволом через ком. строку или реестр. Но создавать сетевой экран средствами AutoHotkey думаю крайне нерационально.

Угу, спасибо.

6 (изменено: Alex_Lexon, 2017-01-06 17:18:25)

Re: AHK: Отключение интернета для конкретной программы

Тогда вопрос: Возможно ли автоматизировать процесс добавления/удаления/изменения правил выхода в интернет в брандмауэре Windows через AHK? Или, может, кто-то может подсказать другие варианты для запрета доступа выхода в интернет  конкретной программе по нажатию кнопки и так же включения его обратно?

7

Re: AHK: Отключение интернета для конкретной программы

Поищите на англоязычном форуме. Взять к примеру "enable/disable Windows firewall rules?".

Run, netsh firewall add ;и так далее

8 (изменено: Indomito, 2017-01-07 12:32:13)

Re: AHK: Отключение интернета для конкретной программы

Alex_Lexon В дополнение.
У меня из наработок есть набор функций , которые реализуют стандартный поток ввода/вывода(stdin/stdout/stderr), как в Си.
Этого нет в AHK, т.е. есть, но частично и не полностью.

+ RunCon.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 , она главная.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Эл. почта: dysansven@gmail.com Skype: indomito_64
Правила - основные.