Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 10 (http://forum.oszone.net/forumdisplay.php?f=118)
-   -   [решено] Сделать все сетевые подключения приватными (http://forum.oszone.net/showthread.php?t=347353)

berkut_174 16-12-2020 11:02 2943118

Сделать все сетевые подключения приватными
 
Всем привет!
Стоит задача сделать все сети приватными, в том числе для всех новых подключений.
У меня ОС Windows 10 с пользователем admin и произвольным паролем.
Руководствуюсь этой статьёй https://www.winhelponline.com/blog/t...cific-network/
Создаю триггер:
Код:

<QueryList>
    <Query Id="0" Path="System">
        <Select Path="Microsoft-Windows-NetworkProfile/Operational">
            *[System[(EventID=10000)]] and *[EventData[(Data[@Name="Category"]="0")]]
        </Select>
    </Query>
</QueryList>

Проблема в том, что моё задание ни всегда отрабатывает. Вообще, я ожидаю, что оно будет выполняться всякий раз когда я включаю компьютер независимо от входа пользователя, но похоже это работает как-то иначе. Сразу скажу, что на Windows 7 точно такое же задание с теми же параметрами в планировщике работает исправно. Я конечно же в свойствах задания ставлю флажок «Выполнять вне зависимости от регистрации пользователя» и «Выполнять с наивысшими правами».
Изучая журнал событий, я вижу, что произошло событие с EventID=10000, но моё задание даже не пыталось выполниться.
Заметил, что если запустить систему и в течение нескольких минут авторизоваться в системе под пользователем admin, то задание выполняется успешно. Если же я после включения системы не ввожу данные пользователя, но после некоторого простоя, всё же авторизуюсь под пользователем admin, вижу что моё задание не выполнялось.

Подскажите, что я делаю неправильно...
Заранее спасибо.

Vadikan 16-12-2020 14:01 2943129

Цитата:

Цитата berkut_174
Вообще, я ожидаю, что оно будет выполняться всякий раз когда я включаю компьютер независимо от входа пользователя »

Для этого надо настроить сей аспект, а как у вас настроено никто кроме вас не знает. Экспортируйте задание что-ли... или скриншоты вкладки Общие хотя бы.

berkut_174 16-12-2020 14:41 2943133

Цитата:

Цитата Vadikan
никто кроме вас не знает »

Сразу не сообразил...

Исправился:
Код:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2020-12-16T16:31:46.8055806</Date>
    <Author>WIN10\admin</Author>
    <URI>\change the network to private</URI>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="System"&gt;&lt;Select Path="Microsoft-Windows-NetworkProfile/Operational"&gt;
            *[System[(EventID=10000)]] and *[EventData[(Data[@Name="Category"]="0")]]
        &lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-18</UserId>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\start.cmd</Command>
    </Exec>
  </Actions>
</Task>


berkut_174 16-12-2020 15:18 2943136

Я вот похоже действительно где то неправильно делаю...
Слабал сейчас задание на основе команд по вашей ссылке, вроде пока всегда нормально меняется, проверю ещё более детально.
Спасибо, хоть по-человечески теперь задания создавать научился....

Vadikan 16-12-2020 15:54 2943138

berkut_174, там дело не в командах, а в том:
- для одной или всех УЗ выполняется
- от имени какой УЗ выполняется
- сохранен ли пароль для УЗ, если он имеется

Команды - лишь средство настройки тем или иным образом.

berkut_174 16-12-2020 17:36 2943151

Vadikan
Пароль я сохранял, сейчас сделал от имени системы, пароль admin не запрашивался.
В итоге, всё то же самое — система запустилась, событие есть в журнале, но моё задание даже не пыталось запуститься. Ждал я примерно около 120 секунд, потом вошёл под пользователем и сделал снимки (https://ibb.co/6sD19dx, https://ibb.co/hKsQ3HC).

Добавлял в этот раз вот так:
Код:

$userid = "NT AUTHORITY\SYSTEM"
$taskname = "Change the network to private"
$principal = New-ScheduledTaskPrincipal -UserId $userid -LogonType ServiceAccount
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -StartWhenAvailable
$action = New-ScheduledTaskAction -Execute "C:\change_network_private.cmd"
$cimclass = cimclass MSFT_TaskEventTrigger root/Microsoft/Windows/TaskScheduler
$trigger = $cimclass | New-CimInstance -ClientOnly
$trigger.Enabled = $true
$trigger.Subscription = "<QueryList><Query Id='0' Path='System'><Select Path='Microsoft-Windows-NetworkProfile/Operational'>*[System[(EventID=10000)]] and *[EventData[(Data[@Name='Category']='0')]]</Select></Query></QueryList>"
# register task
Register-ScheduledTask -TaskName $taskname -Action $action -Settings $settings -Principal $principal
# add trigger
Set-ScheduledTask -TaskName $taskname -Trigger $trigger


berkut_174 16-12-2020 18:17 2943158

Я забыл упомянуть важный момент. Если я руками делаю Disable() для сетевого адаптера, а потом обратно Enable(), то моё задание отрабатывает. То есть оно в принципе читает указанное мной событие, но почему то не срабатываем именно при включении ОС.
Я пробовал ставить задержку, таймауты в скрипт... всегда как-то через раз срабатывает, ненадёжно.

Vadikan 16-12-2020 18:17 2943159

berkut_174, а почему у вас @Name='Category']='0'? Я бы навскидку сказал, что нужно 1.

Я смотрю у себя, этому соответствует
Код:

- <EventData>
  <Data Name="Name">Identifying...</Data>
  <Data Name="Description">Identifying...</Data>
  <Data Name="Guid">{c7f91c64-cd09-4ccc-ace1-88723a6c15b1}</Data>
  <Data Name="Type">0</Data>
  <Data Name="State">9</Data>
  <Data Name="Category">0</Data>
  </EventData>


И напротив, когда выполняется подключение, в этих данных SSID

Код:

- <EventData>
  <Data Name="Name">mySSID</Data>
  <Data Name="Description">mySSID</Data>
  <Data Name="Guid">{721bca8a-8367-494d-b5f1-a592ce623b5d}</Data>
  <Data Name="Type">0</Data>
  <Data Name="State">9</Data>
  <Data Name="Category">1</Data>
  </EventData>

Цитата:

Цитата berkut_174
Если я руками делаю Disable() для сетевого адаптера, а потом обратно Enable(), то моё задание отрабатывает. То есть оно в принципе читает указанное мной событие, но почему то не срабатываем именно при включении ОС. »

Тогда есть варианты:
- дальше пытаться разбираться почему не срабатывает при включении
- выполнять задание с задержкой, задавая это в настройках задания или в скрипте
- скриптом перезагружать адаптер https://t.me/sterkin_ru/953

berkut_174 16-12-2020 18:30 2943161

Цитата:

Цитата Vadikan
Я бы навскидку сказал, что нужно 1. »

Потому что мне нужно наоборот заменить 0 на 1, так как 0 — публичная, 1 — приватная.

Цитата:

Цитата Vadikan
- дальше пытаться разбираться почему не срабатывает при включении »

Я уже всеми частями тела помогаю... не выходит...
На Windows 7 даже экспортом с Windows 10 сейчас это же задание импортнул — работает железно.

Цитата:

Цитата Vadikan
- выполнять задание с задержкой, задавая это в настройках задания или в скрипте »

Ненадёжно, на одной машине сработает, на другой нет, да и не всегда такая задержка помогает, к сожалению. Статистика плачевная тут у меня.

Цитата:

Цитата Vadikan
- скриптом перезагружать адаптер https://t.me/sterkin_ru/953 »

Мдя... то есть при старте машины делать отключение/включение адаптера ? Вариант, конечно, но чё то колхоз...

Vadikan 16-12-2020 18:40 2943165

Цитата:

Цитата berkut_174
Потому что мне нужно наоборот заменить 0 на 1, так как 0 — публичная, 1 — приватная. »

Ок, но если вам нужно менять профиль для сетей, которые в процессе идентификации (Identifying) или не идентифицированных (Unidentified), это можно сделать политикой https://docs.microsoft.com/en-us/win...nager-policies (Она не позволяет настроить все будущие сети)

А событие уже отлавливать конкретно такое, в котором есть SSID. Ну и дальше уже выполнять скрипт ваш, чем вы там меняете профиль... тут пош https://superuser.com/a/728776

berkut_174 16-12-2020 20:27 2943175

Цитата:

Цитата Vadikan
SSID »

Я не могу отлавливать по SSID, я его не знаю. У меня сеть заранее не определена и поэтому может быть какой угодной.

В общем печально, ума не приложу почему на Windows 10 не хочет нормально выполняться рабочий вариант конфига задания... жаль.

Vadikan 16-12-2020 21:33 2943189

berkut_174, так вы отлавливайте планировщиком событие, а в скрипте анализируйте содержимое последнего события. Если в нем identifying или unidentified, ничего не делайте. Иначе берите оттуда SSID и меняйте профиль.

Либо просто все сети делайте приватными по событию, скрипт по ссылке выше.

berkut_174 16-12-2020 23:08 2943204

Vadikan, чего же вы раньше не дали этой ссылки... я проглядел...
Мне ведь действительно в идеале не нужно ничего отлавливать, мне нужно чтобы все сети были приватными по умолчанию.
Это именно то, что нужно! Благодарю.

Vadikan 16-12-2020 23:11 2943207

Цитата:

Цитата berkut_174
чего же вы раньше не дали этой ссылки... я проглядел, это именно то, что нужно! »

Так у вас же был скрипт какой-то для изменения профиля сети, который вы из планировщика запускали. Откуда ж мне знать, что вам еще и другой нужен :)

berkut_174 17-12-2020 08:05 2943237

Vadikan, есть, но он почему-то ни всегда срабатывал, если добавить его в планировщик при запуске ОС. В прочем посмотрим, как этот себя будет вести, вероятно, могут быть аналогичные проблемы, надо больше тестов.
Тем более по ссылке уж больно короткий оказался, у меня основной через изменение реестра и ещё вот такой:
Код:

Get-NetConnectionProfile | Where{ $_.NetWorkCategory -ne 'Private'} | ForEach {$_|Set-NetConnectionProfile -NetWorkCategory Private}
Я же правильно понял, что скрипт по ссылке текущие и все будущие сети будет делать по умолчанию частными ?..

Vadikan 17-12-2020 08:50 2943244

berkut_174, скрипт меняет профиль всех имеющихся сетей. Будущие сделать частными невозможно.

berkut_174 17-12-2020 09:47 2943254

Vadikan, ох, тогда я снова могу попасть в такую ситуацию, что задание выполняемое при запуске, будет завершено, когда ещё сеть не была инициализирована, соответственно кина не будет...
Такое ведь возможно ?

berkut_174 17-12-2020 10:38 2943265

Собственно говоря, именно потому что мой скрипт ни всегда корректно отрабатывал, когда использовался триггер «при запуске системы», я начал отлавливать событие с ID = 10000. На Windows 7 это сработало безукоризненно, но на Windows 10 с попеременным успехом...

Anton04 17-12-2020 10:51 2943267

Цитата:

Цитата berkut_174
что задание выполняемое при запуске, будет завершено, когда ещё сеть не была инициализирована, соответственно кина не будет...
Такое ведь возможно ? »

Вполне возможно. Тогда нужно менять в GPO и делать "ждать загрузку сети".

Vadikan 17-12-2020 11:57 2943281

Цитата:

Цитата berkut_174
тогда я снова могу попасть в такую ситуацию, что задание выполняемое при запуске, будет завершено, когда ещё сеть не была инициализирована, соответственно кина не будет... »

Я же говорю
Цитата:

Цитата Vadikan
вы отлавливайте планировщиком событие, а в скрипте анализируйте содержимое последнего события. Если в нем identifying или unidentified, ничего не делайте. Иначе берите оттуда SSID и меняйте профиль. »

Я не понял, вы это видели или просто тихо ждали, пока вам напишут такой скрипт?:) Вроде ж видели, раз отмечали сообщение полезным.

