2010-08-13 4 views
1

Je rencontre des problèmes lors de la définition du nom d'utilisateur et du mot de passe du proxy avec wininet.Définition des paramètres du proxy avec wininet

Le code ci-dessous définir le proxy, mais le nom d'utilisateur et mot de passe échoue avec le code d'erreur « 12018 »

[DllImport("wininet.dll", SetLastError = true)] 
    private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); 

private void RefreshIESettings(string strProxy,string proxyUsername,string proxyPassword) { 

const int INTERNET_OPTION_PROXY = 38; 
const int INTERNET_OPEN_TYPE_PROXY = 3; 
const int INTERNET_OPTION_PROXY_USERNAME = 43; 
const int INTERNET_OPTION_PROXY_PASSWORD = 44; 

IntPtr username = Marshal.StringToHGlobalAnsi(proxyUsername); 
IntPtr password = Marshal.StringToHGlobalAnsi(proxyPassword); 
INTERNET_PROXY_INFO struct_IPI; 
struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY; 

struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy); 
struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local"); 

IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); 
Marshal.StructureToPtr(struct_IPI, intptrStruct, true); 
bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI)); 

Marshal.GetNativeVariantForObject(proxyUsername, username); 
Marshal.GetNativeVariantForObject(proxyPassword, password); 
bool resultF = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_USERNAME, username, proxyUsername.Length); 
var errorF = Marshal.GetLastWin32Error(); 

//-- Set Proxy Password 
bool resultG = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_PASSWORD, password, proxyPassword.Length + 1); 
var errorG = Marshal.GetLastWin32Error(); 

Répondre

0

Les options de nom d'utilisateur proxy et mot de passe ont besoin d'une poignée de HINTERNET valide à partir d'un appel InternetOpen, quelque chose que j'ai pas été en mesure d'extraire d'un contrôle de navigateur Web. En fin de compte j'ai dû accrocher le message Win32 WM_INITDIALOG traverser les objets fenêtre enfant jusqu'à ce que j'ai trouvé le nom d'utilisateur, mot de passe et les éléments ok, remplir automatiquement avec les informations d'identification fournies, puis soumettre.

Très hackish, mais cela fonctionne. Je ne pouvais pas obtenir la fonction IAuthenticate.Authenticate à exécuter pour cette demande d'informations d'identification de proxy spécifique, il semble que cela est appelé uniquement pour les invites d'authentification Windows de base.

Voir ces derniers pour référence:

Set Proxy Credential in Web Browser Control

How to set a proxy for Webbrowser Control without effecting the SYSTEM/IE proxy

Questions connexes