Ich beschäftige mich momentan auf der Arbeit ein wenig mit Powershell und ich muss sagen als alter .Net’er es gefällt mir echt sehr gut. Erinnert mich stark an C# hat allerdings wesentlich weniger Overhead für kleinere Anwendungen.
Außerdem finde ich das Powershell für eine Scriptsprache echt sehr mächtig ist.
So nun zum Thema wie lese ich eine Webseite mit einer Webclient in Powershell aus.
Eigentlich eine sehr einfache Sache:
$webclient = new-object System.Net.WebClient $webpage = $webclient.DownloadString( "url")
Wir erstellen einen Webclient und laden mit Hilfe von webclient.DownloadString dem wir als Parameter die URL geben den Text der Webseite herunter.
Nun gehen wir aber einen Schritt weiter. Wir haben einen Webservice der eine Authentifizierung fordert und wollen auf die Daten die dahinter liegen mit unserem Powersehllscipt zu greifen:
$webclient = new-object System.Net.WebClient
$credCache = new-object System.Net.CredentialCache
$creds = new-object System.Net.NetworkCredential("Benutzername","Password")
$credCache.Add( "URL", "Basic", $creds)
$webclient.Credentials = $credCache
$webpage = $webclient.DownloadString( URL")
Was in diesem Fall hinzu gekommen ist, ist der CrendetialCache dem mit der Add Methode einfach die URL den Authentifizierungstyp und ein Object vom Typ System.Net.NetworkCrendential mit den Parametern unserer Anmeldung zugewiesen wird.
Anschließend müssen wir unseren CrendetialCache nur noch dem WebClient zuweisen um dann auf die Webseite zugreifen zu können.
Zum Schluss komme ich noch zu einem Problem, dass mich eine Zeit lang Beschäftigt hat. Wenn ihr beim Aufrufen der Webseite den folgenden Fehler bekommt:
Ausnahme beim Aufrufen von “DownloadString” mit 1 Argument(en): “Der Server hat eine Protokollverletzung ausgeführt..
Section=ResponseHeader Detail=Auf CR muss LF folgen”
Hab ich für euch auch eine Lösung gefunden:
if($netAssembly)
{
$bindingFlags = [Reflection.BindingFlags] "Static,GetProperty,NonPublic"
$settingsType = $netAssembly.GetType("System.Net.Configuration.SettingsSectionInternal")
$instance = $settingsType.InvokeMember("Section", $bindingFlags, $null, $null, @())
if($instance)
{
$bindingFlags = "NonPublic","Instance"
$useUnsafeHeaderParsingField = $settingsType.GetField("useUnsafeHeaderParsing", $bindingFlags)
if($useUnsafeHeaderParsingField)
{
$useUnsafeHeaderParsingField.SetValue($instance, $true)
}
}
}
Einfach den Code vor eueren WebClient kopieren.
Dadurch wird das useUnsafeHeaderPasing für die Laufzeit des Scriptes auf True gesetzt wodurch der Fehler nicht mehr auf tritt.