Код:

$e = Get-WinEvent -Maxevents 1 -FilterHashtable @{logname="Microsoft-Windows-NetworkProfile/Operational"; id=10000}
$xml = [xml]$e.ToXml()
$SSID = $xml.Event.EventData.Data[1]."#text"
if ($SSID -notlike '*iden*') {Set-NetConnectionProfile -Name $SSID -NetworkCategory "Private"}

Под локализацию подстраивайте самостоятельно.

berkut_174 17-12-2020 13:40 2943289

Vadikan, я поблагодарил за скрипт :)
Код:

# Skip network location setting for pre-Vista operating systems
if([environment]::OSVersion.version.Major -lt 6) { return }
# Skip network location setting if local machine is joined to a domain.
if(1,3,4,5 -contains (Get-WmiObject win32_computersystem).DomainRole) { return }
# Get network connections
$networkListManager = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]"{DCB00C01-570F-4A9B-8D69-199FDBA5723B}"))
$connections = $networkListManager.GetNetworkConnections()
# Set network location to Private for all networks
$connections | % {$_.GetNetwork().SetCategory(1)}

Насчёт анализа события несколько не понял... Если в моём случае планировщик не может корректно отловить событие с ID = 10000 в принципе во время запуска ОС. Очевидно же, что до анализа скриптом дело не дойдёт...

