Что нового

Настройка прокси для удаленного доступа

asdf8

Скриптер
Сообщения
564
Репутация
152
Подскажите, как узнать, что комп подключен к интернету через удаленный доступ, и установить прокси для этого соединения.
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
Нашел код Си, но у меня проблемы с переводом union-структур на AutoIt.
Код:
BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
	{
	//conn_name: active connection name. 
	//proxy_full_addr : eg "210.78.22.87:8000"
	INTERNET_PER_CONN_OPTION_LIST list;
	BOOL    bReturn;
	DWORD   dwBufSize = sizeof(list);
	// Fill out list struct.
	list.dwSize = sizeof(list);
	// NULL == LAN, otherwise connectoid name.
	list.pszConnection = conn_name;
	// Set three options.
	list.dwOptionCount = 3;
	list.pOptions = new INTERNET_PER_CONN_OPTION[3];
	// Make sure the memory was allocated.
	if(NULL == list.pOptions)
		{
		// Return FALSE if the memory wasn't allocated.
		OutputDebugString("failed to allocat memory in SetConnectionOptions()");
		return FALSE;
		}
	// Set flags.
	list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
	list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
	PROXY_TYPE_PROXY;

	// Set proxy name.
	list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
	list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";

	// Set proxy override.
	list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
	list.pOptions[2].Value.pszValue = "local";

	// Set the options on the connection.
	bReturn = InternetSetOption(NULL,
	INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);

	// Free the allocated memory.
	delete [] list.pOptions;
	InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
	InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
	return bReturn;
	}
Может, кто разбирается, поможет перевести его на AutoIt?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
asdf8
Я думаю, что данный код просто прописывает несколько значений в реестр...
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
snoitaleR [?]
Я думаю, что данный код просто прописывает несколько значений в реестр...
Да, прописывает, но, для локальной сети и для удаленного доступа в совершенно разные места. Фактически, для гарантированной смены прокси, нужно узнать имя текущего соединения (пока не нашел как), далее, с помощью функции InternetQueryOption сохранить текущие настройки прокси этого соединения (для последующего восстановления настроек) и сменить настройки функцией InternetSetOption. Но, в этих функциях, структуры сложноваты для меня.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Предлагаю алгоритм действий:
Под ключом:
Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}
ищется нужный сетевой адаптер (сетевая плата), по значению "NetCfgInstanceId" определяется CLSID сетевого подключения, в разделе:
Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
ищется ключ с CLSID нужного сетевого подключения.
В разделе:
Код:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}
можно узнать подробности о сетевых адаптерах (сетевых платах).
 
Автор
A

asdf8

Скриптер
Сообщения
564
Репутация
152
snoitaleR [?]
Предлагаю алгоритм действий:

Спасибо, я уже разобрался.

Код:
; _SetProxi('127.0.0.1:8080')
; _SetProxi('')

Func _SetProxi($sProxyFullAddr)
	Local $ConnName = _ConnectionGetName()
	If $ConnName <> -1 Then
		Local $iFlag = 3
		If Not $sProxyFullAddr Then $iFlag = 0
		Local $ret = _ConnectionSetProxi($ConnName, $iFlag, $sProxyFullAddr)
		Return $ret
	EndIf
EndFunc

Func _ConnectionGetName()
	Local $MAX_PATH = 260, $RAS_MaxDeviceType = 16, $RAS_MaxEntryName = 256, $RAS_MaxDeviceName = 128
	Local $tRASCONN, $iCntByte, $iCntConn, $aRet, $conNum, $conName
	$tRASCONN = DllStructCreate("dword dwSize;hwnd hRasConn;char szEntryName[" & $RAS_MaxEntryName + 1 & "];" & "char szDeviceType[" & $RAS_MaxDeviceType + 1 & "];" _
		& "char szDeviceName[" & $RAS_MaxDeviceName + 1 & "];" & "char szPhonebook[" & $MAX_PATH & "];" & "dword dwSubEntry;byte guidEntry[16];dword dwFlags;byte luid[8]")
	$iCntByte = DllStructCreate("dword")
	$iCntConn = DllStructCreate("dword")
	DllStructSetData($iCntByte, 1, DllStructGetSize($tRASCONN))
	DllStructSetData($tRASCONN, "dwSize", DllStructGetSize($tRASCONN))
	$aRet = DllCall("rasapi32.dll", "int", "RasEnumConnections", "ptr", DllStructGetPtr($tRASCONN), "ptr", DllStructGetPtr($iCntByte), "ptr", DllStructGetPtr($iCntConn))
	If @Error Or $aRet[0] Then Return SetError(1, 0, -1)
	$conNum = DllStructGetData($iCntConn, 1)
	If $conNum < 1 Then Return SetError(2, 0, '') ;Error: not opened connections
	$conName = DllStructGetData($tRASCONN, "szEntryName")
	Return SetError(0, $conNum, $conName)
