Download aus geschütztem Bereich

  • Hallo zusammen!
    Ich habe mal wieder ein Problem :)

    Wir haben einen geschützten Downloadbereich. Geschützt mit Benutzername und Passwort.

    https://www.firma.com/verzeichnis
    In diesem Verzeichnis liegen diverse Dateien, welche ich mit meinem Programm herunterladen möchte.
    Benutzername und Passwort sind bekannt.

    Gebe ich IE manuell diese Adresse ein, kommt zuerst die Meldung, dass das Zertifikat ungültig ist. (Ist momentan noch leider so)
    Klicke ich dann auf "Trotzdem laden", werde ich per Popup nach einem Benutzernamen und Passwort gefragt.

    Gebe ich das korrekt ein, lande ich auf der Seite und kann die Dateien manuell herunterladen.

    Wie kann ich dies jedoch alles automatisch machen?
    Also ohne das gültige Zertifikat und dass ich die Dateien (Dateinamen sind bekannt) herunterladen kann.
    Eine Verbindung über https://benutzer:passwort@firma.com/verzeichnis funktioniert leider nicht (bzw. nicht auf allen PCs).
    Auch möchte ich vermeiden, dass einfach das Popup ferngesteuert wird. Der Benutzer soll nichts davon sehen.

    Ich wäre sehr froh, wenn mir hier jemand Tatkräftig unter die Arme greifen könnte, da ich keinen Schimmer habe, wie ich da weiterkommen soll!

    Vielen Dank!
    Veronesi

    Einmal editiert, zuletzt von veronesi (22. Dezember 2011 um 10:04)

  • Versuchs mal mit WinHTTP, Passwort und Login werden wahrscheinlich über POST übertragen. Am besten benutzt du LiveHTTPHeader (Ein FF AddOn) um mitzusniffen was dein Browser sendet. Dann müsstest du dich einloggen können wenn du die Packages imitierst.
    Andere Möglichkeit wäre, (Wenn ihr einen FTP-Server habt) das du es darüber machst. Die _FTP_ Funktionen sind alle gut in der Hilfe beschrieben und man findet auch einiges im Forum.

    Gruß

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Danke für die Informationen.
    Leider verstehe ich so gut wie nichts übers Http Protokoll.
    Ich weiß nicht, wie ich den Benutzenamen, Passwort per POST übertragen kann/soll.

    Und wie fordere ich dann die entsprechende Datei an?
    Wir haben mehrere FTP Server. Aber aus Sicherheitsgründen ist es uns nicht erlaubt, die Dateien auf den FTP Server zu laden :(
    Das wäre einfacher!

    Vielleicht kann mir ja jemand mit WinHttp eine UDF machen (helfen)?

  • Ich war mir sicher das es eine WinHTTP UDF gibt...
    http://code.google.com/p/autoit-cn/so…nHttp.au3?r=783
    // Hab grad ein Tut gefunden in dem es erklärt wird:
    http://www.noshacks.de/anleitungen-tu…t-t2377/p1.html

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Die WinHTTP-UDF gibt es übrigens unter http://winhttp.origo.ethz.ch
    Um unverifizierte / ungültige Zertifikate zuzulassen, muss man einige der Standardoptionen ändern, ungefähr so:

    [autoit]

    ...
    $hRequest = _WinHttpOpenRequest(...
    _WinHttpSetOption($hRequest, $WINHTTP_OPTION_SECURITY_FLAGS, BitOr($SECURITY_FLAG_IGNORE_CERT_CN_INVALID, $SECURITY_FLAG_IGNORE_CERT_DATE_INVALID, $SECURITY_FLAG_IGNORE_UNKNOWN_CA))
    ...
    _WinHttp_SendRequest($hRequest, ...
    _WinHttpReceiveResponse($hRequest, ....
    $sData = _WinHttpSimpleReadData($hRequest, ...
    _WinHttpCloseHandle($hRequest)

    [/autoit]

    Einmal editiert, zuletzt von progandy (22. Dezember 2011 um 01:26)

  • Vielen Dank für Eure Antworten.
    Das mit dem Firefox und dem Tutorial habe ich versucht. Doch das Plugin scheint nicht mit dem neuesten Firefox kompatibel zu sein. Ich konnte nichts aufzeichnen!

    @progandy
    Ich habe Deine Idee mal aufgegriffen und versucht eine Funktion zu machen. Leider ohne Erfolg

    [autoit]

    #include "WinHttp.au3"
    Global $UpdateServer_hSession, $UpdateServer_hConnect

    [/autoit][autoit][/autoit][autoit]

    $Ret = _ConnectToUpdateServer()
    MsgBox(64, "Ergebnis", $Ret & " / @error: " & @error)
    Exit

    [/autoit][autoit][/autoit][autoit]

    Func _ConnectToUpdateServer()
    Local Const $sUserAgent = "Name"
    Local Const $sServerName = "https://www.firma.com/verzeichnis"

    $UpdateServer_hSession = _WinHttpOpen($sUserAgent, $WINHTTP_ACCESS_TYPE_DEFAULT_PROXY)
    If @error Then Return SetError(1, 0, 0)
    $UpdateServer_hConnect = _WinHttpConnect($UpdateServer_hSession, $sServerName, $INTERNET_DEFAULT_HTTPS_PORT)
    If @error Then
    _CloseOpenHandles()
    Return SetError(2, 0, 0)
    EndIf

    _CloseOpenHandles()
    EndFunc ;==>_ConnectToUpdateServer

    [/autoit][autoit][/autoit][autoit]

    Func _CloseOpenHandles()
    _WinHttpCloseHandle($UpdateServer_hConnect)
    _WinHttpCloseHandle($UpdateServer_hSession)
    Return 1
    EndFunc ;==>_CloseOpenHandles

    [/autoit]

    Hier bekomme ich immer den @error 2.
    Deshalb komme ich vorläufig auch nicht weiter.
    Und dann bei _WinHttpOpenRequest weiss ich nicht, was ich bei $sTarget einfüllen sollte!

    Mein Problem ist, dass im Firefox mit dem Befehl https://benutzer:passwort@https://autoit.de/www.firma.com/verzeichnis alles funktioniert (ausser dem Zertifikat).
    Im IE aber nicht.

    Ich wäre sehr froh, wenn jemand mir helfen könnte, diese Funktion fertig zu machen!
    Danke!

    3 Mal editiert, zuletzt von veronesi (22. Dezember 2011 um 07:39)

  • Moin, also der Fehler liegt darin dass er keine Verbindung zum FTP aufbauen kann , erst mal muss diese zustande kommen bevor wir uns um die Requests etc kümmern, versuche doch mal mit dem selben Code zb auf Google.de oder etwas in der Art dich zu Verbinden

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

    [/autoit] [autoit][/autoit] [autoit]

    #include "WinHttp.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ; Initialize and get session handle
    Global $hOpen = _WinHttpOpen()

    [/autoit] [autoit][/autoit] [autoit]

    ; Get connection handle
    Global $hConnect = _WinHttpConnect($hOpen, "www.google.de")
    If @error Then
    MsgBox(48, "Error", "Error getting connection handle." & @CRLF & "Error number is " & @error)
    Else
    ConsoleWrite("+ Connection handle $hConnect = " & $hConnect & @CRLF)
    MsgBox(64, "Yes!", "Handle is get! $hConnect = " & $hConnect)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Close handles
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

    [/autoit]

    so in etwa , ihr habt bestimmt einen Proxy bei euch im Betrieb , als Default Proxy wird der System Proxy verwendet , ggf kann man sich auch die Proxy Einstellungen aus dem IE laden > '_WinHttpGetIEProxyConfigForCurrentUser()'

    also ToDo :

    - Verbindung aufbauen zum Internet
    - Wenn das geht, dann versuchen Verbindung zum FTP aufzubauen
    - Wenn das geht, dann Pakete beim Normalen Login Mitsniffen um den Request später richtig zu bauen
    - Wenn dass gemacht ist dann Request Packet zusammenbauen
    - Packet absenden und schauen ob du einen Respose bekommst :)

    Gruß Marvin

  • Hallo Marvin
    Dein Code funktioniert soweit.
    Aber wenn ich anstelle von https://autoit.de/www.google.de http://http://www.google.de eingebe, funktioniert es nicht mehr!

    Da ich ein https Protokoll habe, dachte ich, dass ich das brauche.
    Nun gut. Ich habe einfach bei mir mal das Https:// weggelassen und nun bekomme ich keinen Fehler mehr!!

    Nun muss ich aber irgendwie den _WinHttpOpenRequest mit Post zusammenstricken. Da blicke ich momentan nicht durch!
    Ich habe aber inzwischen das Firefox Plugin zum laufen gebracht. Ich kann nun aufzeichnen, was gesendet wird gemäss Tutorial.

    Mein Problem ist: Dort steht, es muss ein POST kommen. Ich bekomme aber nur immer ein GET!!!
    Danke für Eure Antworten!

  • Moin, welches Tool verwendest du? welches ganz gut ist ist 'LiveHttpHeader' , startest du den Record der Header auch rechtzeitig? Doof Frage ich weiß :D .
    also im Normalfall sendet man seine Logindaten über POST also solltest du auch ein POST Packet mitsniffen können :/


    EDIT: // habe das eben in der Hilfe von WInHttp gefunden

    [autoit]


    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

    [/autoit][autoit][/autoit][autoit]

    #include "WinHttp.au3"

    [/autoit][autoit][/autoit][autoit]

    Opt("MustDeclareVars", 1)

    [/autoit][autoit][/autoit][autoit]

    ; Creating URL out of array of components:
    Global $aURL[8] = ["http", 1, "www.autoitscript.com", 80, "Jon", "deadPiXels", "admin.php"]
    MsgBox(0, "Created URL", _WinHttpCreateUrl($aURL))

    [/autoit][autoit][/autoit][autoit][/autoit]

    wäre sowas eine Lösung ? also ist natürlich nicht Funktional das Script muss natürlich noch der Connect usw mit rein
    Gruß Marvin

    Einmal editiert, zuletzt von Protex (22. Dezember 2011 um 08:32)

  • Hallo Marvin
    Ja, ich verwende den LiveHttpHeader.

    Ich starte ihn bestimmt viel zu früh! Aber egal wann ich ihn starte. Ich bekomme (auf meiner https Webseite) NIE ein Post!

    Ich bekomme etwa so etwas zurück:
    https://www.firma.com/verzeichnis/

    GET /verzeichnis/ HTTP/1.1
    Host: https://autoit.de/www.firma.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Connection: keep-alive
    Cache-Control: max-age=0, max-age=0
    Authorization: Basic xxxxxxxxxxxxxxxxxxx

    HTTP/1.1 200 OK
    Connection: close
    Transfer-Encoding: chunked
    Date: Thu, 22 Dec 2011 07:32:36 GMT
    Content-Type: text/html;charset=UTF-8
    Content-Encoding: gzip
    Server: Apache/2.2.11 (Win32) PHP/5.2.8
    X-UA-Compatible: IE=EmulateIE7
    Vary: Accept-Encoding
    ----------------------------------------------------------

    Und das scheint zu funktioniert!
    Ich sehe dann das ganze Verzeichnis.
    Aber ich habe nirgends ein POST????

  • Okay dann wird es an dem Popup liegen , du bekommst das selbe Popup wie wen man sich an einem Router oder so anmeldet mir fällt gerade verdammtnochmal nicht der Name dafür ein haha :D aufjedenfall scheint es mit diesem Tool nicht möglich zu sein dieses Popup mitzusniffen :/ da brauchen wir wohl eine andere Möglichkeit

    wie schauts denn mit der Lösung oben aus die ich als Edit geschrieben habe? , also einfach die Selbe URL übertragen die du halt auch sonst in den Browser eingibst?
    oder soll das nicht so sein?, das Passwort könnt man ja über eine Input Box eingeben lassen oder so.
    Gruß Marvin

  • Hallo Marvin

    Die Lösung bei Edit baut mir bloss eine URL zusammen.
    Genau diese URL habe ich auch schon probiert.
    In Firefox funktioniert sie, aber im IE nicht!!!

    Im IE habe ich keine URL gefunden, welche funktioniert!
    Ich kann bloss die "Originale" URL eingeben und dann kommt das PopUp mit den Logindaten.
    Aber das kann ich nicht bei den Benutzern machen!!!

    Edit: Es muss doch möglich sein, mitzuschneiden, was genau gesendet wird!

  • Ist das wirklich ein Popup oder ist es ein htaccess-Login?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Bei htaccess kannst usernamen und pw direkt in der URL übergeben:

    Code
    http://BENUTZER:PASSWORT@URL

    Edit: Ok man sollte den ganzen Thread lesen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Jub weil seit IE 6 das ohne Änderung in der Registry nichtmehr geht: http://support.microsoft.com/kb/834489/de

    Zitat

    Deaktivieren des neuen Standardverhaltens bei der Verarbeitung von Benutzerinformationen in HTTP- oder HTTPS-URLs
    Um das neue Standardverhalten in Windows Explorer und Internet Explorer zu deaktivieren, erstellen Sie die DWORD-Werte iexplore.exe und explorer.exe in einem der folgenden Registrierungsschlüssel, und setzen Sie die Werte auf 0:

    Legen Sie den Wert für alle Benutzer des Programms im folgenden Registrierungsschlüssel fest:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
    Legen Sie den Wert nur für den aktuellen Benutzer des Programms im folgenden Registrierungsschlüssel fest:
    HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Sch*****
    Vielen Dank für die Information!

    Aber der Firefox kann das ja auch.
    Kann ich nicht irgendwie per AutoIt (ohne ändern der Registry) einen entsprechenden Request absetzen?

    Ich meine, nur weil der IE das nicht mehr anbietet, heisst das noch lange nicht, dass er es nicht KÖNNTE, wenn es aktiviert wäre.

    Die entsprechenden notwendigen Funktionen dafür sollten doch mit AutoIt irgendwie zusammen - würfelbar sein :)

    Danke schon mal!
    Gruss Veronesi

  • Hei, vielen Dank, allen, die geholfen haben.
    Besonders für den letzten Link von Microsoft.
    Nun konnte ich es mit den $WINHTTP_OPTION_USERNAME und _PASSWORD lösen!

    Für die "Nachwelt" hier noch die (bei mir funktionierende) Funktion!

    Spoiler anzeigen
    [autoit]

    Func _ConnectToUpdateServer($sFileToDownload, $sLocalFilePath)
    Local Const $sUserAgent = "Name"
    Local Const $sFullServerName = "https://www.firma.com"
    Local Const $sServerName = "www.firma.com"
    Local Const $sUsername = "username"
    Local Const $sPassword = "password"
    Local Const $sFolder = "/verzeichnis/"
    Local $sData, $Ret

    [/autoit] [autoit][/autoit] [autoit]

    $UpdateServer_hSession = _WinHttpOpen($sUserAgent, $WINHTTP_ACCESS_TYPE_DEFAULT_PROXY)
    If @error Then Return SetError(1, 0, 0)
    $UpdateServer_hConnect = _WinHttpConnect($UpdateServer_hSession, $sServerName, $INTERNET_DEFAULT_HTTPS_PORT)
    If @error Then
    _CloseOpenHandles()
    Return SetError(2, 0, 0)
    EndIf
    $UpdateServer_hRequest = _WinHttpOpenRequest($UpdateServer_hConnect, "GET", $sFolder & $sFileToDownload, Default, $sFullServerName, "*/*", $WINHTTP_FLAG_SECURE)
    If @error Then
    _CloseOpenHandles()
    Return SetError(3, 0, 0)
    EndIf
    _WinHttpSetOption($UpdateServer_hRequest, $WINHTTP_OPTION_SECURITY_FLAGS, BitOr($SECURITY_FLAG_IGNORE_CERT_CN_INVALID, $SECURITY_FLAG_IGNORE_CERT_DATE_INVALID, $SECURITY_FLAG_IGNORE_UNKNOWN_CA))
    If @error Then
    _CloseOpenHandles()
    Return SetError(4, 0, 0)
    EndIf
    _WinHttpSetOption($UpdateServer_hRequest, $WINHTTP_OPTION_USERNAME, $sUsername)
    If @error Then
    _CloseOpenHandles()
    Return SetError(5, 0, 0)
    EndIf
    _WinHttpSetOption($UpdateServer_hRequest, $WINHTTP_OPTION_PASSWORD, $sPassword)
    If @error Then
    _CloseOpenHandles()
    Return SetError(6, 0, 0)
    EndIf
    _WinHttpSendRequest($UpdateServer_hRequest)
    If @error Then
    _CloseOpenHandles()
    Return SetError(7, 0, 0)
    EndIf
    _WinHttpReceiveResponse($UpdateServer_hRequest)
    If @error Then
    _CloseOpenHandles()
    Return SetError(8, 0, 0)
    EndIf
    $sData = _WinHttpSimpleReadData($UpdateServer_hRequest, 2)
    If @error Then
    _CloseOpenHandles()
    Return SetError(8, 0, 0)
    EndIf
    $Ret = FileWrite($sLocalFilePath, BinaryToString($sData))
    _CloseOpenHandles()
    Return 1
    EndFunc ;==>_ConnectToUpdateServer

    [/autoit] [autoit][/autoit] [autoit]

    Func _CloseOpenHandles()
    _WinHttpCloseHandle($UpdateServer_hRequest)
    _WinHttpCloseHandle($UpdateServer_hConnect)
    _WinHttpCloseHandle($UpdateServer_hSession)
    Return 1
    EndFunc ;==>_CloseOpenHandles

    [/autoit]

    Herzlichen Dank und schöne Feiertage!
    Gruss, Veronesi

    Einmal editiert, zuletzt von veronesi (22. Dezember 2011 um 11:25)