Skip to content

Instantly share code, notes, and snippets.

@rz6agx
Last active February 23, 2026 08:48
Show Gist options
  • Select an option

  • Save rz6agx/96029890596f7d17db34b1f510557ac3 to your computer and use it in GitHub Desktop.

Select an option

Save rz6agx/96029890596f7d17db34b1f510557ac3 to your computer and use it in GitHub Desktop.
Причина написания этого модуля - возможность поднять системный прокси-сервер в пространстве пользователя, не используя полномочия администратора

Запуск Xray-прокси в Windows 10/11

Основная причина написания этого модуля - возможность поднять системный прокси-сервер в пространстве пользователя, не используя полномочия администратора. Для автоматизации этого действия напишем скрипт в виде модуля, Powershell будет его подгружать автоматически. Для этого создаем папку по пути USERPROFILE\Documents\WindowsPowerShell\Modules\XrayTools и создаем там файл XrayTools.psm1:

# Укажите путь где лежит бинарник и конфигурационный файл xray
$Global:XrayPath       = "$env:USERPROFILE\Downloads\xray\xray.exe"
$Global:XrayConfig     = "$env:USERPROFILE\Downloads\xray\config.json"
$Global:ProxyAddress   = "127.0.0.1:1080"
# Используем маску 172.16/12 для покрытия всего диапазона 172.16.0.0 - 172.31.255.255
$Global:ProxyOverride  = "<local>;127.*;10.*;192.168.*;172.16/12;*.lan;*.local"

function Start-Xray {
    if (-not (Get-Process -Name xray -ErrorAction SilentlyContinue)) {

        if (-not (Test-Path $Global:XrayPath)) {
            throw "Файл не найден: $Global:XrayPath"
        }
        if (-not (Test-Path $Global:XrayConfig)) {
            throw "Файл не найден: $Global:XrayConfig"
        }

        Start-Process -FilePath $Global:XrayPath -ArgumentList "-config `"$Global:XrayConfig`"" -WindowStyle Hidden
        Start-Sleep -Seconds 2
        
        if (Get-Process -Name xray -ErrorAction SilentlyContinue) {
            Write-Output "Xray запущен: $Global:XrayPath"
        } else {
            throw "Не удалось запустить Xray"
        }
    }
    else {
        Write-Output "Xray уже запущен"
    }
}

function Stop-Xray {
    $proc = Get-Process -Name xray -ErrorAction SilentlyContinue
    if ($proc) {
        $proc | Stop-Process -Force
        Start-Sleep -Seconds 1
        Write-Output "Xray остановлен"
    }
    else {
        Write-Output "Xray не был запущен"
    }
}

function Update-ProxySettings {
    # Принудительное обновление настроек прокси
    Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public class WinINet {
    [DllImport("wininet.dll")]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
}
"@ -ErrorAction SilentlyContinue
    
    try {
        [WinINet]::InternetSetOption([IntPtr]::Zero, 39, [IntPtr]::Zero, 0) | Out-Null  # INTERNET_OPTION_SETTINGS_CHANGED
        [WinINet]::InternetSetOption([IntPtr]::Zero, 37, [IntPtr]::Zero, 0) | Out-Null  # INTERNET_OPTION_REFRESH
    } catch {
        Write-Warning "Не удалось обновить настройки прокси: $_"
    }
}

function Set-UserProxy {
    param(
        [string]$Server = "127.0.0.1:1080",
        [bool]$Enable = $true
    )
    
    $key = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
    
    if ($Enable) {
        Set-ItemProperty -Path $key -Name "ProxyEnable" -Value 1
        Set-ItemProperty -Path $key -Name "ProxyServer" -Value "socks=$Server"
        Set-ItemProperty -Path $key -Name "ProxyOverride" -Value $Global:ProxyOverride
        Update-ProxySettings
        Write-Output "Прокси включён: socks5://$Server"
    }
    else {
        Set-ItemProperty -Path $key -Name "ProxyEnable" -Value 0
        Update-ProxySettings
        Write-Output "Прокси отключён"
    }
}

function Enable-XrayProxy {
    Start-Xray
    Set-UserProxy -Server $Global:ProxyAddress -Enable $true
    Write-Output "SOCKS5 прокси включён: $Global:ProxyAddress"
}

function Disable-XrayProxy {
    Set-UserProxy -Enable $false
    Stop-Xray
    Write-Output "SOCKS5 прокси отключён"
}

function Get-XrayStatus {
    $xrayRunning = Get-Process -Name xray -ErrorAction SilentlyContinue

    $settings = Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" `
                                 -ErrorAction SilentlyContinue

    $userProxyEnabled = $false
    $proxyServer = ""

    if ($settings -and $settings.PSObject.Properties.Name -contains "ProxyEnable") {
        $userProxyEnabled = [bool]$settings.ProxyEnable
    }
    if ($settings -and $settings.PSObject.Properties.Name -contains "ProxyServer") {
        $proxyServer = $settings.ProxyServer
    }

    if ($xrayRunning) {
        Write-Output "Xray запущен"
        Write-Output "SOCKS5 прокси доступен на: $Global:ProxyAddress"
    } else {
        Write-Output "Xray не запущен"
    }
    
    if ($userProxyEnabled) {
        Write-Output "Системный прокси включён: $proxyServer"
    } else {
        Write-Output "Системный прокси отключён"
    }
}

# Создаём алиас для удобства
New-Alias -Name Status-XrayProxy -Value Get-XrayStatus -ErrorAction SilentlyContinue

# Экспортируем только нужные функции и алиасы
Export-ModuleMember -Function @(
    'Start-Xray',
    'Stop-Xray', 
    'Enable-XrayProxy',
    'Disable-XrayProxy',
    'Get-XrayStatus',
    'Set-UserProxy'
)

Export-ModuleMember -Alias @(
    'Status-XrayProxy'
)

Модуль вводит несколько функций для командной строки Powershell:

  • Enable-XrayProxy - запускает в фоне xray и включает системный прокси на выбранном в конфиге порте. Эта операция производится в пространстве пользователя и не требует административного доступа;
  • Disable-XrayProxy - отключит системный прокси и остановит xray;
  • Команды Start-Xray, Stop-Xray, Get-XrayStatus, Set-UserProxy в пояснениях не нуждаются.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment