ММФБ: WinRM-доступ для ПК сотрудниц (юзер claude, без NetBird/RustDesk)

This commit is contained in:
2026-10-20 09:46:39 +00:00
parent 5599f59490
commit 44f2551e0a

85
mmfb-winrm.ps1 Normal file
View File

@@ -0,0 +1,85 @@
# Служебное подключение для удалённой поддержки (WinRM). Запуск: PowerShell от имени администратора.
# Идемпотентно — можно запускать повторно. Ничего не скачивает и не устанавливает.
$ErrorActionPreference = "Continue"
$U = "claude"
$PW = $env:KP
$SRC = "https://git.dttb.ru/oleg/scripts/raw/branch/main/mmfb-winrm.ps1"
$ALLOW = @("10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","100.70.0.0/16") # офисная сеть и служебная сеть, не интернет
# 32-битная консоль (Ассистент/AnyDesk) -> перезапуск в 64-бит, иначе нет New-LocalUser и реестр уезжает в WOW6432Node
if ($env:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
& "$env:WINDIR\SysNative\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "[Net.ServicePointManager]::SecurityProtocol='Tls12'; `$env:KP='$PW'; irm $SRC | iex"
return
}
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) { Write-Host "Нужен запуск PowerShell от имени администратора." -ForegroundColor Red; return }
if (-not $PW) {
$PW = -join ((48..57 + 65..90 + 97..122) | Get-Random -Count 14 | ForEach-Object { [char]$_ })
Write-Host "Пароль не задан — сгенерирован: $PW (передайте мастеру вместе с именем компьютера)" -ForegroundColor Yellow
}
$LOG = "$env:ProgramData\mmfb-support"; New-Item -ItemType Directory -Path $LOG -Force | Out-Null
function L($m) { "$((Get-Date).ToString('s')) $m" | Tee-Object -FilePath "$LOG\setup.log" -Append | Out-Null; Write-Host " $m" }
Write-Host "=== Служебное подключение: $env:COMPUTERNAME ===" -ForegroundColor Cyan
# 1) служебный пользователь (администратор, скрыт с экрана входа, пароль бессрочный)
L "[1] пользователь $U"
$sp = ConvertTo-SecureString $PW -AsPlainText -Force
if (-not (Get-LocalUser -Name $U -ErrorAction SilentlyContinue)) {
New-LocalUser -Name $U -Password $sp -PasswordNeverExpires -AccountNeverExpires -UserMayNotChangePassword -FullName "Remote Support" | Out-Null
} else {
Set-LocalUser -Name $U -Password $sp -PasswordNeverExpires $true -AccountNeverExpires -UserMayChangePassword $false
Enable-LocalUser -Name $U -ErrorAction SilentlyContinue
}
foreach ($sid in "S-1-5-32-544","S-1-5-32-555") { # Администраторы, Пользователи удалённого рабочего стола (имена на русской Windows не работают)
try { Add-LocalGroupMember -SID $sid -Member $U -ErrorAction Stop } catch { if ($_ -notmatch "already|уже") { L " группа $sid : $_" } }
}
$ul = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList"
if (-not (Test-Path $ul)) { New-Item $ul -Force | Out-Null }
New-ItemProperty $ul -Name $U -Value 0 -PropertyType DWord -Force | Out-Null
# 2) сетевой профиль Private (на Public quickconfig отказывает)
L "[2] сетевой профиль"
try { Get-NetConnectionProfile | Where-Object { $_.NetworkCategory -eq "Public" } | Set-NetConnectionProfile -NetworkCategory Private } catch {}
# 3) WinRM: сперва quickconfig, потом настройки (иначе служба ещё не запущена)
L "[3] WinRM"
Set-Service WinRM -StartupType Automatic -ErrorAction SilentlyContinue
try { Enable-PSRemoting -Force -SkipNetworkProfileCheck | Out-Null } catch { winrm quickconfig -force -q 2>&1 | Out-Null }
Start-Service WinRM -ErrorAction SilentlyContinue
Set-Item WSMan:\localhost\Service\Auth\Basic $true -Force
Set-Item WSMan:\localhost\Service\AllowUnencrypted $true -Force
Set-Item WSMan:\localhost\Service\MaxConcurrentOperationsPerUser 1500 -Force -ErrorAction SilentlyContinue
if (-not (Get-ChildItem WSMan:\localhost\Listener | Where-Object { $_.Keys -contains "Transport=HTTP" })) {
New-Item WSMan:\localhost\Listener -Transport HTTP -Address * -Force | Out-Null
}
# локальный админ по сети без UAC-фильтра, иначе 401
New-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name LocalAccountTokenFilterPolicy -Value 1 -PropertyType DWord -Force | Out-Null
# 4) брандмауэр: 5985 только из частных сетей
L "[4] брандмауэр"
Get-NetFirewallRule -DisplayName "Support-WinRM" -ErrorAction SilentlyContinue | Remove-NetFirewallRule
New-NetFirewallRule -DisplayName "Support-WinRM" -Direction Inbound -Protocol TCP -LocalPort 5985 -RemoteAddress $ALLOW -Action Allow -Profile Any | Out-Null
# 5) не засыпать от сети (иначе компьютер недоступен)
L "[5] сон от сети выключен"
powercfg /change standby-timeout-ac 0 2>&1 | Out-Null
powercfg /change hibernate-timeout-ac 0 2>&1 | Out-Null
# 6) самопроверка
L "[6] проверка"
$svc = (Get-Service WinRM).Status
$ips = (Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.IPAddress -notlike "127.*" -and $_.IPAddress -notlike "169.254.*" } | ForEach-Object { $_.IPAddress }) -join ", "
$ok = $false
try {
$cred = New-Object PSCredential($U, $sp)
$r = Invoke-Command -ComputerName localhost -Credential $cred -Authentication Negotiate -ScriptBlock { $env:COMPUTERNAME } -ErrorAction Stop
$ok = ($r -eq $env:COMPUTERNAME)
} catch { L " самопроверка: $_" }
$summary = "Компьютер: $env:COMPUTERNAME`nIP: $ips`nПользователь: $env:USERNAME`nWinRM: $svc, вход $U : $(if($ok){'OK'}else{'ОШИБКА'})"
$summary | Set-Content "$LOG\summary.txt" -Encoding UTF8
try { Set-Clipboard -Value $summary } catch {}
Write-Host ""
Write-Host $summary -ForegroundColor $(if ($ok) { "Green" } else { "Yellow" })
Write-Host ""
Write-Host "Готово. Отправьте мастеру эти строки (они уже скопированы, просто вставьте в чат)." -ForegroundColor Cyan