Как включить общий доступ к подключению к Интернету с помощью командной строки?

35

Я могу сделать это вручную, щелкнув правой кнопкой мыши сетевое соединение, открыв вкладку «Общий доступ» и установив флажок «Разрешить другим пользователям сети подключаться через интернет-соединение на этом компьютере».

Теперь мне нужно автоматизировать эту задачу. Для этого есть инструмент командной строки или командлет Powershell?

utapyngo
источник
4
Не могу попробовать это сейчас, но вы можете попробовать запустить Process Monitor и указать его в своем реестре. Посмотрите, какие ключи / значения меняются, когда вы переключаете и применяете настройку, а затем пишите свой скрипт соответственно.
Изи
Связанный вопрос / информация о StackOverflow: программно включить общий доступ к подключению к Интернету
Ƭᴇcʜιᴇ007
Компонент Microsoft-Windows-SharedAccessавтоматической установки Windows так близко, но он работает только при установке Windows! technet.microsoft.com/en-us/library/ff715511.aspx
Джейкоб Кралл

Ответы:

20

Вот чистое решение PowerShell (должно выполняться с правами администратора):

# Register the HNetCfg library (once)
regsvr32 hnetcfg.dll

# Create a NetSharingManager object
$m = New-Object -ComObject HNetCfg.HNetShare

# List connections
$m.EnumEveryConnection |% { $m.NetConnectionProps.Invoke($_) }

# Find connection
$c = $m.EnumEveryConnection |? { $m.NetConnectionProps.Invoke($_).Name -eq "Ethernet" }

# Get sharing configuration
$config = $m.INetSharingConfigurationForINetConnection.Invoke($c)

# See if sharing is enabled
Write-Output $config.SharingEnabled

# See the role of connection in sharing
# 0 - public, 1 - private
# Only meaningful if SharingEnabled is True
Write-Output $config.SharingType

# Enable sharing (0 - public, 1 - private)
$config.EnableSharing(0)

# Disable sharing
$config.DisableSharing()

Смотрите также этот вопрос на social.msdn.microsoft.com :

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

utapyngo
источник
1
Ох, я не знал, что вы могли бы взаимодействовать с COM с PowerShell! Я полагаю, вам нужно [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)посыпать немного .
Джейкоб Кралл
Призыв EnableSharingвызывает это исключение, даже если я запускаю PowerShell от имени администратора: исключение: исключение, вызывающее «EnableSharing» с аргументом «1»: «Событию не удалось вызвать ни одного из подписчиков (исключение из HRESULT: 0x80040201) "-> Исключение было сгенерировано целью вызова. -> Событие не смогло вызвать ни одного из подписчиков (Исключение из HRESULT: 0x80040201)
Джейкоб Кралл,
Попробуйте запустить regsvr32 hnetcfg.dllот имени администратора вручную.
Утапынго
Интересно: что означает «включить публичный интерфейс на адаптере»?
Джейкоб Кралл,
2
В более новых версиях Powershell .SharingType теперь является .SharingConnectionType
Baodad
9

Я создал простой инструмент командной строки для этого.

  1. Скачать и распаковать илиgit clone git@github.com:utapyngo/icsmanager.git

  2. Построить, запустив build.cmd

  3. Зарегистрируйте HNetCfgбиблиотеку COM: regsvr32 hnetcfg.dll(это стандартная библиотека, расположенная по адресу %WINDIR%\System32)

Использование командной строки

  1. Откройте командную строку как администратор

    cdв icsmanagerкаталог (или icsmanager-masterесли вы скачали zip).

  2. Тип icsmanager

    Это должно отобразить доступные сетевые подключения. Обратите внимание на атрибут GUID. Чтобы использовать этот инструмент, вам нужно иметь как минимум два соединения.

  3. Тип icsmanager enable {GUID-OF-CONNECTION-TO-SHARE} {GUID-OF-HOME-CONNECTION}

    Это должно включить ICS.