Цитата:

Цитата Anton04
Вполне возможно. Тогда нужно менять в GPO и делать "ждать загрузку сети". »

Ставить для всех сетей частная и тогда при инициализации они сразу будут такими ?

Vadikan 17-12-2020 14:46 2943291

Цитата:

Цитата berkut_174
Насчёт анализа события несколько не понял... Если в моём случае планировщик не может корректно отловить событие с ID = 10000 в принципе во время запуска ОС. Очевидно же, что до анализа скриптом дело не дойдёт... »

Я же вам предложил задержку, но вы отмели это почему-то
Цитата:

Цитата berkut_174
Цитата:

Цитата Vadikan:
- выполнять задание с задержкой, задавая это в настройках задания или в скрипте »
Ненадёжно, на одной машине сработает, на другой нет, да и не всегда такая задержка помогает, к сожалению. Статистика плачевная тут у меня. »

Я не понимаю, в чем здесь ненадежность и почему задержка не помогает.


Через пять минут после запуска ОС запускается скрипт и анализирует события. В примере моего скрипта только последнее, но ничто не мешает выбирать последние N и перебирать их с ForEach-Object.

Поскольку повторяться мне уже поднадоело, я ожидаю конкретных результатов отработки скрипта с разных машин, запущенного с условием выше.
Код:

$e = Get-WinEvent -Maxevents 5 -FilterHashtable @{logname="Microsoft-Windows-NetworkProfile/Operational"; id=10000}
$e | ForEach-Object {
    $xml = [xml]$_.ToXml()
    $SSID = $xml.Event.EventData.Data[1]."#text"
    #if ($SSID -notlike '*iden*') {Set-NetConnectionProfile -Name $SSID -NetworkCategory "Private"}
    if ($SSID -notlike '*iden*') {Get-Date; $SSID | Out-File C:\temp\ssid.txt -Append}
}


berkut_174 17-12-2020 16:03 2943297

Vadikan, отмёл я вариант с задержкой, потому что мне он не очень нравится, ну вдруг будет все пять минут сеть отсутствовать...

В итоге, пришёл к двум рабочим вариантам:
  • скрипт отсюда https://superuser.com/a/728776 и триггер при запуске без задержки
  • мой скрипт с командой, которую я приводил в #15 сообщении, с двумя триггерами — при запуске без задержки и при наступлении события с ID = 10000 and Category=0

Поэтому окончательный вариант буду использовать такой:
Код:

$userid = "NT AUTHORITY\SYSTEM"
$taskname = "Set all network profiles to private"
$principal = New-ScheduledTaskPrincipal -UserId $userid -LogonType ServiceAccount
$trigger = @($(New-ScheduledTaskTrigger -AtStartup))
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -StartWhenAvailable
$execute = "powershell"
$argument = "-WindowStyle Hidden -command `"[Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')).GetNetworkConnections() | % {`$_.GetNetwork().SetCategory(1)}`""
$action = New-ScheduledTaskAction -Execute $execute -Argument $argument
$cimclass = cimclass MSFT_TaskEventTrigger root/Microsoft/Windows/TaskScheduler
$triggerevent = $cimclass | New-CimInstance -ClientOnly
$triggerevent.Enabled = $true
$triggerevent.Subscription = "<QueryList><Query Id='0' Path='System'><Select Path='Microsoft-Windows-NetworkProfile/Operational'>*[System[(EventID=10000)]] and *[EventData[(Data[@Name='Category']='0')]]</Select></Query></QueryList>"
Register-ScheduledTask -TaskName $taskname -Action $action -Trigger $trigger -Settings $settings -Principal $principal
Set-ScheduledTask -TaskName $taskname -Trigger $((Get-ScheduledTask -TaskName $taskname).triggers + $triggerevent)

Далее мусолить тему не вижу смысла...
Всем спасибо!

Vadikan 18-12-2020 16:36 2943404

berkut_174, я вижу, что вы довольны, но все-таки хотелось бы добить вопрос с точки зрения эффективности.

Как я понял, задержка вас не устроила из-за того, что сети могут очень долго проходить идентификацию (обозначу их И).

Но это ведь легко решается тем же скриптом.
1. Берем все сети и смотрим, есть ли там И.
2. Если
- нет, назначаем всем сетям частный профиль и завершаем скрипт
- да, ставим скрипт на паузу N минут, после чего возвращаемся к п.1

Рано или поздно сеть должна либо идентифироваться, либо стать неидентифицированной. Ну и в конце концов можно в скрипте задать число таких проверок, скажем 6 каждые 10 минут.

При этом политикой для всех И задан частный профиль.


Время: 23:38.

Время: 23:38.
© OSzone.net 2001-