Автоприменение Private профиля скриптом при загрузке (Task Scheduler, PowerShell)

Private-профиль сети в Windows — это режим сетевой изоляции, при котором устройство считается доверенным в локальной сети; автоматически включаются правила брандмауэра для обмена файлами, обнаружения устройств и мультимедиа. Автоприменение Private-профиля при загрузке — это запуск PowerShell-скрипта через Планировщик заданий (Task Scheduler), который переводит активные сетевые подключения из Public в Private сразу после старта системы.

Когда это нужно 👩‍💻🔌

Автоприменение Private полезно, когда после перезагрузки Windows случайно получает профиль Public (жёсткие правила брандмауэра), ломая доступ к общим папкам, принтерам, RDP или службам автоматизации. Скрипт устраняет «дрожание» профиля и гарантирует приватный режим на доверенных сетях, включая Wi‑Fi и Ethernet.

Ключевые команды PowerShell и их назначение

Команда Назначение Пример Заметки
Get-NetConnectionProfile Получить текущий профиль сети Get-NetConnectionProfile Показывает Category: Public/Private/DomainAuthenticated
Set-NetConnectionProfile Сменить профиль интерфейса Set-NetConnectionProfile -InterfaceIndex 12 -NetworkCategory Private Требуются права администратора
Get-NetAdapter Статус и идентификация адаптеров Get-NetAdapter | ? Status -eq 'Up' Нужен для ожидания поднятия сети
Set-NetFirewallRule Включение правил для Private Set-NetFirewallRule -Group "FileAndPrinterSharing" -Profile Private -Enabled True Группы могут отличаться в локализованных системах
Register-ScheduledTask Создание задания автозапуска Register-ScheduledTask -TaskName NetProfile_AutoPrivate ... Надёжнее, чем ручной запуск
schtasks.exe Альтернатива для триггера по событию schtasks /Create /SC ONEVENT /EC ... Удобно для реакций на смену сети
Start-Sleep Задержка до готовности сети Start-Sleep -Seconds 15 Делайте паузу, чтобы дождаться инициализации

Минимальные требования ✅

  • Права локального администратора.
  • PowerShell 5.1+ (Windows 10/11) или PowerShell 7.x.
  • Разрешено выполнение скриптов (или разовая передача ExecutionPolicy в командной строке).
  • Доступ к Планировщику заданий.

Базовый скрипт: сделать все недоменные сети Private

Сохраните файл, например: C:ScriptsSet-NetworkPrivate.ps1

# C:ScriptsSet-NetworkPrivate.ps1
# Делает Private все активные недоменные профили и включает базовые правила для обмена
$ErrorActionPreference = 'Stop'

# Ждём готовности сети (до ~60 сек)
$attempts = 30
while ($attempts -gt 0 -and (Get-NetAdapter | Where-Object Status -eq 'Up').Count -eq 0) {
    Start-Sleep -Seconds 2
    $attempts--
}

# Переключаем профиль
Get-NetConnectionProfile | ForEach-Object {
    if ($_.NetworkCategory -ne 'DomainAuthenticated' -and $_.NetworkCategory -ne 'Private') {
        try {
            Set-NetConnectionProfile -InterfaceIndex $_.InterfaceIndex -NetworkCategory Private
            Write-Host "Set Private for '$($_.Name)' (Index=$($_.InterfaceIndex))"
        } catch {
            Write-Warning "Failed for '$($_.Name)': $_"
        }
    }
}

# Включаем часто нужные правила брандмауэра для профиля Private
# В англоязычных системах используйте группы: 'FileAndPrinterSharing','NetworkDiscovery','RemoteDesktop'
$ruleGroups = @('FileAndPrinterSharing','NetworkDiscovery','RemoteDesktop')
foreach ($g in $ruleGroups) {
    try {
        Set-NetFirewallRule -Group $g -Profile Private -Enabled True -ErrorAction SilentlyContinue
    } catch { }
}

Надёжный вариант для конкретных интерфейсов

Если нужно управлять только известными интерфейсами (например, Ethernet и корпоративный Wi‑Fi), используйте привязку по имени или InterfaceAlias/InterfaceGuid. Это исключит влияние временных или VPN-адаптеров.

# Ограничиваемся адаптерами по маске имени
$targets = Get-NetAdapter | Where-Object { $_.Status -eq 'Up' -and ($_.Name -match 'Ethernet|Wi-Fi') }
foreach ($a in $targets) {
    $p = Get-NetConnectionProfile | Where-Object InterfaceIndex -eq $a.InterfaceIndex
    if ($p.NetworkCategory -ne 'Private' -and $p.NetworkCategory -ne 'DomainAuthenticated') {
        Set-NetConnectionProfile -InterfaceIndex $a.InterfaceIndex -NetworkCategory Private
        Write-Host "Private applied to $($a.Name)"
    }
}

Стабильная идентификация интерфейса по InterfaceGuid или чётким шаблонам названий уменьшает риск ошибок с USB-модемами и VPN.

