2009-02-20 28 views
31

Khi tạo đơn giản web request có cách nào để báo cho môi trường PowerShell chỉ sử dụng cài đặt proxy của Internet Explorer của bạn không?PowerShell, Yêu cầu Web và Proxy

Cài đặt proxy của tôi được kiểm soát bởi chính sách mạng (hoặc tập lệnh) và tôi không muốn phải sửa đổi tập lệnh ps sau này nếu tôi không phải thực hiện.

CẬP NHẬT: Thông tin tuyệt vời từ những người tham gia. Kịch bản mẫu cuối cùng mà tôi sẽ sử dụng cho điều này sẽ trông giống như sau:

$proxyAddr = (get-itemproperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings').ProxyServer 
$proxy = new-object System.Net.WebProxy 
$proxy.Address = $proxyAddr 
$proxy.useDefaultCredentials = $true 

$url = "http://stackoverflow.com" 
$wc = new-object system.net.WebClient 
$wc.proxy = $proxy 
$webpage = $wc.DownloadData($url) 
$str = [System.Text.Encoding]::ASCII.GetString($webpage) 
Write-Host $str 

Trả lời

13

chưa được kiểm tra:

$user = $env:username 
$webproxy = (get-itemproperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet 
Settings').ProxyServer 
$pwd = Read-Host "Password?" -assecurestring 

$proxy = new-object System.Net.WebProxy 
$proxy.Address = $webproxy 
$account = new-object System.Net.NetworkCredential($user,[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd)), "") 
$proxy.credentials = $account 

$url = "http://stackoverflow.com" 
$wc = new-object system.net.WebClient 
$wc.proxy = $proxy 
$webpage = $wc.DownloadData($url) 
$string = [System.Text.Encoding]::ASCII.GetString($webpage) 

...

8
$proxy = New-Object System.Net.WebProxy("http://yourProxy:8080") 
$proxy.useDefaultCredentials = $true 
$wc = new-object system.net.webclient 
$wc.proxy = $proxy 
$wc.downloadString($url) 
+0

Điều này sẽ không hiệu quả đối với tôi. Thay vì đọc trang web, nó đọc lời nhắc proxy cho thông tin xác thực: ( – Bluz

+0

Thử đặt thông tin đăng nhập của bạn qua $ proxy.credentials (và đặt $ proxy.useDefaultCredentials thành $ false), YMMV. –

+0

Đẹp một Shay, đó là thông minh nhưng tiếc là tôi vẫn nhận được cùng một trang: (Tôi nghĩ rằng tôi sẽ chỉ sử dụng cách cũ làm nó và sao chép dán html tôi muốn vào một tập tin văn bản và mang nó từ đó. Đó là một – Bluz

17

Hơi tốt hơn là sau đây, cũng xử lý các proxy được phát hiện tự động:

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

$wc = new-object system.net.WebClient 
$wc.proxy = $proxy 
$webpage = $wc.DownloadData($url) 

(chỉnh sửa) Hơn nữa việc trên, định nghĩa này dường như làm việc tốt cho tôi, quá:

function Get-Webclient { 
    $wc = New-Object Net.WebClient 
    $wc.UseDefaultCredentials = $true 
    $wc.Proxy.Credentials = $wc.Credentials 
    $wc 
} 
+0

Khi bạn nói 'proxy được phát hiện tự động', bạn có nghĩa là các kịch bản cấu hình tự động (tùy chọn được gọi trong Internet Explorer) không? – Chris

+0

Tôi nghĩ vậy, vâng (đã lâu rồi kể từ khi Tôi đã viết rằng :-)) –

+0

Lưu ý rằng điều này dường như không hoạt động trên PS 2.0. Tôi nghĩ rằng có một lỗi trong cách NTLM được xử lý bởi WebClient cho phiên bản .net cũ hơn ... yeah chắc chắn rằng bạn có một phiên bản gần đây của PS để làm điều này. – Nacht

7

Đây là muộn hơn nhiều so với câu hỏi ban đầu, nhưng vẫn còn một câu trả lời thích hợp cho các phiên bản sau này của PowerShell. Bắt đầu từ năm v3, chúng ta có hai mục có thể giải quyết vấn đề này:

Invoke-WebRequest - thay thế sử dụng system.net.webclient cho hầu hết các kịch bản

$ PSDefaultParameterValues ​​ - mà có thể lưu trữ thông tin chi tiết cho các thông số

Cách sử dụng chúng cùng nhau để giải quyết vấn đề ban đầu của cài đặt proxy được kiểm soát bởi chính sách mạng (hoặc tập lệnh) và không phải sửa đổi tập lệnh ps sau này?

Gọi-WebRequest đi kèm với thông số -Proxy và -ProxyUseDefaultCredentials.

Chúng tôi lưu trữ câu trả lời của chúng tôi để các thông số trong $ PSDefaultParameterValues, như vậy: $PSDefaultParameterValues.Add('Invoke-WebRequest:Proxy','http://###.###.###.###:80') $PSDefaultParameterValues.Add('Invoke-WebRequest:ProxyUseDefaultCredentials',$true)

Bạn có thể thay thế 'http://###.###.###.###:80' với $ proxyAddr như bạn muốn. Phạm vi bạn chọn để lưu trữ điều này trong, là sự lựa chọn của bạn. Tôi đặt chúng vào hồ sơ $ của tôi, vì vậy tôi không bao giờ phải đặt các mục này trong tập lệnh của mình nữa.

Hy vọng điều này sẽ giúp ai đó!

0

Chỉ cần cập nhật URL bằng địa chỉ proxy của riêng bạn: cổng. Nó cho phép PowerShellGet đi qua proxy bằng cách sử dụng thông tin đăng nhập địa phương của bạn. Nếu bạn không có yêu cầu chứng chỉ, chỉ cần nhấp vào OK khi được nhắc nhập mật khẩu của bạn. Tôi đã đổi tên hộp đó thành "Đóng cửa sổ này". Bạn cũng có thể sử dụng các trình quản lý gói khác như Chocolatey/Nuget thông qua proxy vì tập lệnh này.

Các vấn đề liên quan