Invoke-WebRequest GetSystemWebProxy()

9
在PowerShell 2.0中,您可以通过以下方式设置所需的代理,而无需知道确切的代理设置:
$proxy = [System.Net.WebRequest]::GetSystemWebproxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

现在,我的问题是如果我不知道代理设置,我是否可以使用上述内容并结合 PowerShell 3.0 的 Invoke-WebRequest。以下是我希望能够实现的内容:

$proxy = [System.Net.WebRequest]::GetSystemWebproxy()
$proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials

$WS.Proxy = $proxy

$login = Invoke-WebRequest https://website.com/login_form.html -SessionVariable WS

然而,当我尝试执行此操作时,出现错误(显然是由于我的公司代理),指示我的凭据无法验证。我希望最终这会起作用,但也许我只是犯了一个简单的错误。

3个回答

16

也许这可以帮助您,我将其保存在我的个人资料中。它使用新的$PSDefaultParameterValues偏好变量为新的Web cmdlet设置默认代理值。该代码会检测是否在我的办公环境中,并相应地设置设置。这样可以节省每次使用这些命令时指定设置的时间。

if(Test-Connection myCorpProxy -Count 1 -Quiet)
{
    $global:PSDefaultParameterValues = @{
        'Invoke-RestMethod:Proxy'='http://myCorpProxy:8080'
        'Invoke-WebRequest:Proxy'='http://myCorpProxy:8080'
        '*:ProxyUseDefaultCredentials'=$true
    }
}

我之前没有想过用这种方式来修复它...但这非常巧妙,在许多情况下都很有用。但是如果他们创建新的命令... - Chris DaMour

14

您可以使用此代码:

$dest = "http://www.google.fr"
$proxyurl = ([System.Net.WebRequest]::GetSystemWebproxy()).GetProxy($dest)
Invoke-WebRequest $dest -Proxy $proxyurl -ProxyUseDefaultCredentials

0
你上面的代码的实际问题(尽管Shay的更优雅)是你试图在变量不存在之前给它设置属性。在调用Invoke-WebRequest之前,SessionVariable "$WS"并不存在,但你却试图在它之前设置.Proxy属性。
如果它在某一时刻起作用过,那可能是因为你之前创建了$WS的实例,因此能够在测试期间使用该对象。但在一个全新/干净的运行中,当脚本自上而下处理时,它还不存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接