私はREST curlを使用したAPIで動作する基本的な認証を持っています:
curl -X POST -H 'Accept: application/json' -u user:password http://localhost/test/
しかし、私がpowershell webRequestで同じことをしようとすると、403(許可が拒否されました)が返されます。 RESTコードで認証チェックを無効にすると、このスクリプトは正常に動作します。
PowerShellでPOSTリクエストをcurlに似たリクエストに渡すための最良の方法は何ですか、または次のスクリプトを修正するために何ができますか?.
これに関するいくつかのガイダンスを本当に感謝します。ありがとう。
これが私のpowershellスクリプトです:
function Execute-HTTPPostCommand() {
param(
[string] $target = $null
)
$username = "user"
$password = "pass"
$webRequest = [System.Net.WebRequest]::Create($target)
$webRequest.ContentType = "text/html"
$PostStr = [System.Text.Encoding]::UTF8.GetBytes($Post)
$webrequest.ContentLength = $PostStr.Length
$webRequest.ServicePoint.Expect100Continue = $false
$webRequest.Credentials = New-Object System.Net.NetworkCredential -ArgumentList $username, $password
$webRequest.PreAuthenticate = $true
$webRequest.Method = "POST"
$requestStream = $webRequest.GetRequestStream()
$requestStream.Write($PostStr, 0,$PostStr.length)
v$requestStream.Close()
[System.Net.WebResponse] $resp = $webRequest.GetResponse();
$rs = $resp.GetResponseStream();
[System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
[string] $results = $sr.ReadToEnd();
return $results;
}
$post = "volume=6001F930010310000195000200000000&arrayendpoint=2000001F930010A4&hostendpoint=100000051ED4469C&lun=2"
$URL = "http://example.com/test/"
Execute-HTTPPostCommand $URL
あなたのコードは良さそうです、私は次のように$ webrequestにHTTP_AUTHORIZATIONヘッダーを追加してみます:
$webRequest.Headers.Add("AUTHORIZATION", "Basic YTph");
YTphは、username:passwordのbase64エンコード文字列です。
私はこれが古いスレッドであることを知っていますが、これに出くわす可能性がある人にとって、invoke-restmethodは、PowerShellでAPI呼び出しを行うためのはるかに優れた、より単純な手段です。
パラメータリストをハッシュテーブルとして作成します。
$params = @{uri = 'https:/api.trello.com/1/TheRestOfYourURIpath';
Method = 'Get'; #(or POST, or whatever)
Headers = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($acctname):$($password)"));
} #end headers hash table
} #end $params hash table
$var = invoke-restmethod @params
パラメータハッシュテーブルは少し異なる場合があります。
実際にTrelloでこれを動作させることはできませんが、GitHub、Serena Business Manager、およびJiraで動作します。
Credentialsプロパティは、Windows認証に使用されているようです。この関数を使用してみてください: WebRequestで基本認証を強制する FiddlerなどのWebデバッガーを使用して、curlリクエストとリクエストの違いを確認することをお勧めします
これは、ConfluenceからHTMLファイルとしてページをダウンロードするために使用するコードです。
$pageid = "176398584" ;
$url = "http://wikiserver/wiki/pages/viewpage.action?pageId=$pageid" ;
write-Host "Establish credentials" ;
$r = Invoke-WebRequest "http://wikiserver/wiki/pages/login.action" -SessionVariable my_session ;
# $r ;
$form = $r.Forms[1];
# $form ;
# $c = $Host.UI.PromptForCredential('Your Credentials', 'Enter Credentials', '', '') ;
# $form.fields['os_username'] = $c.UserName ;
# $form.fields['os_password'] = $c.GetNetworkCredential().Password ;
$form.fields['os_username'] = "mywikirobotlogonname" ;
$form.fields['os_password'] = "mywikirobotpassword" ;
$form.fields['os_cookie'] = "true" ;
$form.fields['os_destination'] = "%2Fpages%2Fviewpage.action%3FpageId%3D$pageid" ;
$outputFile = "$pageid.html" ;
$content = Invoke-WebRequest -Uri ($url + $form.Action) -WebSession $my_session -Method POST -Body $form.Fields ;
$content.ParsedHTML.getElementById("content").innerHTML | Add-Content $outputFile
Host UI Promptedを使用して、ユーザーにログオン情報の入力を求めることができます。
変数のコメントを外してシステムの出力に表示し、フォームのコンテンツや取得したページなどをトラブルシューティングします-$ r $ form $ content