---
title: "PowerShell Proxy Ayarları: Invoke-WebRequest ile Proxy"
description: "Invoke-WebRequest'e -Proxy ve -ProxyCredential ekleyin ya da ikisini $PSDefaultParameterValues ile bir kez tanımlayın. 5.1 ile 7 farkı, 407 hatası ve SOCKS5."
url: https://proxynet.io/tr/blog/powershell-proxy
date: 2026-11-07
author: "Acar Diveroli"
category: "Nasıl Yapılır, Entegrasyon"
lang: tr
---

# PowerShell Proxy Ayarları: Invoke-WebRequest ile Proxy

Bilgisayarınızda sorunsuz çalışan bir betik sunucuya taşındı ya da artık bir fiyat listesini başka bir ülkeden bakan ziyaretçi gibi okuması gerekiyor; her `Invoke-WebRequest` çağrısı bir proxy üzerinden çıkmak zorunda. PowerShell'in bunun için parametreleri var. Yalnız bu parametreler Windows PowerShell 5.1 ile PowerShell 7'de farklı davranır ve en yaygın kestirme, `user:pass@` bölümünü proxy adresinin içine yazmak, 5.1'de nedenini söylemeden 407 ile sonuçlanır.

Bu yazıda `-Proxy` ve `-ProxyCredential` parametrelerini, istem açmadan kimlik bilgisi oluşturmayı, proxy'yi her çağrı için bir kez tanımlamayı, ortam değişkenlerini ve Windows sistem proxy'sini, SOCKS5'i, yeniden deneme yapan bir indirme betiğini ve hata mesajlarının birebir metnini ele alıyoruz. 5.1 ile ilgili her kod parçasını Windows PowerShell 5.1 (derleme 26100) üzerinde, kullanıcı adı ve parola isteyen yerel bir proxy'ye karşı çalıştırdık. PowerShell 7 test makinesinde kurulu olmadığı için onun davranışı Microsoft belgelerinden alındı ve öyle işaretlendi.

> **Not: Kısa cevap**
>
> `Invoke-WebRequest` ya da `Invoke-RestMethod` komutuna `-Proxy "http://pr.proxynet.io:8000"` ve `-ProxyCredential $cred` ekleyin; `$cred`, proxy kullanıcı adı ve parolasından oluşturulmuş bir `PSCredential` nesnesidir. Proxy'nin oturumdaki her çağrıda kullanılmasını istiyorsanız aynı iki değeri `$PSDefaultParameterValues` içine yazın. Windows PowerShell 5.1 `HTTP_PROXY` ve `HTTPS_PROXY` değişkenlerini okumaz, proxy adresindeki `user:pass@` bölümünü yok sayar ve SOCKS5 konuşamaz; PowerShell 7 değişkenleri okur, 7.2'den itibaren `socks5://` adresini de kabul eder.

## Windows PowerShell 5.1 mi, PowerShell 7 mi: fark neden önemli?

İki sürüm web isteklerini farklı HTTP katmanlarıyla gönderir; bu yüzden aynı proxy ayarı birinde çalışırken öbüründe yok sayılabilir. Windows PowerShell 5.1 Windows ile birlikte gelir ve .NET Framework'ün `HttpWebRequest` sınıfını kullanır; PowerShell 7 ayrıca indirilir ve `HttpClient` kullanır. Bir betiğin hangisinde çalıştığını `$PSVersionTable.PSVersion` söyler.

| Davranış | Windows PowerShell 5.1 | PowerShell 7.x |
|---|---|---|
| `-Proxy`, `-ProxyCredential` | Var | Var |
| `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` | Yok sayılır | 7.0'dan beri okunur |
| Proxy verilmediğinde | Kullanıcının Internet Seçenekleri | Önce değişkenler, sonra kullanıcı ayarı |
| `-NoProxy` anahtarı | Yok | 6.0'dan beri |
| SOCKS5 adresi | Yok | 7.2 ve sonrası |
| `curl` ve `wget` takma adları | `Invoke-WebRequest`'i gösterir | Kaldırıldı |
| Yerleşik yeniden deneme | Yok | `-MaximumRetryCount` |

