2009-02-03 5 views
39

En C#, je pourrais faire quelque chose comme ceci:Comment faire une demande Web authentifiée dans Powershell?

System.Net.WebClient w = new System.Net.WebClient(); 
w.Credentials = new System.Net.NetworkCredential(username, auth, domain); 
string webpage = w.DownloadString(url); 

est-il une version Powershell de cela, ou devrais-je appeler simplement par la CLR?

Répondre

62

Le PowerShell est presque exactement le même.

$webclient = new-object System.Net.WebClient 
$webclient.Credentials = new-object System.Net.NetworkCredential($username, $password, $domain) 
$webpage = $webclient.DownloadString($url) 
+1

est-ce que cela a cessé de fonctionner pour quelqu'un d'autre, tout à coup? (401) Non autorisé – meffect

+0

@meffect Le commentaire ci-dessous m'a aidé. '$ webclient.Credentials = Nouveau-objet System.Management.Automation.PSCredential ($ nomutilisateur, $ motdepasse)' –

+3

Notez que si vous voulez simplement utiliser les informations d'identification actuelles (par exemple pour accéder à un serveur authentifié sur l'intranet) , vous pouvez utiliser '$ webclient.UseDefaultCredentials = $ true' (comme dans [Réponse de Ralph] (http://stackoverflow.com/a/12421075/1443496)). –

23

Pour ceux qui ont besoin Powershell pour renvoyer des informations supplémentaires comme le Http StatusCode, voici un exemple. Inclus sont les deux moyens les plus probables de transmettre les informations d'identification.

Son une version légèrement modifiée de cette réponse SO:
How to obtain numeric HTTP status codes in PowerShell

$req = [system.Net.WebRequest]::Create($url) 
# method 1 $req.UseDefaultCredentials = $true 
# method 2 $req.Credentials = new NetworkCredential($username, $pwd, $domain); 
try 
{ 
    $res = $req.GetResponse() 
} 
catch [System.Net.WebException] 
{ 
    $res = $_.Exception.Response 
} 

$int = [int]$res.StatusCode 
$status = $res.StatusCode 
return "$int $status" 
+1

Excellente réponse supplémentaire, c'était en fait exactement ce que je cherchais. – LimpingNinja

+2

Je peux me tromper, mais j'ai dû remplacer 'new NetworkCredential' par' $ passwd = ConvertTo-SecureString "nowisthetime4U" -AsPlainText -Force; "suivi par $ request.Credentials = New-Object System.Management.Automation.PSCredential ("pwatson_at_phs_org", $ passwd) – lit

2

Dans une authentification NTLM de cas ne fonctionne toujours pas si on leur donne les informations d'identification correcte.

Il y a un mécanisme qui annulera NTLM auth au sein WebClient, voir ici pour plus d'informations: System.Net.WebClient doesn't work with Windows Authentication

Si vous essayez réponse ci-dessus et il ne fonctionne toujours pas, suivez le lien ci-dessus pour ajouter registre pour rendre le domaine sur la liste blanche

Publiez ceci ici pour sauver le temps des autres;)

Questions connexes