Mam działający skrypt PowerShell 3.0, który korzysta z Invoke-WebRequest
, aby opublikować formularz i zapisać odpowiednie wyjściowe dane HTML. Niestety, skrypt nie działa na stacjach roboczych z tylko PowerShell 2.0.Wysyłanie formularza HTTP bez użycia 'Invoke-WebRequest'
Miałem nadzieję, że ktoś mógłby pomóc w konwersji poniższego skryptu do pracy z PowerShell 2.0 (bez konieczności instalowania modułów PS, pakietów lub aktualizacji PowerShell). Wygląda na to, że potrzebuję używać klienta WWW .NET, ale nie mam na tyle doświadczenia, aby to zrobić. Przykład pracy (oparty na moim scenariuszu) byłby niezwykle doceniony!
PS: Używam sls -pattern
do odfiltrowywania zawartości surowego wyjścia HTML. Jeśli istnieje bardziej niezawodny sposób identyfikowania pewnych elementów w surowych wydrukach, nie miałbym nic przeciwko zobaczeniu przykładu.
$UserAgent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.3; MS-RTC LM 8; .NET4.0E)'
$r=Invoke-WebRequest -Uri 'http://web.ourwebserver.com/test.aspx' -UseDefaultCredentials -SessionVariable WebSession
$form = $r.Forms[0]
$fields = Invoke-WebRequest -Uri 'http://web.ourwebserver.com/test.aspx' -WebSession $WebSession | select -ExpandProperty inputfields | select name, value
$viewstate = $fields | ?{$_.name -match "VIEWSTATE"} | select -ExpandProperty value
$eventvalidation = $fields | ?{$_.name -match "EVENTVALIDATION"} | select -ExpandProperty value
$form.Fields["__EVENTVALIDATION"] = $eventvalidation
$form.Fields["ctl00`$MainContent`$phone"] = "454-454-2345"
$form.Fields["ctl00`$MainContent`$Submit"] = "Submit"
$response = Invoke-WebRequest -Uri 'http://web.ourwebserver.com/test.aspx' -WebSession $WebSession -Method POST -Body $form.Fields -ContentType 'application/x-www-form-urlencoded'
$result = $response.rawcontent
EDIT: Poniżej jest moja pierwsza próba uzyskania skrypt do pracy. W każdym razie, to oczywiście nie robi to samo, co mój skrypt PRACY Invoke-WebRequest powyżej
$URL = "http://web.ourwebserver.com/test.aspx"
$wc = new-object net.WebClient
$wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
$wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET CLR 1.1.4322; InfoPath.3; MS-RTC LM 8; .NET4.0E)")
$wc.UseDefaultCredentials = $true
### EventValidation/ViewState Extraction Code ###
$probe = $wc.downloadData($url)
$s = [text.encoding]::ascii.getString($probe)
$start = $s.indexOf('id="__VIEWSTATE"', 0) + 24
$end = $s.indexOf('"', $start)
$viewstate = $s.substring($start, $end-$start)
$start = $s.indexOf('id="__EVENTVALIDATION"', 0) + 30
$end = $s.indexOf('"', $start)
$eventvalidation = $s.substring($start, $end-$start)
###
$NVC = New-Object System.Collections.Specialized.NameValueCollection
$NVC.Add("__EVENTVALIDATION", $eventvalidation)
$NVC.Add("ctl00`$MainContent`$phone", "454-454-2345")
$NVC.Add("ctl00`$MainContent`$Submit", "Submit")
$wc.QueryString = $NVC
$Result = $WC.UploadValues($URL,"POST", $NVC)
[System.Text.Encoding]::UTF8.GetString($Result)
$WC.Dispose();
Jestem prawie pewny, że poprawnie wysłałem większość odpowiedzi. Myślę, że może robić coś nie tak podczas dodawania wartości/danych do $ NVC. – MKANET