Показать полную графическую версию : [решено] Сделать все сетевые подключения приватными
berkut_174
17-12-2020, 13:40
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 в принципе во время запуска ОС. Очевидно же, что до анализа скриптом дело не дойдёт...
Вполне возможно. Тогда нужно менять в GPO и делать "ждать загрузку сети". »
Ставить для всех сетей частная и тогда при инициализации они сразу будут такими ?
Насчёт анализа события несколько не понял... Если в моём случае планировщик не может корректно отловить событие с ID = 10000 в принципе во время запуска ОС. Очевидно же, что до анализа скриптом дело не дойдёт... »
Я же вам предложил задержку, но вы отмели это почему-то
Цитата Vadikan:
- выполнять задание с задержкой, задавая это в настройках задания или в скрипте »
Ненадёжно, на одной машине сработает, на другой нет, да и не всегда такая задержка помогает, к сожалению. Статистика плачевная тут у меня. »
Я не понимаю, в чем здесь ненадежность и почему задержка не помогает.
https://i.imgur.com/tZq9EWY.png
Через пять минут после запуска ОС запускается скрипт и анализирует события. В примере моего скрипта только последнее, но ничто не мешает выбирать последние 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
Vadikan, отмёл я вариант с задержкой, потому что мне он не очень нравится, ну вдруг будет все пять минут сеть отсутствовать...
В итоге, пришёл к двум рабочим вариантам:
скрипт отсюда https://superuser.com/a/728776 и триггер при запуске без задержки
мой скрипт с командой, которую я приводил в #15 (http://forum.oszone.net/post-2943237-15.html) сообщении, с двумя триггерами — при запуске без задержки и при наступлении события с 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)
Далее мусолить тему не вижу смысла...
Всем спасибо!
berkut_174, я вижу, что вы довольны, но все-таки хотелось бы добить вопрос с точки зрения эффективности.
Как я понял, задержка вас не устроила из-за того, что сети могут очень долго проходить идентификацию (обозначу их И).
Но это ведь легко решается тем же скриптом.
1. Берем все сети и смотрим, есть ли там И.
2. Если
- нет, назначаем всем сетям частный профиль и завершаем скрипт
- да, ставим скрипт на паузу N минут, после чего возвращаемся к п.1
Рано или поздно сеть должна либо идентифироваться, либо стать неидентифицированной. Ну и в конце концов можно в скрипте задать число таких проверок, скажем 6 каждые 10 минут.
При этом политикой для всех И задан частный профиль.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.