Основная причина написания этого модуля - возможность поднять системный прокси-сервер в пространстве пользователя, не используя полномочия администратора. Для автоматизации этого действия напишем скрипт в виде модуля, 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 в пояснениях не нуждаются.