Использование Powershell

  1. Модуль импорта:

    Модуль импорта IcsManager.dll

  2. Список сетевых подключений:

    Get-NetworkConnections

  3. Запустите общий доступ к подключению к Интернету:

    Enable-ICS "Соединение с общим доступом" "Домашнее соединение"

  4. Остановить общий доступ к подключению к Интернету:

    Отключить-ICS


Отказ от ответственности: я еще не тестировал инструмент. Используйте его на свой страх и риск. Не стесняйтесь открывать вопрос на GitHub, если что-то не работает. Тяговые запросы также приветствуются.

utapyngo
источник
Ухоженная. При этом используется внешний двоичный файл с именем NETCONLib; откуда это? Что оно делает?
Джейкоб Кралл
Ага. Это оболочка класса COM для «библиотеки типов NetCon 1.0», включенной в Windows.
Джейкоб Кралл
@JacobKrall, да, он находится по адресу C:\Windows\System32\hnetcfg.dll.
Утапынго
Похоже, это будет делать именно то, что я хочу - я попробую.
Джейкоб Кралл
1
Извините, я сделал это несколько месяцев назад и забыл, что HNetCfg должен быть зарегистрирован вручную regsvr32 hnetcfg.dll. И я узнал hnetcfg.dllв msdn.microsoft.com/en-us/library/windows/desktop/...
utapyngo
5

Насколько я понимаю, возможности маршрутизации были удалены из Windows начиная с Vista и теперь доступны только в Windows Server.

В Интернете можно найти следующую уловку для повторного включения netsh routing, которую вы можете попробовать на свой страх и риск. Сначала я предлагаю обычные меры предосторожности, включая создание точки восстановления системы.

  1. Получить IPMONTR.DLL и IPPROMON.DLL с 2003 или из XP
  2. Скопируйте их в WINDOWS \ SYSTEM32
  3. Запустите в командной строке (cmd) от имени администратора:

    netsh add helper ipmontr.dll
    netsh add helper ippromon.dll

Вам также может потребоваться установить для службы маршрутизации и удаленного доступа автоматический запуск.

Перезагрузитесь, прежде чем пытаться что-либо.

harrymc
источник
1
Законно ли копировать файлы из XP, если у меня нет лицензии XP?
Утапынго
1
Пробовал это на Windows 7 64bit. Скопировал файлы из XP 64 бит. Запуск от имени администратора. Ошибки:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo
1
Я тоже попробовал «добавить помощника», и мне жаль подтверждать, что он не работает для 64-битных систем. Что касается законности пересадки dll, на которую вы имеете право в обеих ОС, это неясно. У вас нет права изменять файлы Windows, но копирование их, возможно, не разрешено в лицензии XP (меня поразит, что Microsoft могла предвидеть это заранее).
harrymc
1
В ответе следует упомянуть, что он не работает для 64-битной Windows. Также отметьте, что файлы должны быть скопированы из XP 32-bit.
Утапынго
@utapyngo: Нельзя быть уверенным, что на самом деле нет способа заставить эту работу работать на 64-битной версии. Согласно моим исследованиям, проблема в том, что нужно скопировать больше dll, чем эти два, но полный анализ проблемы требует больше времени, чем я могу дать.
Harrymc
2

Бывший мой коллега делал это через собственный инструмент Windows netsh. Поскольку я никогда не делал этого сам, я могу порекомендовать вам взглянуть на документацию по Microsoft netsh .

Насколько я помню, это было довольно жалко и много netsh-вызовов, где это было необходимо, но в итоге это сработало ...

Langhard
источник
6
Это можно было сделать netsh routingв Windows XP, но в Windows 7 они удалили эту команду. Вот почему я спрашиваю только о Windows 7.
utapyngo
2

Следующее должно работать

