Ein größeres Vista Problem (Einloggen)

Ja, merkwürdig. Sieht so aus, als könntest Du alles setzen, die Box versteht's nicht.

ISO ist übrigens auch falsch, da der CharSet plain ASCII ist. Hab mal ein bisschen gegoogelt und folgendes gefunden:


http://msdn2.microsoft.com/en-us/library/system.net.mime.contenttype.charset.aspx

In the following example of a Content-Type header, the value of the CharSet property is "us-ascii".
content-type: application/x-myType; charset=us-ascii
Set this property to a null reference (Nothing in Visual Basic) or String.Empty to remove the charset information from the header.

Versuche mal entweder "us-ascii" oder Nothing.

Grüsse
 
geht beides nicht sorry... vielleicht muss man sich mal eine neue Variante des einloggens Gedanken machen. Deine Variante geht ja. Kannst du mir eine exe schreiben die daten aus der registry nimmt und sich in die FB einloggt?
ich hab von delphi null plan.

das passwort liegt da:
HKEY_CURRENT_USER/Software/VB and VBA Program Settings/FritzBox/Optionen/TBPasswort

Vielleicht noch ein Rückgabe wert falls das TBPasswort = ""

Das wäre echt Super.

Gert
 
http://people.freenet.de/spongebob/fblogin.zip

als Konsole. Schweigt sich aus. ExitCode = 0 -> OK, -1 = Passwort nicht gefunden, -2=Fehler beim Einloggen.

Lt. Wireshark funktioniert das Login. Allerdings kommt eine neue Browsersession wieder mit der bekannten Loginseite...

Ohne Garantie. Probiers mal aus.

Grüsse
 
Hier mal wieder ein Delphi-Schnipsel, was die Konsolenanwendung versteckt startet, auf deren Beendigung wartet und den Rückgabewert auswertet:

Code:
function Login : Integer;
var
  proc_info: TProcessInformation;
  startinfo: TStartupInfo;
  ExitCode: LongWord;
begin
    FillChar(proc_info, sizeof(TProcessInformation), 0);
    FillChar(startinfo, sizeof(TStartupInfo), 0);
 
    startinfo.cb := sizeof(STARTUPINFO);
    startinfo.dwFlags :=STARTF_USESHOWWINDOW;
    if CreateProcess(PChar('fblogin.exe'), PChar('fblogin.exe'), nil,
            nil, false, NORMAL_PRIORITY_CLASS, nil, nil,
            startinfo, proc_info) <> False then
    begin
        WaitForSingleObject(proc_info.hProcess, INFINITE);
        GetExitCodeProcess(proc_info.hProcess, ExitCode);
        CloseHandle(proc_info.hThread);
        CloseHandle(proc_info.hProcess);
        Result := ExitCode;
    end else
    begin
        Result := -3;
    end;
end;

ExitCode kann hier folgende Werte annehmen:

0 = OK
-1 = Passwort in der Registry nicht gefunden
-2 = irgendein Fehler beim Loginprozess.

Die Funktion oben gibt entweder ExitCode oder -3 zurück, wie Du siehst.
Musst es jetzt nur noch umschreiben.

Grüsse
 
puh das war ein hartes stück arbeit.
in vba gibt es keine einfache möglichkeit den exitcode zu erhalten. Ich hab es dennoch geschafft.
Die Auswertung war recht einfach. Es ist auch schon in das makro eingebunden.

Vielen Dank an dieser Stelle.
Ich würde dich gerne auf der Homepage erwähnen. Ohne dich wären sehr ratlos.

Ich hoffe du hast nichts dagegen.
 
Nein, warum sollte ich was dagegen haben. Wo ist die Homepage?

Wollen wir noch mal versuchen, die Login-Sachen in eine DLL zu packen?

Grüsse
 
Naja der eine oder andere mag das nicht. http://www.gert-michael.de/FritzBoxDingsBums/

Das wäre natürlich auch eine Möglichkeit. Ist ja nur die Frage wie ich die in vba umsetzen kann. Welchen Vorteil hötte denn eine dll?

Ich schick dir mal ein paar schnipsel:

1.: Die Auswertung des Rückgabewertes der exe.
Code:
Function FBLogin() As Boolean

    Dim EinloggZeit     As String
    Dim FilePath        As String
    
    EinloggZeit = CDate(GetSetting("FritzBox", "Optionen", "EinloggZeit", ""))
    If EinloggZeit = "" Or EinloggZeit + CDate("00:15:00") < Date + Time Then
        FilePath = GetSetting("FritzBox", "Optionen", "TBfbloginexe", "C:\fblogin.exe")
        If FileExists(FilePath) Then
            Select Case ShellX(FilePath)
                Case 0
                    LogFile "Einloggen erfolgreich (" & Date + Time & ")"
                    FBLogin = True
                    SaveSetting "FritzBox", "Optionen", "EinloggZeit", Date & " " & Time
                Case -1
                    FBLogin = False
                    LogFile "Einloggen fehlgeschlagen, Passwort (" & Date + Time & ")"
                    MsgBox "Konnte nicht in die FB einloggen." & vbNewLine & "Bitte überprüfe das Passwort!", vbCritical
                Case -2
                    FBLogin = False
                    LogFile "Einloggen fehlgeschlagen, Netzwerk (" & Date + Time & ")"
                    MsgBox "Konnte nicht in die FB einloggen." & vbNewLine & "Bitte überprüfe ob ein Netzwerkproblem vorliegt", vbCritical
            End Select
        Else
            FBLogin = False
            LogFile "Einloggen fehlgeschlagen, Dateifehler (" & Date + Time & ")"
            MsgBox "Konnte nicht in die FB einloggen." & vbNewLine & "Die Datei fblogin.exe wurde nicht gefunden!", vbCritical
        End If
    Else
        LogFile "Einloggen nicht nötig, innerhalt 15 Min (" & Date + Time & ")"
        FBLogin = True
    End If
End Function
(Case -1 und -2 könnte man zusammenfassen)

2. Das aufrufen mir Rückgabewert
Code:
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Public Function ShellX( _
    ByVal PathName As String, _
    Optional ByVal WindowStyle As Long = vbMinimizedFocus, _
    Optional ByVal Events As Boolean = True _
  ) As Long
    'Deklarationen:
  Const STILL_ACTIVE = &H103&
  Const PROCESS_QUERY_INFORMATION = &H400&
  Dim ProcId As Long
  Dim ProcHnd As Long

  'Prozess-Handle holen:
  ProcId = Shell(PathName, WindowStyle)
  ProcHnd = OpenProcess(PROCESS_QUERY_INFORMATION, True, ProcId)

  'Auf Prozess-Ende warten:
  Do
    If Events Then DoEvents
    GetExitCodeProcess ProcHnd, ShellX
  Loop While ShellX = STILL_ACTIVE

  'Aufräumen:
  CloseHandle ProcHnd

End Function

3. Die Funktion FBlogin wird so aufgrufen:
Code:
If FBLogin Then
...
EndIf

Der Code ist fertig. Es gibt auch schon eine Beta die draußen ist. Ich kann nicht so viel testen, wie ich gerne möchte.

Gruß Gert
 
Nun gut, wenn's für Dich läuft soll's mir auch recht sein :)

Grüsse
 
Problem! Wir haben die Ursache gefunden. Die FB kommt mit dem Zusatz Content-Typ nicht klar. Vista fügt das aber automatisch an. (Wo weiß ich nicht, und warum deins funzt auch nicht.) Wir haben das grad unter XP getestet. Es ist also ein FB-Problem. Ich will mich mal freundlich an AVM melden.

Ich brauch noch eine exe/dll. Da ich ja nichts zur FB senden kann, geht auch das Wählen nicht.
Dieser Code macht das:
Code:
Private Function sendRequestToBox(dialCode As String, fonanschluss As Long) As String
    ' überträgt die zum Verbindungsaufbau notwendigen Daten per WinHttp an die FritzBox
    ' Parameter:  dialCode (string):    zu wählende Nummer
    '             fonanschluss (long):  Welcher Anschluss wird verwendet?
    ' Rückgabewert (String):            Antworttext (Status)
    
    Dim http               As New WinHttpRequest ' WinHttp-Objekt
    Dim Formdata           As String             ' an die FritzBox zu sendende Daten
    Dim WinHTTPPostRequest As String             ' Antwort der FritzBox
    Dim FBOX_ADR           As String             ' Adresse der FritzBox
    Dim FBOX_PASSWORD      As String             ' Passwort der FritzBox
    Dim ResponseInfo       As String             ' Antwortstring
    
    If FritzBox.FBLogin Then
        FBOX_ADR = GetSetting("FritzBox", "Optionen", "TBFBAdr", "192.168.178.1")
        http.Open "POST", "http://" & FBOX_ADR & "/cgi-bin/webcm", False