EndFunc

Func _ConnectionSetProxi($sNameConnection = '', $iFlag = 3, $sProxyFullAddr = '', $sProxyOverride = 'local')
	Local $INTERNET_PER_CONN_OPTION, $INTERNET_PER_CONN_OPTION_LIST, $t, $t1, $t2, $Ret
	Local $tagINTERNET_PER_CONN_OPTION_LIST = 'DWORD dwSize; ptr pszConnection; DWORD dwOptionCount; DWORD dwOptionError; ptr pOptions;'
	$INTERNET_PER_CONN_OPTION = DllStructCreate('DWORD dwValue1; ptr pszValue1; int FILETIMEVALUE1; DWORD dwValue2; ptr pszValue2; int FILETIMEVALUE2; DWORD dwValue3; ptr pszValue3; int FILETIMEVALUE3;')
	$INTERNET_PER_CONN_OPTION_LIST = DllStructCreate($tagINTERNET_PER_CONN_OPTION_LIST)
	DllStructSetData($INTERNET_PER_CONN_OPTION_LIST, 'dwSize', DllStructGetSize($INTERNET_PER_CONN_OPTION_LIST))
	$t = DllStructCreate('char[' & StringLen($sNameConnection) + 1 & ']')
	DllStructSetData($t, 1, $sNameConnection)
	DllStructSetData($INTERNET_PER_CONN_OPTION_LIST, 'pszConnection', DllStructGetPtr($t))
	DllStructSetData($INTERNET_PER_CONN_OPTION_LIST, 'dwOptionCount', 3)
	DllStructSetData($INTERNET_PER_CONN_OPTION_LIST, 'pOptions', DllStructGetPtr($INTERNET_PER_CONN_OPTION))
	; Set flags.
	DllStructSetData($INTERNET_PER_CONN_OPTION, 'dwValue1', 1) ;INTERNET_PER_CONN_FLAGS
	DllStructSetData($INTERNET_PER_CONN_OPTION, 'pszValue1', $iFlag) ;PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY = 1 + 2 (Or = 0 - reset proxi)
	; Set proxy name.
	$t1 = DllStructCreate('char[' & StringLen($sProxyFullAddr) + 1 & ']')
	DllStructSetData($t1, 1, $sProxyFullAddr)
	DllStructSetData($INTERNET_PER_CONN_OPTION, 'dwValue2', 2) ;INTERNET_PER_CONN_PROXY_SERVER;
	DllStructSetData($INTERNET_PER_CONN_OPTION, 'pszValue2', DllStructGetPtr($t1)) ;//"http://proxy:80";
	; Set proxy override.
	$t2 = DllStructCreate('char[' & StringLen($sProxyOverride) + 1 & ']')
	DllStructSetData($t2, 1, $sProxyOverride)
	DllStructSetData($INTERNET_PER_CONN_OPTION, 'dwValue3', 3) ;INTERNET_PER_CONN_PROXY_BYPASS;
	DllStructSetData($INTERNET_PER_CONN_OPTION, 'pszValue3', DllStructGetPtr($t2));"local";
	$Ret = DllCall('WININET.DLL', 'int', 'InternetSetOption', 'hwnd', 0, 'dword', 75, 'ptr', DllStructGetPtr($INTERNET_PER_CONN_OPTION_LIST), 'dword*', DllStructGetSize($INTERNET_PER_CONN_OPTION_LIST))
	If (@Error) Or ($Ret[0] = 0) Then
		Return SetError(1, 0, 0)
	Else
		DllCall('wininet.dll', 'int', 'InternetSetOption', 'none', 'null', 'int', 39, 'none', 'null', 'int', 0);INTERNET_OPTION_SETTINGS_CHANGED
		DllCall('wininet.dll', 'int', 'InternetSetOption', 'none', 'null', 'int', 37, 'none', 'null', 'int', 0);INTERNET_OPTION_REFRESH
		Return 1
	EndIf
EndFunc

Код устанавливает или удаляет прокси для текущего соединения, неважно локальное или удаленное.
 
Верх