netsh routing ip autodhcp install
netsh routing ip autodhcp set interface name="Local Area Connection(or whereever your internet connection is from)" mode=enable
netsh routing ip autodhcp set global 192.168.0.1 255.255.255.0 11520
Craig
источник
8
Это можно было сделать netsh routingв Windows XP, но в Windows 7 они удалили эту команду. Вот почему я спрашиваю только о Windows 7.
utapyngo
1

К сожалению, нет такой команды cmd для Windows 7 или более, поэтому я использовал эту функцию Visual Basic, чтобы сделать это:

Private Function EnableDisableICS(ByVal sPublicConnectionName As String, ByVal sPrivateConnectionName As String, ByVal bEnable As Boolean)  
    Dim bFound As Boolean
    Dim oNetSharingManager, oConnectionCollection, oItem, EveryConnection, objNCProps
    oNetSharingManager = CreateObject("HNetCfg.HNetShare.1")
    oConnectionCollection = oNetSharingManager.EnumEveryConnection
    For Each oItem In oConnectionCollection
        EveryConnection = oNetSharingManager.INetSharingConfigurationForINetConnection(oItem)
        objNCProps = oNetSharingManager.NetConnectionProps(oItem)
        If objNCProps.name = sPrivateConnectionName Then
            bFound = True
            MsgBox("Starting Internet Sharing For: " & objNCProps.name)
            If bEnable Then
                EveryConnection.EnableSharing(1)
            Else
                EveryConnection.DisableSharing()
            End If
        End If
    Next
    oConnectionCollection = oNetSharingManager.EnumEveryConnection
    For Each oItem In oConnectionCollection
        EveryConnection = oNetSharingManager.INetSharingConfigurationForINetConnection(oItem)
        objNCProps = oNetSharingManager.NetConnectionProps(oItem)
        If objNCProps.name = sPublicConnectionName Then
            bFound = True
            MsgBox("Internet Sharing Success For: " & objNCProps.name)
            If bEnable Then
                EveryConnection.EnableSharing(0)
            Else
                EveryConnection.DisableSharing()
            End If
        End If
    Next
    Return Nothing 'bEnable & bFound
End Function  

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    EnableDisableICS("YOUR ACTIVE NETWORK", "YOUR ADAPTOR TO SHARE", True)
End Sub

Обратите внимание, что "" "" обязательно. Повеселись.

защелка
источник
1

Исходя из того, что я прочитал, если те, кто написал netsh, не работают, начиная с 7 и выше, это неправильно. Теперь, если речь идет строго о « netsh routing», я думаю, вы могли бы быть правы, но это работает - я собираюсь показать содержимое созданного мной пакетного файла, который работает на Windows 8.1. Вместо того, чтобы получать обычные комментарии и фрагменты информации, я постараюсь помочь тем, у кого есть полная информация.

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

http://windows.microsoft.com/en-us/windows/set-internet-connection-sharing#1TC=windows-7

  1. Откройте «Сетевые подключения», нажав кнопку «Пуск» Изображение кнопки «Пуск», а затем нажмите «Панель управления». В поле поиска введите адаптер, а затем в разделе Центр управления сетями и общим доступом щелкните Просмотр сетевых подключений.

  2. Щелкните правой кнопкой мыши соединение, которым вы хотите поделиться, и выберите Свойства. Требуется разрешение администратора. Если вас попросят ввести пароль администратора или подтверждение, введите пароль или предоставьте подтверждение.

  3. Перейдите на вкладку «Общий доступ» и установите флажок «Разрешить другим пользователям сети подключаться через этот компьютер к интернет-соединению».

После того, как вы выполнили шаги, описанные выше, чтобы настроить ICS на хост-компьютере, внесите следующие изменения на всех других компьютерах (но не на хост-компьютере).

  1. Откройте «Свойства обозревателя», нажав кнопку «Пуск» Изображение кнопки «Пуск», выберите «Панель управления», «Сеть и Интернет», а затем нажмите «Свойства обозревателя».

  2. Перейдите на вкладку «Подключения» и нажмите «Никогда не набирать соединение».

  3. Нажмите Настройки локальной сети.

  4. В диалоговом окне «Параметры локальной сети» в разделе «Автоматическая настройка» снимите флажки «Автоматически определять параметры» и «Использовать сценарий автоматической настройки».

  5. В разделе Прокси-сервер снимите флажок Использовать прокси-сервер для вашей локальной сети и нажмите кнопку ОК.

Насколько мне известно, я думаю, что это должно работать как для Windows 7, так и для 8.

Теперь, поскольку тема была о решении для командной строки, это содержимое пакетного файла о том, как настроить виртуальный беспроводной адаптер и готов к работе.

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

Совместное использование файла .bat:

@echo off
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

cd\
    if NOT EXIST "C:\TEMP\switch.txt" (
        GOTO :START
    ) ELSE (
        GOTO :STOP
    )

:START
REM Create Temp File for On and Off switch.
ECHO WOOHOO >"C:\TEMP\switch.txt"

REM -- Output everything that is happening into a file called wifi.txt.
REM -- Start out with a timestamp at the top to show when it was done.
REM -- All 'netsh' commands are for setting up the SSID and starting the    sharing.
REM -- I stop and start when starting the service just for prosperity.

echo _%_my_datetime% >"C:\TEMP\wifi.txt"
netsh wlan set hostednetwork mode=allow ssid=ITWORKS key=111222333 >>    "C:\TEMP\wifi.txt"
netsh wlan stop hostednetwork >>"C:\TEMP\wifi.txt"
netsh wlan start hostednetwork >>"C:\TEMP\wifi.txt"
echo MSGBOX "Wifi Sharing Started!" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
GOTO :END


REM -- This will turn ICS off and give a prompt via VBS that you're turned off.
REM -- I timestamp when the service is turned off in the output file.
REM -- I delete the switch file to let the code know to turn it on when
REM -- when fired off again.  Tempmessage is the msgbox used to show the service
REM -- has been turned off.  Same for the msgbox above when it's on.

:STOP
echo OFF AT _%_my_datetime% >>"C:\TEMP\wifi.txt"
netsh wlan stop hostednetwork >>"C:\TEMP\wifi.txt"
DEL /Q "C:\TEMP\switch.txt"
echo MSGBOX "Wifi Sharing Stopped!" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q

:END

Я буду более чем счастлив ответить на вопросы по этому поводу, потому что будут некоторые уникальные ситуации, и я хотел бы помочь, так как мне пришлось собрать воедино то, что я нашел выше.

Но чтобы представить это наглядно, это работает в Windows 8.1 с использованием соединения Ethernet с ноутбуком, который использует свое соединение с виртуальным адаптером. Это может работать так же хорошо, если вы пытаетесь поделиться источником беспроводного соединения.

user2562950
источник
Добро пожаловать в Супер пользователя! Спасибо за подробный ответ, я отредактировал ваш вопрос, чтобы упростить часть текста и поместить содержимое файла bat в блок кода. Вы можете увидеть другие инструкции по форматированию, если есть какие-либо проблемы с ним - пожалуйста, убедитесь, что я не изменил значение кода.
bertieb
Да, это хорошо, и спасибо. Я знал, что должен был сделать лучшую работу по форматированию. Приятное прикосновение к ссылке MS, чтобы предотвратить необходимость идти туда.
user2562950
Не беспокойтесь об этом, вы достаточно быстро подберете синтаксис уценки :) Включение содержания ссылок здесь является частью политики ответа на вопросы - ссылки могут устареть, измениться или исчезнуть. Это менее вероятно в случае Microsoft, но все еще очень возможно. Это хорошая практика, чтобы поместить все необходимое для решения в самом ответе. С нетерпением ждем больше хороших ответов от вас!
bertieb