PS Сменить сеть с домашней на публичную

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Phoenix, 19 окт 2013.

  1. Phoenix
    Оффлайн

    Phoenix Активный пользователь

    Сообщения:
    1.857
    Симпатии:
    1.842
    А вот кстати пример для отличия от cmd
    #
    # Name: ChangeCategory.ps1
    # Copyright: Microsoft 2009
    # Revision: 1.0
    #
    # This script can be used to change the network category of
    # an 'Unidentified' network to Private to allow common network
    # activity. This script should only be run when connected to
    # a network that is trusted since it will also affect the
    # firewall profile used.
    # This script is provided as-is and Microsoft does not assume any
    # liability. This script may be redistributed as long as the file
    # contains these terms of use unmodified.
    #
    # Usage:
    # Start an elevated Powershell command window and execute
    # ChangeCategory.ps1
    #
    Код (Text):
    $NLMType = [Type]::GetTypeFromCLSID('DCB00C01-570F-4A9B-8D69-199FDBA5723B')
    $INetworkListManager = [Activator]::CreateInstance($NLMType)

    $NLM_ENUM_NETWORK_CONNECTED  = 1
    $NLM_NETWORK_CATEGORY_PUBLIC = 0x00
    $NLM_NETWORK_CATEGORY_PRIVATE = 0x01
    $UNIDENTIFIED = "Unidentified network"

    $INetworks = $INetworkListManager.GetNetworks($NLM_ENUM_NETWORK_CONNECTED)

    foreach ($INetwork in $INetworks)
    {
        $Name = $INetwork.GetName()
        $Category = $INetwork.GetCategory()

        if ($INetwork.IsConnected -and ($Category -eq $NLM_NETWORK_CATEGORY_PUBLIC) -and ($Name -eq $UNIDENTIFIED))
        {
            $INetwork.SetCategory($NLM_NETWORK_CATEGORY_PRIVATE)
        }
    }
    И вопрос. Так будет правильно, если надо включить не домашнюю, а общуюю сеть (?).
    Код (Text):
    $NLMType = [Type]::GetTypeFromCLSID('DCB00C01-570F-4A9B-8D69-199FDBA5723B')
    $INetworkListManager = [Activator]::CreateInstance($NLMType)

    $NLM_ENUM_NETWORK_CONNECTED  = 1
    $NLM_NETWORK_CATEGORY_PUBLIC = 0x01
    $NLM_NETWORK_CATEGORY_PRIVATE = 0x00
    $UNIDENTIFIED = "Unidentified network"

    $INetworks = $INetworkListManager.GetNetworks($NLM_ENUM_NETWORK_CONNECTED)

    foreach ($INetwork in $INetworks)
    {
        $Name = $INetwork.GetName()
        $Category = $INetwork.GetCategory()

        if ($INetwork.IsConnected -and ($Category -eq $NLM_NETWORK_CATEGORY_PRIVATE) -and ($Name -eq $UNIDENTIFIED))
        {
            $INetwork.SetCategory($NLM_NETWORK_CATEGORY_PUBLIC)
        }
    }
    Добавлю. Возникла нужда на win 8.1 изменить сеть на общественную, что оказалось не так то просто (!) Сначала пришлось политиками отключать домашнюю группу. Потом отыскал такой скрипт.
     
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Так, у Вас коды по сути одинаковые, просто во втором константы попутаны:
    $NLM_NETWORK_CATEGORY_PUBLIC = 0x00 а не 0x01
    (надо было делать что-то одно. Только константы следующий раз не трогайте - грех.)

    На TechNet пишут, что скрипт для Windows Server 2008 R2 - вероятно, будет и на 8.1. работать.
    По коду № 1 ничего плохого не скажу:
    перебираются циклом все сети, с фильтрацией только подключенных, приватных и имеющих имя "Unidentified network".
    Если такую находит, изменяет ее категорию на NLM_NETWORK_CATEGORY_PRIVATE (т.е. домашнюю.)

    Если нужно наоборот - домашнюю сменить на публичную, то код будет выглядеть так:

    Код (PowerShell):
    $NLMType = [Type]::GetTypeFromCLSID('DCB00C01-570F-4A9B-8D69-199FDBA5723B')
    $INetworkListManager = [Activator]::CreateInstance($NLMType)
    $NLM_ENUM_NETWORK_CONNECTED  = 1
    $NLM_NETWORK_CATEGORY_PUBLIC = 0x00
    $NLM_NETWORK_CATEGORY_PRIVATE = 0x01
    $UNIDENTIFIED = "Unidentified network"
    $INetworks = $INetworkListManager.GetNetworks($NLM_ENUM_NETWORK_CONNECTED)
    foreach ($INetwork in $INetworks)
    {
        $Name = $INetwork.GetName()
        $Category = $INetwork.GetCategory()
        if ($INetwork.IsConnected -and ($Category -eq $NLM_NETWORK_CATEGORY_PRIVATE) -and ($Name -eq $UNIDENTIFIED))
        {
            $INetwork.SetCategory($NLM_NETWORK_CATEGORY_PUBLIC)
        }
    }
    Если не сработает, попробуйте из условия убрать -and ($Name -eq $UNIDENTIFIED)
    Код запускаем с повышенными привилегиями.
     
    Последнее редактирование: 19 окт 2013
    Kиpилл нравится это.
  3. Phoenix
    Оффлайн

    Phoenix Активный пользователь

    Сообщения:
    1.857
    Симпатии:
    1.842
    Спасибо, а я по наивности принял их за переменные..
    Код (Text):

    PS C:\WINDOWS\system32> C:\Users\partizan\Desktop\PublicNet.ps1
    Невозможно загрузить файл C:\Users\partizan\Desktop\PublicNet.ps1, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см. ab
    out_Execution_Policies по адресу http://go.microsoft.com/fwlink/?LinkID=135170.
        + CategoryInfo          : Ошибка безопасности: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnauthorizedAccess

    PS C:\WINDOWS\system32> $NLMType = [Type]::GetTypeFromCLSID('DCB00C01-570F-4A9B-8D69-199FDBA5723B')
    $INetworkListManager = [Activator]::CreateInstance($NLMType)
    $NLM_ENUM_NETWORK_CONNECTED  = 1
    $NLM_NETWORK_CATEGORY_PUBLIC = 0x00
    $NLM_NETWORK_CATEGORY_PRIVATE = 0x01
    $UNIDENTIFIED = "Unidentified network"
    $INetworks = $INetworkListManager.GetNetworks($NLM_ENUM_NETWORK_CONNECTED)
    foreach ($INetwork in $INetworks)
    {
        $Name = $INetwork.GetName()
        $Category = $INetwork.GetCategory()
        if ($INetwork.IsConnected -and ($Category -eq $NLM_NETWORK_CATEGORY_PRIVATE) -and ($Name -eq $UNIDENTIFIED))
        {
            $INetwork.SetCategory($NLM_NETWORK_CATEGORY_PUBLIC)
        }
    }

    PS C:\WINDOWS\system32>
     
    Всё сработало, сенькс Гуру !
    [​IMG]
    --- Объединённое сообщение, 19 окт 2013, Дата первоначального сообщения: 19 окт 2013 ---
    Дополню. Запускал несколько раз и не обратил внимания. Вот так работает. [то есть без -and ($Name -eq $UNIDENTIFIED) ]
    PHP:
    $NLMType = [Type]::GetTypeFromCLSID('DCB00C01-570F-4A9B-8D69-199FDBA5723B')
    $INetworkListManager = [Activator]::CreateInstance($NLMType)
    $NLM_ENUM_NETWORK_CONNECTED  = 1
    $NLM_NETWORK_CATEGORY_PUBLIC = 0x00
    $NLM_NETWORK_CATEGORY_PRIVATE = 0x01
    $UNIDENTIFIED = "Unidentified network"
    $INetworks = $INetworkListManager.GetNetworks($NLM_ENUM_NETWORK_CONNECTED)
    foreach ($INetwork in $INetworks)
    {
        $Name = $INetwork.GetName()
        $Category = $INetwork.GetCategory()
        if ($INetwork.IsConnected -and ($Category -eq $NLM_NETWORK_CATEGORY_PRIVATE))
        {
            $INetwork.SetCategory($NLM_NETWORK_CATEGORY_PUBLIC)
        }
    }
     
    Kиpилл нравится это.
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.498
    Симпатии:
    4.313
    Это я так интуитивно предположил :)

    По-умолчанию, доступно выполнение только подписанных сценариев.
    Чтобы разрешить запуск неподписанных, следует ввести команду:
    Код (PowerShell):
    Set-ExecutionPolicy RemoteSigned
    непосредственно в окно интерпретатора.
    Для его запуска с повышенными правами нажимаем Пуск (в Win 8 Ctrl + Esc) набираем PowerShell, затем Ctrl + Shift + Enter.
     
    Phoenix нравится это.

Поделиться этой страницей