Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

PowerShell HttpWebRequest met NTLM en Params faalt

Pagina: 1
Acties:

Onderwerpen

Vraag


  • Blokker_1999
  • Registratie: februari 2003
  • Laatst online: 20:33

Blokker_1999

Full steam ahead

Topicstarter
Ik probeer via PowerShell enkele calls te maken naar een webapp en gebruikte hier in eerste instantie een Invoke-WebRequest voor. Alleen vereist de app op een gegeven moment dat er een array parameter wordt gebruikt en Invoke-WebRequest staat niet toe dat je in je call meerdere parameters met dezelfde naam gebruikt. Ik ben dan op zoek gegaan naar een alternatief en kwam op Stack Exchange een stukje code tegen dat deze mogelijkheid wel biedt en gebruik maakt van System.Net.HttpWebRequest

De web app maakt gebruik van NTLM credentials en ik kan dus aan beide de optie meegeven om de defaultcredentials te gebruiken. Maar van zodra ik bij de HttpWebRequest de body meegeef dan krijg ik van de server een "401 Unauthorized" terug

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    $req = [System.Net.HttpWebRequest]::Create($Uri)
    $req.UseDefaultCredentials = $true
    $req.KeepAlive = $false
    $req.Method = "POST"
    $req.ContentLength = $params.Length
    $req.ContentType = "application/x-www-form-urlencoded"

    $str = $req.GetRequestStream();
    $str.Write($b, 0, $b.Length);
    $str.Close();
    $str.Dispose();

    [System.Net.HttpWebResponse] $res = $req.GetResponse();
    $str = $res.GetResponseStream();
    $rdr = New-Object -TypeName "System.IO.StreamReader" -ArgumentList ($str);
    $content = $rdr.ReadToEnd();Z
    $str.Close();
    $str.Dispose();
    $rdr.Dispose();
Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (401) Unauthorized."
Als ik tijdens het testen na lijn 4 reeds een GetResponse vraag krijg ik netjes een correct antwoord van de server. Maar van zodra ik met de content begin te spelen wordt het een 401. Ik krijg via Google niet direct een antwoord gevonden van het waarom. Ik heb er ook over nagedacht om een externe tool te gebruiken zoals curl, maar deze wordt geblokkeerd door de beveiligingsinstellingen op de computer, daarnaast zou ik het ook liever in PS houden.

No keyboard detected. Press F1 to continue.

Alle reacties


  • mufana
  • Registratie: mei 2009
  • Laatst online: 18-06 08:20
Beetje lastig om zo te zeggen want ik weet niet precies wat je wilt doen.

Met een <Invoke-RestMethod> zou dit echter gewoon moeten lukken.

Heb je het al geprobeerd met: <Invoke-RestMethod -Credential (Get-Credential)>

Anders zou je ook even met Postman kunnen kijken.

Trouwens, Curl wordt binnen PowerShell gewoon vertaald naar: Invoke-WebRequest.

[Voor 23% gewijzigd door mufana op 23-11-2018 14:10]


  • Killah_Priest
  • Registratie: augustus 2001
  • Laatst online: 03:11
Invoke-WebRequest gebruikt de WebRequest class van .NET (in feite loop je nu dus deels hetzelfde te doen als met Invoke-WebRequest).
Maar wat voor query lukt niet? Ik zie in je code voorbeeld staan dat je de data als application/x-www-form-urlencoded post : normaal kun je deze in Powershell gewoon in je body kwijt (als een hashtable) waarna dit automatisch omgezet wordt naar een query.

Voorbeeld :
PowerShell:
1
2
$body = @{user = 'pietje';password = 'puk'}
Invoke-WebRequest -Uri www.google.nl -Body $body -Verbose

Dit wordt het volgende (volgens de Verbose output) :
VERBOSE: GET http://www.google.nl/?user=pietje&password=puk with 0-byte payload

  • Blokker_1999
  • Registratie: februari 2003
  • Laatst online: 20:33

Blokker_1999

Full steam ahead

Topicstarter
Invoke-WebRequest ondersteunt geen form data waarbij je een element als array wil doorsturen. Bijvoorbeeld ?item[]=1&item[]=2 omdat je dan 2x de key item[] gebruikt. Dit stukje code heb ik gevonden om rond die beperking heen te werken.

Na verder zoeken ben ik er uiteindelijk uitgekomen dat er helemaal niets mis lijkt te zijn met de code en dat het probleem in de app moet zitten. Van zodra er een body wordt meegestuurd zal de app namelijk geen NTLM authenticatie meer vragen maar wil deze verdergaan op de bestaande sessie.
Trouwens, Curl wordt binnen PowerShell gewoon vertaald naar: Invoke-WebRequest.
Klopt, daarom ook dat ik curl van het internet had gedownload om dan tegen een blokkering aan te lopen (stupid company computer).

No keyboard detected. Press F1 to continue.



Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True