Einzelnen Beitrag anzeigen

NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#1

[WinHTTP API] Proxyeinstellungen lesen und interpretieren

  Alt 13. Okt 2014, 10:43
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
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat