none
Invoke-webrequest und navigieren auf Webseiten RRS feed

  • Frage

  • Hallo,

    da es ja seit Powershell 3.0 das cmdlet“ invoke-webrequest“ gibt, möchte ich webseiten nicht mehr über Netzklassen ansteuern.

    Zur Zeit melde ich mich auf einer Webseite mit meinen Anmeldedaten und dem cmdlet Invoke-Webrequest an. Um weiterführende Links zu öffnen, nutze ich die Netzklassen Methode „New-Object -ComObject InternetExplorer.Application“

    Hierbei muss allerdings für jede weitere Seite die aufgerufen werden soll, ein Zeitpuffer eingebaut werden.

    Auch habe ich mit "invoke-webrequest" weitere Möglichkeiten der Verarbeitung des contents

    Wie kann ich nun nur mit "invoke-webrequest" nach der Anmeldung auf weiterführende Links zugreifen?

    Hier mein script, welches beide Methoden nutzt und mit Zeitverzögerung funktioniert:

    # Credentials, first login 
    $Username = 'MyName'
    $password = get-content 'C:\Password.txt' | convertto-securestring
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
    $StartURL = 'http://www.Webite/wbb4/'
    $ie = Invoke-WebRequest -URI $StartURL -Credential $cred
    
    # navigate to second link and save html page
    $ie = New-Object -ComObject InternetExplorer.Application
    $ie.visible = $false
    $ie.Navigate('http://www.Website/wbb4/index.php/Board/Aktuelle')
    Start-Sleep -Seconds 4
    $ie.Document.body.outerHTML | Out-File -FilePath 'C:\save.html'

    Einfach den zweiten Link ebenfalls mit invoke-webrequest zu öffnen, funktioniert nicht. Der Zugriff wird verweigert:

    # navigate to second link and save html page
    $StartURL2 = 'http://www.Website/wbb4/index.php/Board/Aktuelle'
    $ie2 = Invoke-WebRequest -URI $StartURL2  
    Ist es überhaupt möglich, mit Invoke-Webrequest nach der Anmeldung auf weitere Links zuzugreifen? Oder habe ich hier einen falschen Denkansatz?

    Bin für jede Idee dankbar!


    • Bearbeitet Sönke T Montag, 14. September 2015 12:11 Formatierung
    Montag, 14. September 2015 12:09

Antworten

  • Hallo,

    letztendlich also das Problem, dass du dein Passwort nicht eingeben willst, es aber auch nicht im Klartext im Script stehen haben willst.. du fuer den Loginvorschlag von David das Kennwort aber im Klartext brauchst. :-)

    Du koenntest nach den 3 fett geschriebennen Zeilen, also nach dem dem Bauen des "Cred-Objects" das Passwort im Klartext wie folgt aus $Cred extrahieren.

    $pwd = [Runtime.InteropServices.Marshal]::PtrToStringAuto( [Runtime.InteropServices.Marshal]::SecureStringToBSTR( $cred.Password ))

    Dann hast du in $pwd dein Kennwort im Klartext so lange das Script laeuft, dierkt sieht es aber Keiner.  Wer an die Datei mit dem Securestring kommt kann also dein Passwort in Klartext wandeln. Ob das Ganze sicher ist musst du selbst entscheiden.

    Beste Gruesse
    brima



    • Bearbeitet brima Donnerstag, 17. September 2015 09:11
    • Als Antwort markiert Sönke T Donnerstag, 17. September 2015 13:24
    Donnerstag, 17. September 2015 08:59

Alle Antworten

  • Hallo,

    ich kenne mich zwar nicht mit Invoke-WebRequest aus, aber nach einem kurzen Experiment, bin ich auf folgendes gekommen:

    $Link = (Invoke-WebRequest "www.wikipedia.org").Links | 
         where{$_.outerText -eq "English"}
    
    Invoke-WebRequest ($Link.href -replace "^//")

    Die erste Zeile (zusammen mit der where-Pipeline) wählt einen bestimmten Link aus der Wikipedia-Hauptseite aus. Dieser wird dann in der zweiten Zeile ausgeführt. Vielleicht hilft dir das ja schon irgendwie. 

    Viele Grüße

    Christoph

    Montag, 14. September 2015 12:45
  • @ christoph:

    Leider nein, mein Problem besteht ja darin, dass ich ich zuerst an einer webseite anmelden muss und dannach nicht auf die weiteren Links  mit invoke-webrequest zugreifen kann.

    Montag, 14. September 2015 13:35
  • Servus,

    bitte probier doch mal folgendes Konstrukt aus:

    $StartURL = 'http://www.google.de'
    $c = $host.UI.PromptForCredential('Your Credentials', 'Enter Credentials', '', '')
    $ie = Invoke-WebRequest -URI $StartURL -SessionVariable s -Credential $c
    $ie = Invoke-WebRequest -URI $StartURL -WebSession $s 
    

    Du speicherst dir die Session in die Sessionvariable und nutzt sie später weiter mit WebSession, in der die Credentials dann enthalten sind.

    # Credentials, first login 
    $Username = 'MyName'
    $password = get-content 'C:\Password.txt' | convertto-securestring
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
    $StartURL = 'http://www.Webite/wbb4/'
    $ie = Invoke-WebRequest -URI $StartURL -Credential $cred -SessionVariable s
    
    
    $weitereUrl= 'http://www.Webite/wbb4/weiter'
    $ie = Invoke-WebRequest -URI $weitereUrl -WebSession $s

    Hier noch ein wenig Input:

    GetHrefs


    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    

    Caution: This post was written with the intention to help and may contain errors.
    If my post was helpful or answered your question please mark it respectively. Thanks.

    Montag, 14. September 2015 17:46
  • @David: Danke, genau wegen der Möglichkeiten aus deinem Input Link möchte ich mit invoke-webrequest arbeiten. Dein Konstrukt funktioniert leider nicht!

    Vermutlich, da ich mich in einem Forum Anmelde, welches mir in der Anmeldemaske auch die Möglichkeit zur Registrierung gibt und der Wert in der PS standardmäßig auf Registrieren steht. Über den Browser steht die Anmeldemaske auf Login.

    Ich habe eine Anmeldung mit Invoke-Webrequest und das Aufrufen dank folgenden Videos nun hinbekommen. Dort wird sehr genau beschrieben, wie ein Login von statten geht. So fand ich auch den Wert Registrierung und Login:

    https://www.youtube.com/watch?v=VmHDiXQTs1s

    Leider muss ich im script mein Passwort angeben, dies will ich eigentlich vermeiden. Hat hierzu noch jemand eine Idee?

    So funktioniert es mit Passwort:

    $SetSesssionVar = Invoke-WebRequest -uri 'www.webseite/index.php/login' -SessionVariable session
    
    $dbform =  $SetSesssionVar.forms[1]
    $dbform.fields['username']='Anmeldename'
    $dbform.fields['password']='Passwort'
    $dbform.fields['action']='login'
    
    $login = Invoke-WebRequest -uri ($dbform.Action) -WebSession $session -Method Post -Body $dbform.fields
    $GetFirstHTML = Invoke-WebRequest -uri 'http:/webseite/index.php/Board/WeitereSeite/' -WebSession $session -Method Get 
    
    $GetFirstHTML|out-file c:\temp\a.html

    Was nicht funktioniert (SecureString):

    $Username = 'Anmeldename'
    $password = get-content 'C:\securestring.txt' | convertto-securestring
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
    
    $SetSesssionVar = Invoke-WebRequest -uri 'www.webseite/index.php/login' -SessionVariable session
    
    $dbform =  $SetSesssionVar.forms[1]
    $dbform.fields['action']='login'
    
    $login = Invoke-WebRequest -uri ($dbform.Action) -WebSession $session -Method Post -Body $dbform.fields -Credential $cred
    $GetFirstHTML = Invoke-WebRequest -uri 'http:/webseite/index.php/Board/WeitereSeite/' -WebSession $session -Method Get
    
    $GetFirstHTML.RawContent |out-file c:\temp\a.html


    Donnerstag, 17. September 2015 08:12
  • Hallo,

    letztendlich also das Problem, dass du dein Passwort nicht eingeben willst, es aber auch nicht im Klartext im Script stehen haben willst.. du fuer den Loginvorschlag von David das Kennwort aber im Klartext brauchst. :-)

    Du koenntest nach den 3 fett geschriebennen Zeilen, also nach dem dem Bauen des "Cred-Objects" das Passwort im Klartext wie folgt aus $Cred extrahieren.

    $pwd = [Runtime.InteropServices.Marshal]::PtrToStringAuto( [Runtime.InteropServices.Marshal]::SecureStringToBSTR( $cred.Password ))

    Dann hast du in $pwd dein Kennwort im Klartext so lange das Script laeuft, dierkt sieht es aber Keiner.  Wer an die Datei mit dem Securestring kommt kann also dein Passwort in Klartext wandeln. Ob das Ganze sicher ist musst du selbst entscheiden.

    Beste Gruesse
    brima



    • Bearbeitet brima Donnerstag, 17. September 2015 09:11
    • Als Antwort markiert Sönke T Donnerstag, 17. September 2015 13:24
    Donnerstag, 17. September 2015 08:59
  • Achso - das ging nicht ganz hervor mit Login über Login-Maske.

    Dann ist es leider so wie Brima sehr gut erklärt hat.

    s. Beispiel hier Link

    Wird das PW natürlich bei der Eingabe im Rohformat gebraucht.


    Greetings,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - München

    Blog    

    Caution: This post may contain errors.

    Donnerstag, 17. September 2015 09:22
  • Danke euch beiden, jetzt funktioniert es! Da das script dreimal im Monat über einen task gestartet werden soll, ist dies die beste Lösung für mich und Sicherheitstechnisch vertretbar. (Heim Netzwerk, Privat).
    Habe das verschlüsselte Passwort eingebaut, um etwas für scripte in einer Firmenumgebung zu lernen.

    Interessehalber noch zwei kleine Fragen, dann markiere ich morgen den Thread als Antwort:

    1. Würde man in einer Firmenumgebung nicht mit einem Passwort in einer Antwortdatei arbeiten? Falls nicht, welche Art wäre dort anzuwenden?

    2. Sollte man am Ende des scriptes die sessionvariable löschen oder sich irgendwie anders von der Webseite wieder abmelden?

    Falls es wer gebrauchen kann, hier die funktionierende Version:

    (Wobei sich die Anmeldefelder auf anderen Webseiten unterscheiden können).

    $Username = 'Anmeldename'
    $password = get-content 'C:\securestring.txt' | convertto-securestring
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
    
    $pwd = [Runtime.InteropServices.Marshal]::PtrToStringAuto( [Runtime.InteropServices.Marshal]::SecureStringToBSTR( $cred.Password ))
    
    
    $SetSesssionVar = Invoke-WebRequest -uri 'www.webseite/index.php/login' -SessionVariable session
    #$session
    $dbform =  $SetSesssionVar.forms[1]
    #$dbform.fields
    $dbform.fields['username']='Anmeldename'
    $dbform.fields['password']=$pwd
    $dbform.fields['action']='login'
    #$dbform.Action
    
    $login = Invoke-WebRequest -uri ($dbform.Action) -WebSession $session -Method Post -Body $dbform.fields
    $GetFirstHTML = Invoke-WebRequest -uri 'http://webseite/index.php/Board/WeitereSeite/' -WebSession $session -Method Get 
    
    $GetFirstHTML.RawContent |out-file c:\temp\a.html

    Donnerstag, 17. September 2015 11:35
  • Hallo,

    Punkt 1)

    Ja das wird auch in Firmen gemacht, aber wie gesagt die Entscheidung ob sicher oder nicht muss im Prinzip von Fall zu Fall entschieden werden ... Oft laufen die Scripte dort ja auf verschiedenen Systemen, d.h du musst die Datei mit dem SecureString uebertragbar machen, also auch mit den Parameter -key arbeiten, den du dann wiederum verschleiern kannst um einem Angreifer die Arbeit zu erschweren.

    Hier noch ein Link zum Thema:

    Click

    Punkt 2)

    Die Sessionvariable "verschwindet" beim beenden des Scriptes. Wenn es auf der Seite einen Logoff/Abmelden link gibt wuerde ich ihn nutzen.

    Beste Gruesse
    brima

     


    • Bearbeitet brima Donnerstag, 17. September 2015 12:35
    Donnerstag, 17. September 2015 12:26
  • Danke für die Info und eure Hilfe, damit ist alles erledigt!
    Donnerstag, 17. September 2015 13:25