Hallo zusammen,
Ich bin gerade ein Programm amschreiben, dass die Proxyeinstellungen liesst. Ich habe dafür in der
MSDN ein bischen nachgeschaut, wie und wo man das alles Einstellen kann. Unter "Internetoptionen" in Windows ist das erste und ""Proxycfg.exe" das zweite, wenn ich das richtig verstanden habe. Das erste kann man ja grösstenteils aus der Registry lesen. Jedoch wäre es ein rissen Aufwand ein "PAC" Script Interpreter zuschreiben (bzw. geht das auch einfacher?).
Das eigentliche Problem ist, was mache ich wenn ich ein PAC Script downloaden muss und dieses interpretieren muss?
Daraufhin habe ich mir die WinHTTP APIs angeschaut und versuche nun damit irgendwie damit die Einstellungen zulesen und ihn dazuzubringen das PAC Script downzuloaden und zu interpretieren.
Die Funktion muss aber auch funktionieren, wenn es kein PAC-Script gibt. Z.b. wenn kein Proxy benötigt wird oder wenn eine Proxyserveradresse vorliegt.
Ich habe dafür ein paar WinHTTP Funktionen zu delphi interpretiert (sind richtig interpretiert).
Laut
diesem Artikel von
MSDN, wenn ich es richtig verstanden habe, kann man mit "WinHttpGetProxyForUrl" für eine
URL denn Proxy auslesen. Jedoch führt dies zu einem undokumentierten Fehler mit "ERROR_ACCESS_DENIED". Ich habe es schon als Admin ausgeführt, keine Veränderung und es liegt auch nicht an meinem Rechner. Ich habe es bei einem Kumepl getestet, der ein Proxy-PAC-Script verweendet, genau das gleiche. Irgendwo habe ich was übersehen. Kann mir jemand helfen? Hat jemand das schonmal selber gemacht? Es ist kein Service, wie bei der
MSDN erwähnt. Eine ganz normale Desktop-Anwendung. Getestet auf Win7.
Das Ziel ist einfach, das ich die Proxyeinstellungen lesen und interpretieren kann.
Oder geht dies auch einfacher ohne WinHTTP?
So hier der Code:
Delphi-Quellcode:
function TForm2.ReadProxyFromURL : Boolean;
var ProxySettings : WINHTTP_CURRENT_USER_IE_PROXY_CONFIG;
AutoProxyOptions : WINHTTP_AUTOPROXY_OPTIONS;
ProxyInfo : WINHTTP_PROXY_INFO;
Error : Cardinal;
ThisResult : Boolean;
hSite : Pointer;
WinHTTP_Flags : DWORD;
WinHTTP_Proxy,WinHTTP_ProxyByPass : LPCWSTR;
begin
ThisResult := False;
if hWinHTTP_DLL <> 0 then
begin
if (@WinHttpOpen <> nil) and
(@WinHttpGetProxyForUrl <> nil) and
(@WinHttpCloseHandle <> nil) then
begin
Memo1.Lines.BeginUpdate;
Memo1.Lines.Clear;
FillChar(ProxyInfo,SizeOf(ProxySettings),0);
if WinHttpGetIEProxyConfigForCurrentUser(ProxySettings) then
Memo1.Lines.Add('WinHttpGetIEProxyConfigForCurrentUser=TRUE')
else
Memo1.Lines.Add('WinHttpGetIEProxyConfigForCurrentUser=FALSE');
if ProxySettings.lpszProxy <> nil then
begin
WinHTTP_Flags := WINHTTP_ACCESS_TYPE_NAMED_PROXY;
WinHTTP_Proxy := ProxySettings.lpszProxy;
WinHTTP_ProxyByPass := ProxySettings.lpszProxyBypass;
end
else
begin
WinHTTP_Flags := WINHTTP_ACCESS_TYPE_DEFAULT_PROXY;
WinHTTP_Proxy := nil;
WinHTTP_ProxyByPass := nil;
end;
hSite := WinHttpOpen('Proxy Read Test',WinHTTP_Flags,WinHTTP_Proxy,WinHTTP_ProxyByPass,0);
if hSite <> nil then
begin
Memo1.Lines.Add('WinHttpOpen; hSite<>nil');
FillChar(ProxyInfo,SizeOf(ProxyInfo),0);
FillChar(AutoProxyOptions,SizeOf(AutoProxyOptions),0);
AutoProxyOptions.dwFlags := WINHTTP_AUTOPROXY_AUTO_DETECT;
if ProxySettings.lpszAutoconfigUrl <> nil then
begin
AutoProxyOptions.dwFlags := AutoProxyOptions.dwFlags or WINHTTP_AUTOPROXY_CONFIG_URL;
AutoProxyOptions.lpszAutoConfigUrl := ProxySettings.lpszAutoconfigUrl;
end;
if ProxySettings.lpszProxy <> nil then
begin
AutoProxyOptions.dwFlags := AutoProxyOptions.dwFlags or WINHTTP_AUTOPROXY_CONFIG_URL;
AutoProxyOptions.lpszAutoConfigUrl := ProxySettings.lpszAutoconfigUrl;
end;
AutoProxyOptions.fAutoLogonIfChallenged := TRUE;
if WinHttpGetProxyForUrl(hSite,LPCWSTR(Edit1.Text),@AutoProxyOptions,ProxyInfo) then
begin
Memo1.Lines.Add('WinHttpGetProxyForUrl=TRUE');
with ProxyInfo do
begin
case dwAccessType of
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY : Memo1.Lines.Add('dwAccessType=WINHTTP_ACCESS_TYPE_DEFAULT_PROXY');
WINHTTP_ACCESS_TYPE_NO_PROXY : Memo1.Lines.Add('dwAccessType=WINHTTP_ACCESS_TYPE_NO_PROXY');
WINHTTP_ACCESS_TYPE_NAMED_PROXY : Memo1.Lines.Add('dwAccessType=WINHTTP_ACCESS_TYPE_NAMED_PROXY');
end;
if lpszProxy <> nil then
begin
Memo1.Lines.Add('lpszProxy="'+lpszProxy+'"');
GlobalFree(Cardinal(lpszProxy));
end else
Memo1.Lines.Add('lpszProxy="nil"');
if lpszProxyBypass <> nil then
begin
Memo1.Lines.Add('lpszProxyBypass="'+lpszProxyBypass+'"');
GlobalFree(Cardinal(lpszProxyBypass));
end else
Memo1.Lines.Add('lpszProxyBypass="nil"');
end;
end else
begin
Memo1.Lines.Add('WinHttpGetProxyForUrl=FALSE');
Error := GetLastError;
case Error of
ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR : Memo1.Lines.Add('Error=ERROR_WINHTTP_AUTO_PROXY_SERVICE_ERROR');
ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT : Memo1.Lines.Add('Error=ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT');
ERROR_WINHTTP_INVALID_URL : Memo1.Lines.Add('Error=ERROR_WINHTTP_INVALID_URL');
ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT : Memo1.Lines.Add('Error=ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT');
ERROR_WINHTTP_UNRECOGNIZED_SCHEME : Memo1.Lines.Add('Error=ERROR_WINHTTP_UNRECOGNIZED_SCHEME');
else
Memo1.Lines.Add('Error='+IntToStr(Error));
end
end;
if ProxySettings.lpszProxy<>nil then
GlobalFree(Cardinal(ProxySettings.lpszProxy));
if ProxySettings.lpszProxyBypass<>nil then
GlobalFree(Cardinal(ProxySettings.lpszProxyBypass));
WinHttpCloseHandle(hSite);
ThisResult := True;
end else
Memo1.Lines.Add('hSite="nil"');
Memo1.Lines.EndUpdate;
end;
end;
Result := ThisResult;
end;
Hoffe jemand weiss eine Lösung.
Gruß NickelM