[COLOR="Red"]        Formdata = "getpage=../html/de/menus/menu2.html&telcfg:settings/DialPort=" _
            & CStr(fonanschluss) & "&telcfg:command/Dial=" & dialCode[/COLOR]
        ' Formulardaten senden
        On Error GoTo catch ' Fehler abfangen
        http.send Formdata
        On Error GoTo 0 ' Fehler nicht mehr abfangen
        ' Antwort empfangen
        WinHTTPPostRequest = http.ResponseText
        Debug.Print http.ResponseText
        ' Antwort auswerten
        If Len(WinHTTPPostRequest) > 0 Then
            ' Wenn der String "FRITZ!Box Anmeldung" im Reponse enthalten ist, ist etwas schief gelaufen.
            ' Dann kommt die Fritz Box-Anmeldeseite, wo sich der Benutzer anmelden muss
            If Not InStr(WinHTTPPostRequest, "FRITZ!Box Anmeldung") = 0 Then
                ' Wahrscheinlich falsches Passwort
                ResponseInfo = "Fehler!" & vbNewLine & "Evtl. Passwort falsch?"
            Else
                If dialCode = "ATH" Then
                    ResponseInfo = "Verbindungsaufbau" & vbNewLine & "wurde abgebrochen!"
                Else
                    ResponseInfo = "Wähle " & dialCode & vbNewLine & "Jetzt abheben!"
                End If
            End If
        End If
        ' Fertig
        GoTo finally
    End If
catch:
    ResponseInfo = vbNewLine & "Fehler bei HTTP/Post"
    If Err.Number = -2147012889 Then
        MsgBox "Fritz!Box konnte nicht gefunden werden. Ist die Netzwerkverbindung OK?", vbCritical, "Fehler"
    Else
        MsgBox "Fehler: " & Err.Description, vbCritical, "Fehler"
    End If
finally:
    sendRequestToBox = ResponseInfo
End Function

Kan man eine dll erstellen, die gewisse Eingangsdaten bekommt und entweder sich einloggt oder wählt?
 
Hmm. Das geht mir jetzt doch ein bisschen zu weit. Ich denke, AVM hat Recht mit der Meckerei, denn der Content-Type IST NICHT UTF-8. Du kannst ja auch nicht zu irgend jemanden sagen: "Good Morning" und danach: Dies war jetzt Serbo-Kroatisch...

Versuchts mal mit der XML-HTTP Schnittstelle (bereitgestellt durch MSXML.DLL) Dort gibt es sehr schöne abgehobene Funktionen, mit denen man in einer Zeile einen HTTP Post abschiesst.

Ich klinke mich hier aus.

UPDATE: http://msdn2.microsoft.com/en-us/library/ms759148.aspx

Grüsse
 
Zuletzt bearbeitet:
na okay. Vielleicht hab ich mich falsch ausgedrückt:
Es gibt dieses:
Content-Type: application/x-www-form-urlencoded\r\n
Damit kommt die FB klar.
Vista/Office/wer auch sonnst
macht daraus das:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n
Damit kommt die Box nicht klar. (egal was der charset ist)
In XP gibt es den Charset-zusatz nicht und da funktioniert das.
Man kann jetzt dieses Zusatz ändern. Das Ändert aber nichts am Problem. Das Problem ist nicht die Charsetdefinition sondern das Vorhandensein einer solchen.

Tut mir leid, wenn ich dich verärgert habe.
Leider weiß ich nicht was/wer diese Charset definition anhängt.

ich hoffe du verstehst mich

Trotzdem Danke

Gert
 
Ja, klar. Ich habe das Problem schon verstanden.

Versuch's mal mit der IXMLHTTP Geschichte. Das passt schon.

Grüsse
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.