powershell httpwebrequest получить проблему с методом cookiecontainer?
Я пытаюсь очистить веб-сайт, который имеет аутентификацию пользователя. Я могу сделать сообщение, чтобы отправить свой логин и сохранить cookie. Однако, после входа в систему я получаю ошибку 403 при попытке доступа к защищенной странице.
$url = "https://some_url"
$CookieContainer = New-Object System.Net.CookieContainer
$postData = "User=UserName&Password=Pass"
$buffer = [text.encoding]::ascii.getbytes($postData)
[net.httpWebRequest] $req = [net.webRequest]::create($url)
$req.method = "POST"
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
$req.Headers.Add("Accept-Language: en-US")
$req.Headers.Add("Accept-Encoding: gzip,deflate")
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7")
$req.AllowAutoRedirect = $false
$req.ContentType = "application/x-www-form-urlencoded"
$req.ContentLength = $buffer.length
$req.TimeOut = 50000
$req.KeepAlive = $true
$req.Headers.Add("Keep-Alive: 300");
$req.CookieContainer = $CookieContainer
$reqst = $req.getRequestStream()
$reqst.write($buffer, 0, $buffer.length)
$reqst.flush()
$reqst.close()
[net.httpWebResponse] $res = $req.getResponse()
$resst = $res.getResponseStream()
$sr = new-object IO.StreamReader($resst)
$result = $sr.ReadToEnd()
$res.close()
$url2 = "https://some_url/protected_page"
[net.httpWebRequest] $req2 = [net.webRequest]::create($url2)
$req2.Method = "GET"
$req2.Accept = "text/html"
$req2.AllowAutoRedirect = $false
$req2.CookieContainer = $CookieContainer
$req2.TimeOut = 50000
[net.httpWebResponse] $res2 = $req2.getResponse()
$resst = $res2.getResponseStream()
$sr = new-object IO.StreamReader($resst)
$result = $sr.ReadToEnd()
решение: поэтому, попробовав почти все, я в конечном итоге попробовал что-то другое, и это действительно работает.
после публикации логина и получения cookie сеанса я использую webclient для доступа к безопасной странице, добавив строка cookie для заголовков.
$web = new-object net.webclient
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"])
$result = $web.DownloadString("https://secure_url")
одна из интересных вещей об этом заключается в том, что webclient сохраняет cookie. Чтобы получить доступ к другой защищенной странице, вы можете просто вызвать $web.downloadstring("https://another_secure_url") :)
3 ответов
Я обнаружил, что, поскольку cookies могут иметь дополнительную информацию (например, URL или только HTTP), $res.Заголовки ["Set-Cookie"] не работали для меня. Но используя переменную $CookieContainer, вы можете легко изменить ее, чтобы использовать GetCookieHeader (url), который удалит дополнительную информацию и оставит вас с правильно отформатированной строкой cookie:
$web = new-object net.webclient
$web.Headers.add("Cookie", $CookieContainer.GetCookieHeader($url))
$result = $web.DownloadString($url)
люди просили полное приложение, здесь у вас есть это
$url = "https://some_url"
$CookieContainer = New-Object System.Net.CookieContainer
$postData = "User=UserName&Password=Pass"
$buffer = [text.encoding]::ascii.getbytes($postData)
[net.httpWebRequest] $req = [net.webRequest]::create($url)
$req.method = "POST"
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
$req.Headers.Add("Accept-Language: en-US")
$req.Headers.Add("Accept-Encoding: gzip,deflate")
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7")
$req.AllowAutoRedirect = $false
$req.ContentType = "application/x-www-form-urlencoded"
$req.ContentLength = $buffer.length
$req.TimeOut = 50000
$req.KeepAlive = $true
$req.Headers.Add("Keep-Alive: 300");
$req.CookieContainer = $CookieContainer
$reqst = $req.getRequestStream()
$reqst.write($buffer, 0, $buffer.length)
$reqst.flush()
$reqst.close()
[net.httpWebResponse] $res = $req.getResponse()
$resst = $res.getResponseStream()
$sr = new-object IO.StreamReader($resst)
$result = $sr.ReadToEnd()
$res.close()
$web = new-object net.webclient
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"])
$result = $web.DownloadString("https://secure_url")
Я хотел бы использовать IE automation. С этим не нужно работать с куки, заголовки и т. д. Гораздо проще.