Регистрация автозапуска через Task Scheduler (PowerShell) 🗓️

$taskName  = 'NetProfile_AutoPrivate'
$script    = 'C:ScriptsSet-NetworkPrivate.ps1'

$action    = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$script`""
$trigger   = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -RunLevel Highest -LogonType ServiceAccount
$settings  = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 5) -StartWhenAvailable -AllowStartIfOnBatteries -Hidden

Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Force
Start-ScheduledTask -TaskName $taskName

Почему так важно: запуск от SYSTEM с Highest гарантирует права на смену сетевого профиля и работу до входа пользователя.

Альтернатива: запуск при подключении к сети (по событию)

Это полезно при пробуждении, смене Wi‑Fi или после VPN. Используем schtasks с подпиской на журнал Microsoft-Windows-NetworkProfile/Operational (EventID=10000 — сеть подключена):

schtasks /Create /TN "NetProfile_OnConnect" /SC ONEVENT ^
/EC "Microsoft-Windows-NetworkProfile/Operational" ^
/MO "*[System[(EventID=10000)]]" ^
/TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:ScriptsSet-NetworkPrivate.ps1" ^
/RU SYSTEM /RL HIGHEST /F

Права, безопасность и хранение скриптов 🔐

  • Храните скрипт в C:ProgramDataNetProfile и ограничьте ACL для Администраторов и SYSTEM.
  • Подписывайте скрипт корпоративным сертификатом, если действует политика AllSigned.
  • ExecutionPolicy Bypass применяется только к одному запуску и не меняет политику системы.

Типичные ошибки и диагностика 🧰

  • Сеть не успевает подняться — увеличьте паузу ожидания в скрипте до 60–90 секунд.
  • Локализация групп правил — используйте параметр -Group с англоязычными идентификаторами вместо DisplayName.
  • VPN/Hyper-V адаптеры — исключайте их по имени или по типу, чтобы не менять их профиль.
  • Задание не запускается — проверьте журнал Планировщика (Microsoft-Windows-TaskScheduler/Operational) и права на файл.
  • DomainAuthenticated — не меняйте профиль доменных сетей, чтобы не ломать корпоративные политики.

Проверка результата

Get-NetConnectionProfile | Select-Object Name, InterfaceAlias, IPv4Connectivity, NetworkCategory

Ожидаемое значение: NetworkCategory = Private для нужных интерфейсов.

Полезные дополнения

# Принудительно включить обнаружение сети и общий доступ для Private
# (в т.ч. SSDP/UPnP, NB-Name, если это допускается политиками)
Set-NetFirewallRule -Group 'NetworkDiscovery' -Profile Private -Enabled True

# Отключить автоустановку Public на Ethernet без шлюза (например, лаборатория)
Set-NetConnectionProfile -InterfaceAlias 'Ethernet 2' -NetworkCategory Private

Короткий чек-лист перед деплоем 📋

  1. Скрипт лежит в защищённой папке и протестирован вручную.
  2. Задание в Планировщике — от SYSTEM, Highest, At startup; подумайте о триггере по событию.
  3. Учтены исключения: DomainAuthenticated, VPN, виртуальные адаптеры.
  4. Добавлена пауза и повторные попытки до готовности сети.
  5. Включены нужные правила брандмауэра только для Private-профиля.

FAQ по смежным темам

В: Чем Public отличается от Private?
О: Public — максимально закрытый профиль для недоверенных сетей (кафе, аэропорт). Private — для домашней/офисной сети, разрешает обнаружение устройств и общий доступ. Доменные сети попадают в DomainAuthenticated и управляются политиками AD.

В: Можно ли закрепить Private только для конкретной сети Wi‑Fi?
О: Да. Идентифицируйте профиль по Name (SSID) или InterfaceAlias, сравнивайте Get-NetConnectionProfile.Name с ожидаемым SSID и применяйте Set-NetConnectionProfile только к нему.

В: Нужен ли вход пользователя?
О: Нет, используйте запуск от SYSTEM «At startup». Скрипт сработает до входа и подготовит окружение сервисов (например, SMB, RDP).

В: Как быть с PowerShell 7?
О: Команды сети — модуль NetTCPIP — доступны из Windows PowerShell 5.1. В PowerShell 7 запускайте через pwsh.exe и убедитесь, что модуль импортируется (Import-Module NetTCPIP). Проще всего оставить выполнение скрипта под Windows PowerShell 5.1.

В: Можно ли сделать то же через GPO?
О: Частично. Политики могут задавать параметры брандмауэра для профиля Private. Однако смена категории профиля конкретного интерфейса удобнее PowerShell-скриптом на клиенте или через Configuration Manager/Intune.

В: Профиль вновь «откатывается» в Public после сна.
О: Добавьте задание со сценарием ONEVENT по EventID=10000 журнала NetworkProfile, чтобы скрипт срабатывал при каждом повторном подключении к сети.

Оцените:
( Пока оценок нет )
Фотофайл - лучшие картинки и фото
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Теперь напиши комментарий!x