5.1 sütunu bizim gözlemlerimizdir; 7.x sütunu [PowerShell 7.5 için Invoke-WebRequest başvurusuna](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.5) dayanır.

## Invoke-WebRequest isteği proxy üzerinden nasıl gönderir?

1. **PowerShell hedefin değil, proxy'nin host adını çözer** ve proxy portuna bir TCP bağlantısı açar.
2. **`http://` hedefte URL'nin tamamını proxy'ye gönderir** (`GET http://httpbin.org/ip HTTP/1.1`). Sayfayı proxy getirir ve size iletir; isteği okuyabilir.
3. **`https://` hedefte `CONNECT httpbin.org:443` gönderir.** Proxy `200 Connection Established` ile cevap verdikten sonra siteyle TLS el sıkışması bu tünelin içinde yapılır; proxy yalnız host adını ve portu görür.
4. **Kimlik bilgisi ancak meydan okumadan sonra gider.** İlk deneme `Proxy-Authorization` başlığı taşımaz, proxy `Proxy-Authenticate: Basic` ile `407` döner, .NET isteği başlıkla yineler. [407 durum kodu](https://www.rfc-editor.org/rfc/rfc9110.html#section-15.5.8) ve meydan okuma RFC 9110'da tanımlıdır; 5.1 ön kimlik doğrulama yapmadığı için test proxy'miz her başarılı çağrıyı şu ikili olarak kaydetti:

```text
11:02:56 407 GET http://httpbin.org/ip (no Proxy-Authorization)
11:02:56 GET http://httpbin.org/ip user=user
```

5. **Hedef, proxy'nin çıkış IP'sine cevap verir.** Komut `StatusCode`, `Headers` ve `Content` özellikleri olan bir nesne döndürür; 5.1'de 2xx dışındaki bir durum kodu nesne yerine sonlandırıcı hata olur.

## Invoke-WebRequest ile proxy nasıl kullanılır?

Önce bir kimlik bilgisi nesnesi oluşturun, sonra proxy adresini ve nesneyi komuta verin:

```powershell
$pass = ConvertTo-SecureString "pass" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("user", $pass)

$r = Invoke-WebRequest -UseBasicParsing -Uri "https://httpbin.org/ip" `
    -Proxy "http://pr.proxynet.io:8000" -ProxyCredential $cred
$r | Select-Object StatusCode, StatusDescription | Format-List
$r.Content
```

```text
StatusCode        : 200
StatusDescription : OK

{
  "origin": "203.0.113.42"
}
```

httpbin.org/ip isteğin geldiği adresi döndürür; proxy çalışıyorsa orada sizin değil proxy'nin çıkış IP'si görünür. `-Proxy` değeri bir URI'dir ve hedef HTTPS olsa bile `http://` şemasıyla yazılır: şema proxy ile kurulan bağlantıyı anlatır, sayfanın kendisi CONNECT tünelinin içinde şifreli kalır. İki parametre de [Windows PowerShell 5.1 için Invoke-WebRequest sayfasında](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-5.1) belgelenmiştir; sayfanın Türkçe sürümü aynı adreste `tr-tr` ile açılır.

**5.1'de `-UseBasicParsing` anahtarını her zaman ekleyin.** Anahtar olmadan komut HTML'i Internet Explorer motoruyla ayrıştırır ve Microsoft'un Aralık 2025'teki CVE-2025-54100 güvenlik güncelleştirmesinden beri önce onay ister; zamanlanmış bir betikte bu soruyu cevaplayacak kimse yoktur. Bizim çalıştırmamızda anahtarsız çağrı `Nesne başvurusu bir nesnenin örneğine ayarlanmadı.` hatasıyla düştü. PowerShell 7 yalnız temel ayrıştırma yapar ve anahtarı yok sayar.

`Invoke-RestMethod` aynı proxy parametrelerini alır; yanıt nesnesi yerine ayrıştırılmış JSON döndürür:

```powershell
$ip = Invoke-RestMethod -Uri "https://api.ipify.org?format=json" `
    -Proxy "http://pr.proxynet.io:8000" -ProxyCredential $cred
$ip.ip
```

Proxynet'in residential ve mobil ürünlerinde ülke, şehir ve oturum bilgisini panelin Endpoint Oluşturucu'sunda seçtiğiniz kullanıcı adı taşır; hangi çıkışı seçerseniz seçin komut aynı kalır.

## Proxy kimlik bilgileri nasıl verilir?

Proxy parolası adresin içinde değil, bir `PSCredential` nesnesinde taşınır. `Get-Credential` bunu etkileşimli bir istemle sorar; betikte ise yukarıdaki gibi güvenli dizeden oluşturulur. Microsoft'un `ConvertTo-SecureString` sayfası komut satırına yazılan düz metin parolanın olay günlüklerine ve komut geçmişine düştüğü konusunda uyarıyor; parolayı betiğe yazmak yerine bir ortam değişkeninden ya da gizli anahtar deposundan okuyun:

```powershell
$pass = ConvertTo-SecureString $env:PROXY_PASS -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($env:PROXY_USER, $pass)
```

Testlerimizden üç ayrıntı:

- **`-Proxy` içindeki `user:pass@` 5.1'de yok sayılır.** `-ProxyCredential` olmadan `-Proxy "http://user:pass@pr.proxynet.io:8000"` yazmak `(407) Proxy Kimlik Doğrulaması Gerekli` ile bitti; proxy günlüğüne hiç kimlik bilgisi ulaşmadı.
- **Özel karakterler kodlama gerektirmez.** `p@ss:w#rd` biçimindeki bir parola `PSCredential` üzerinden olduğu gibi geçti; URL biçiminde `%40`, `%3A` ve `%23` gerekirdi.
- **Web oturumu proxy'yi hatırlar.** `-Proxy ... -SessionVariable s` ile yapılan ilk çağrıdan sonra yalnız `-WebSession $s` ile yapılan ikinci çağrı yine proxy'den geçti; oturum nesnesi proxy'yi çerezlerin yanında saklar.

`-ProxyUseDefaultCredentials` ise `PSCredential` yerine oturum açmış Windows kullanıcısının hesabını gönderir; etki alanına göre kimlik doğrulayan şirket proxy'leri içindir ve belgeye göre `-ProxyCredential` ile birlikte kullanılamaz. Bu parametreyi test edemedik; proxy'miz yalnız Basic konuşuyor.

Makinenin IP adresini proxy panelinde yetkilendirdiğinizde parola tamamen ortadan kalkar: `-Proxy "http://pr.proxynet.io:8000"` ayarın tamamı olur. Proxynet en fazla 10 IP'lik bir whitelist kabul eder; sabit adresli bir sunucuda çalışan zamanlanmış işler için uygun yoldur.

## Proxy her komut için nasıl tanımlanır?

`$PSDefaultParameterValues`, `Komut:Parametre` anahtarlarından oluşan bir hash tablosudur; parametreyi siz vermediğinizde PowerShell buradaki değeri uygular. Komut başına iki girdi yeter:

```powershell
$PSDefaultParameterValues["Invoke-WebRequest:Proxy"] = "http://pr.proxynet.io:8000"
$PSDefaultParameterValues["Invoke-WebRequest:ProxyCredential"] = $cred
$PSDefaultParameterValues["Invoke-RestMethod:Proxy"] = "http://pr.proxynet.io:8000"
$PSDefaultParameterValues["Invoke-RestMethod:ProxyCredential"] = $cred

Invoke-RestMethod -Uri "https://api.ipify.org?format=json"   # proxy uzerinden gider
```

Anahtarlar joker karakter kabul eder; `"Invoke-*:Proxy"` iki komutu tek satırda kapsar ve iki biçim de testimizde çalıştı. Tablo her yeni oturumda boştur; satırları `$PROFILE` dosyasına koymadıkça kalıcı olmaz. Başka bir hesapla çalışan betik sizin profilinizi hiç görmez, bu yüzden başkasına vereceğiniz betikte parametreleri açıkça yazın.

Tek bir çağrıyı doğrudan göndermek için `-Proxy $null` yazmak, tabloda bir `ProxyCredential` varsayılanı durduğu sürece `The cmdlet cannot run because the following parameter is missing: Proxy` hatası verir. Onun yerine tabloyu bir anlığına kapatın: `$PSDefaultParameterValues["Disabled"] = $true` yazın, çağrıyı yapın, değeri `$false` yapın. Testimizde `Disabled` açıkken yapılan çağrı doğrudan gitti, bir sonraki yine proxy'den geçti.

## PowerShell HTTP_PROXY ve HTTPS_PROXY değişkenlerini okur mu?

Windows PowerShell 5.1 okumaz. `$env:HTTP_PROXY` ve `$env:HTTPS_PROXY` tanımlıyken `-Proxy` vermeden yaptığımız istek doğrudan hedefe gitti; proxy isteği hiç görmedi. Aynı makinede `curl.exe`, `git` ve `pip` bu değişkenlere uyar; karışıklık buradan doğar.

PowerShell 7 ise belgesine göre okur: 7.0'dan beri komutlar varsayılan proxy'yi .NET'in `HttpClient.DefaultProxy` özelliğinden alır; bu özellik Windows'ta önce `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` ve istisna listesi `NO_PROXY` değişkenlerine bakar, değişkenler boşsa kullanıcının proxy ayarına döner.

```powershell
# Yalniz PowerShell 7; 5.1 bunlari yok sayar
$env:HTTPS_PROXY = "http://pr.proxynet.io:8000"
$env:NO_PROXY = "localhost,127.0.0.1,.sirketici.example"
Invoke-WebRequest -Uri "https://httpbin.org/ip"            # proxy uzerinden
Invoke-WebRequest -Uri "https://httpbin.org/ip" -NoProxy   # yalniz bu cagri dogrudan
```

Kimlik bilgileri yine `-ProxyCredential` ile verilir; çağrı başına ya da `$PSDefaultParameterValues` üzerinden, 5.1'deki gibi.

## Windows sistem proxy'si ve netsh winhttp ne olur?

`-Proxy` verilmediğinde 5.1 oturum açmış kullanıcının Internet Seçenekleri'ndeki proxy'ye döner; bu, Windows'un Ayarlar, Ağ ve İnternet, Proxy bölümünde gösterdiği ayardır. .NET Framework belgesi `WebRequest.DefaultWebProxy` özelliğinin önce uygulama yapılandırma dosyasını, o yoksa kullanıcının Internet Seçenekleri proxy'sini okuduğunu söyler. Birden beklenmedik bir proxy'den çıkan betik genellikle bu ayarı izliyordur; ayarın yerini [Windows ve Chrome proxy ayarları](/tr/blog/windows-chrome-proxy-settings) yazısında gösteriyoruz.

Windows, servislerin ve sistem bileşenlerinin kullandığı HTTP kütüphanesi WinHTTP için ikinci ve ayrı bir proxy kaydı tutar. Bu kayıt `netsh winhttp` ile yönetilir ve .NET kullanan PowerShell komutlarını etkilemez. Aşağıdaki komutlar Microsoft'un netsh başvurusundan alındı; makine genelinde bir ayarı değiştirdikleri için burada çalıştırılmadı:

```text
netsh winhttp show proxy
netsh winhttp set proxy proxy-server="pr.proxynet.io:8000" bypass-list="*.sirketici.example"
netsh winhttp import proxy source=ie
netsh winhttp reset proxy
```

`set proxy` yalnız bir sunucu ve noktalı virgülle ayrılmış bir istisna listesi alır; kullanıcı adı ve parola isteyen bir proxy'yi betik içinde `-ProxyCredential` ile tanımlamak ya da IP whitelist ile parolasız hâle getirmek daha sağlıklıdır.

## Betikte .NET sınıflarıyla proxy nasıl kullanılır?

`System.Net.WebClient` ya da `HttpWebRequest` sınıflarını doğrudan çağıran betikler `-Proxy` parametresini görmez; süreç genelindeki `WebRequest.DefaultWebProxy` değerini okurlar. Bu değeri bir kez ayarladığınızda o sınıflar ve 5.1'de kendi `-Proxy` değeri olmayan her `Invoke-WebRequest` çağrısı proxy'den geçer:

```powershell
$proxy = New-Object System.Net.WebProxy("http://pr.proxynet.io:8000")
$proxy.Credentials = New-Object System.Net.NetworkCredential("user", "pass")
$proxy.BypassList = @("^http://intranet\.example\.")
[System.Net.WebRequest]::DefaultWebProxy = $proxy

(New-Object System.Net.WebClient).DownloadString("https://api.ipify.org")
```

Ayar yalnız o PowerShell sürecinde yaşar. `BypassList` tam URL ile eşleştirilen düzenli ifadeler tutar; testimizde intranet deseni proxy dışında kaldı, genel adres ise proxy'den geçti.

`WebProxy` sınıfının bir kuralı bize bir saat kaybettirdi: **`localhost` ya da `127.0.0.1` adresine giden istekler hiçbir zaman proxy kullanmaz.** `BypassProxyOnLocal` değeri `False` iken bile `IsBypassed` ikisi için de `True` döndü; yerel bir web sunucusuna karşı yaptığımız her deneme doğrudan gitti ve proxy çalışıyormuş gibi göründü. Testi genel bir adrese karşı yapın ya da yerel sunucuya içinde nokta bulunan bir host adı verin.

## Invoke-WebRequest SOCKS5 destekler mi?

Windows PowerShell 5.1'de desteklemez. `-Proxy "socks5://pr.proxynet.io:1080"` yazmak `ServicePointManager, socks5 düzeninde proxy'leri desteklemiyor.` hatasıyla durur; `https://` şemalı proxy adresi de aynı hatayı verir, yani 5.1 proxy ile yalnız düz HTTP konuşur.

PowerShell 7.2 ve sonrası .NET 6 ya da daha yeni sürüm üzerinde çalışır; Microsoft'un [.NET 6 ağ iyileştirmeleri duyurusu](https://devblogs.microsoft.com/dotnet/dotnet-6-networking-improvements/) `HttpClient` için `socks5://` adresiyle SOCKS4, SOCKS4a ve SOCKS5 desteğini belgeler. Komutun kendi başvuru sayfası SOCKS'tan söz etmez ve biz 7'yi burada çalıştıramadık; `-Proxy "socks5://pr.proxynet.io:1080"` yazımını kendi sürümünüzde doğrulamanız gereken bir seçenek olarak alın.

5.1'de pratik yol Windows 10 ve 11 ile gelen gerçek cURL'dür: `curl.exe -x "socks5h://user:pass@pr.proxynet.io:1080" https://httpbin.org/ip`; `socks5h` host adını proxy'nin çözmesini sağlar. Seçenekleri [cURL ile proxy kullanımı](/tr/blog/curl-proxy) yazısında anlattık; 1080 yerine endpoint oluşturucunun gösterdiği SOCKS5 portunu yazın.

## Örnek: URL listesini proxy üzerinden yeniden denemeyle indirmek

Bu betik bir URL listesini proxy üzerinden indirir, geçici hataları artan bekleme süresiyle yeniden dener, 407'de hemen durur ve her URL için bir satır yazar. Yalnız Windows PowerShell 5.1 yeterlidir:

```powershell
# fetch.ps1: listedeki her URL proxy uzerinden, yeniden denemeyle
$ErrorActionPreference = "Stop"
$ProxyUri = "http://pr.proxynet.io:8000"
$ProxyCred = New-Object System.Management.Automation.PSCredential (
    "user", (ConvertTo-SecureString "pass" -AsPlainText -Force))

$urls = @(
    "https://httpbin.org/ip",
    "https://httpbin.org/status/503",
    "https://httpbin.org/status/404",
    "https://httpbin.org/headers"
)
$retryCodes = 408, 429, 500, 502, 503, 504

function Get-WithRetry {
    param([string]$Url, [int]$Attempts = 4)
    for ($i = 1; $i -le $Attempts; $i++) {
        $sw = [System.Diagnostics.Stopwatch]::StartNew()
        try {
            $r = Invoke-WebRequest -UseBasicParsing -Uri $Url -Proxy $ProxyUri -ProxyCredential $ProxyCred -TimeoutSec 30
            return [pscustomobject]@{ Url = $Url; Status = $r.StatusCode; Attempts = $i; Ms = $sw.ElapsedMilliseconds; Bytes = $r.RawContentLength }
        } catch [System.Net.WebException] {
            $code = 0
            if ($_.Exception.Response) { $code = [int]$_.Exception.Response.StatusCode }
            if ($code -eq 407) { throw "Proxy kimlik bilgisini reddetti (407). user:pass ya da IP whitelist'i kontrol edin." }
            if (($code -in $retryCodes -or $code -eq 0) -and $i -lt $Attempts) {
                $wait = [math]::Pow(2, $i - 1)   # 1, 2, 4 saniye
                Write-Warning "$Url -> $code ($($_.Exception.Status)); retry $i in $wait s"
                Start-Sleep -Seconds $wait
                continue
            }
            return [pscustomobject]@{ Url = $Url; Status = $code; Attempts = $i; Ms = $sw.ElapsedMilliseconds; Bytes = 0 }
        }
    }
}

$results = foreach ($u in $urls) { Get-WithRetry -Url $u }
$results | Format-Table -AutoSize
```

Çalıştırmamızda `/status/503` adresi iki kez 503 döndü, 1 ve 2 saniye sonra yeniden denendi ve test sunucusu toparlandığı için üçüncü denemede başarılı oldu; 404 yeniden denenmeden geri geldi:

```text
WARNING: https://httpbin.org/status/503 -> 503 (ProtocolError); retry 1 in 1 s
WARNING: https://httpbin.org/status/503 -> 503 (ProtocolError); retry 2 in 2 s

Url                            Status Attempts Ms Bytes
---                            ------ -------- -- -----
https://httpbin.org/ip            200        1 34    55
https://httpbin.org/status/503    200        3 11    65
https://httpbin.org/status/404    404        1  3     0
https://httpbin.org/headers       200        1 10   250
```

Üç tercih önemlidir. 5.1 başarısız isteğin durum kodunu yalnız `$_.Exception.Response.StatusCode` içinde verir, çünkü 4xx ya da 5xx cevap döndürülmez, hata olarak fırlatılır. `$code` değerinin `0` olması hiç cevap gelmediği, örneğin zaman aşımı olduğu anlamına gelir ve o da yeniden denenir. `-TimeoutSec 30` tek denemeyi sınırlar; varsayılan 0 sonsuza kadar bekler. PowerShell 7'de `-MaximumRetryCount 3 -RetryIntervalSec 2` yerleşiktir; belgesine göre `Retry-After` taşıyan bir 429 cevabı bu aralığı geçersiz kılar.

Her `Invoke-WebRequest` proxy'ye kendi bağlantısını açar; rotating gateway bu yüzden her çağrıya farklı bir çıkış IP'si verir. Girişin ardından birkaç sayfa gezen bir akış tersini ister: kullanıcı adındaki sticky oturum [Residential Proxy](https://proxynet.io/tr/residential-proxy) üzerinde aynı IP'yi 1-60 dakika korur, `-SessionVariable` ise çerezleri sizin tarafınızda tutar.

## PowerShell proxy betikleri nerelerde kullanılır?

Zamanlanmış görevler en sık karşılaşılan yerdir: gece çalışan bir iş kendi ürün listenizin fiyatını ve stok durumunu başka bir ülkedeki alıcının gördüğü hâliyle denetler; bir izleme betiği sitenizi birkaç bölgeden ister ve yanlış para birimi ya da dil gördüğünde uyarı verir; şirket proxy'sinin arkasındaki bir derleme sunucusu modülleri onun üzerinden kurar. Tek bir adrese izin veren bir iş ortağı API'sine, çıkışı hiç değişmeyen bir işten ulaşılır; [ISP Proxy](https://proxynet.io/tr/static-isp-residential-proxy) o işe yeniden başlatmalara dayanan adanmış bir IP verir.

## Sık görülen PowerShell proxy hataları ve çözümleri

Mesajlar Türkçe Windows'ta Windows PowerShell 5.1'in bastığı hâliyle; .NET'ten gelen bölüm Türkçe, PowerShell'in kendi mesajları bizim makinede İngilizce çıktı.

- **`Uzak sunucu hata döndürdü: (407) Proxy Kimlik Doğrulaması Gerekli.`** `-ProxyCredential` verilmemiş, kimlik bilgisi adresin içine yazılmış, parola yanlış ya da IP adresi whitelist'te yok. `catch` bloğunda `$_.Exception.Response.StatusCode.value__` değeri `407` verir; nedenleri [HTTP 407 Proxy Authentication Required hatası](/tr/blog/http-407-proxy-authentication-required) yazısında topladık.
- **`Uzak sunucuya bağlanılamıyor`** ve `Status : ConnectFailure`. Proxy portu yanlış, arada bir güvenlik duvarı var ya da proxy kapalı.
- **`Proxy adı çözülemedi: 'pr.proxynet.io'`**. Host adında yazım hatası var ya da DNS yok; mesaj hedefi değil proxy'yi adlandırır.
- **`The operation has timed out.`** `-TimeoutSec` proxy ile hedefin ihtiyacından kısa; 5 saniyede cevap veren bir sayfaya koyduğumuz 2 saniyelik sınır bu mesajı üretti. Metin Türkçe sistemde de İngilizce basıldı.
- **`ServicePointManager, socks5 düzeninde proxy'leri desteklemiyor.`** 5.1'de `socks5://` ya da `https://` şemalı proxy adresi; `http://`, PowerShell 7.2+ ya da `curl.exe` kullanın.
- **`A parameter cannot be found that matches parameter name 'x'.`** 5.1'de yazılmış bir cURL komutu; `curl` orada `Invoke-WebRequest`'in takma adıdır, `curl.exe` yazın.
- **`Nesne başvurusu bir nesnenin örneğine ayarlanmadı.`** Betikte `-UseBasicParsing` olmadan yapılan 5.1 çağrısı.
- **`The cmdlet cannot run because the following parameter is missing: Proxy.`** `$PSDefaultParameterValues` hâlâ bir `ProxyCredential` tutarken `-Proxy $null` yazılmış; onun yerine `Disabled` anahtarını kullanın.
- **Proxy sessizce atlanıyor.** Hedef `localhost` ya da `127.0.0.1`, ya da betik 5.1'de `HTTPS_PROXY` değişkenine güveniyor. `api.ipify.org` sonucunu `-Proxy` ile ve `-Proxy` olmadan karşılaştırın.

## Karar rehberi

| İhtiyaç | Öneri |
|---|---|
| Tek komutu proxy'den geçirmek | `-Proxy` ve `-ProxyCredential` |
| Oturumdaki her komut | `$PROFILE` içinde `$PSDefaultParameterValues` |
| Betikte parola olmasın | Panelde IP whitelist, yalnız `-Proxy` |
| Windows oturumuyla doğrulayan şirket proxy'si | `-ProxyUseDefaultCredentials` |
| Tek çağrı proxy'siz | `-NoProxy` (7) ya da `Disabled` anahtarı (5.1) |
| SOCKS5 | PowerShell 7.2+ ya da `socks5h://` ile `curl.exe` |
| `WebClient` ya da `HttpWebRequest` kodu | `[System.Net.WebRequest]::DefaultWebProxy` |
| Giriş akışı boyunca aynı çıkış IP'si | Kullanıcı adında sticky oturum |
| Servisler ve Windows Update | `netsh winhttp set proxy` |

## Sıkça sorulan sorular

### Invoke-WebRequest için proxy nasıl ayarlanır?

Komuta `-Proxy "http://host:port"` ekleyin; proxy parola istiyorsa yanına bir `PSCredential` nesnesiyle `-ProxyCredential` koyun. Aynı iki parametre `Invoke-RestMethod` komutunda ve PowerShellGet 2.x belgesine göre `Install-Module` komutunda da vardır.

### Invoke-WebRequest neden 407 Proxy Authentication Required döndürür?

Çünkü proxy'ye kullanılabilir bir kimlik bilgisi ulaşmamıştır. 5.1'de bu, kullanıcı adı ve parola `-ProxyCredential` yerine adresin içine yazıldığında, parola yanlış olduğunda ya da proxy IP'nizi whitelist'te beklerken makinenin adresi değiştiğinde olur.

### Invoke-WebRequest Windows proxy ayarlarını kullanır mı?

Evet, `-Proxy` vermediğinizde. Windows PowerShell 5.1 oturum açmış kullanıcının Internet Seçenekleri proxy'sini alır; PowerShell 7 önce `HTTP_PROXY` ve `HTTPS_PROXY` değişkenlerini okur, sonra kullanıcı ayarına döner. `netsh winhttp` ile tanımlanan WinHTTP proxy'si ayrı bir kayıttır ve ikisi tarafından da okunmaz.

### PowerShell'de tek bir istek için proxy nasıl atlanır?

PowerShell 7'de o çağrıya `-NoProxy` ekleyin. 5.1'de `-Proxy` yazmayın; `$PSDefaultParameterValues` yine ekliyorsa çağrının çevresinde `$PSDefaultParameterValues["Disabled"] = $true` kullanın. Belirli host'ların tamamı için 7'de `NO_PROXY`, 5.1'de bir `WebProxy` nesnesinin `BypassList` özelliği kullanılır.

### Invoke-WebRequest ile SOCKS5 proxy kullanılabilir mi?

Windows PowerShell 5.1'de kullanılamaz; `socks5://` şemasını reddeder. PowerShell 7.2 ve sonrası `HttpClient` içinde SOCKS5 proxy'yi destekleyen .NET 6+ üzerinde çalışır; kendi sürümünüzde doğrulayın. 5.1'de onun yerine `socks5h://` ile `curl.exe` çağırın.

### PowerShell'in proxy'yi gerçekten kullandığı nasıl anlaşılır?

`https://api.ipify.org` adresini bir kez `-Proxy` olmadan, bir kez `-Proxy` ile isteyin: iki farklı adres görüyorsanız ve ikincisi proxy'nin ülkesindeyse proxy kullanılıyordur. Aynı adres iki kez çıkıyorsa çağrı doğrudan gitmiştir; en sık nedeni hedefin `localhost` olması ya da 5.1'in tanımladığınız değişkenleri yok saymasıdır.

## Özet

Proxy'yi `Invoke-WebRequest` ve `Invoke-RestMethod` komutlarına `-Proxy` ve `-ProxyCredential` içindeki bir `PSCredential` ile verin, adresin içine değil; her çağrı proxy'den geçecekse ikisini `$PSDefaultParameterValues` ile bir kez tanımlayın. Windows PowerShell 5.1 `HTTP_PROXY` değişkenini yok sayar, Internet Seçenekleri'ne döner, loopback adreslerini proxy dışında bırakır ve SOCKS5 konuşamaz; PowerShell 7 değişkenleri okur, `-NoProxy` ve yeniden deneme ekler, 7.2'den itibaren SOCKS5 kabul eder. Her 5.1 betiğinde `-UseBasicParsing` ve `-TimeoutSec` bulunsun ve testi genel bir adrese karşı yapın. Tam olarak bu parametrelerle çalışan uç noktalar [Proxynet proxy sayfasında](/tr/proxy).
