Як увімкнути спільний доступ до Інтернету за допомогою командного рядка?


35

Я можу це зробити вручну, клацнувши правою кнопкою миші на мережевому підключенні, відкривши вкладку Спільний доступ і натиснувши прапорець "Дозволити іншим користувачам мережі підключитися через Інтернет-з'єднання цього комп'ютера".

Тепер мені потрібно автоматизувати це завдання. Чи є інструмент командного рядка або командлет Powershell для цього?


4
Неможливо спробувати це зараз, але ви можете спробувати запустити Монітор процесів та вказати його у своєму реєстрі. Подивіться, які ключі / значення змінюються під час перемикання та застосування параметра, а потім напишіть свій сценарій відповідно.
Ізі

Питання / інформація, пов’язана із записом на StackOverflow: Увімкнути програмне забезпечення спільного доступу до Інтернету
Ƭᴇcʜιᴇ007

Компонент без Microsoft-Windows-SharedAccessнагляду за програмою Windows настільки близький, але він працює лише у програмі установки Windows! technet.microsoft.com/en-us/library/ff715511.aspx
Jacob Krall

Відповіді:


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 :

Ви повинні ввімкнути загальнодоступний інтерфейс на адаптері, до якого ви підключаєтесь, і дозволити спільний доступ до приватного інтерфейсу для адаптера, який ви хочете використовувати в мережі.


1
О, я не знав, що ти можеш зробити COM-взаємодію з PowerShell! Я припускаю, що вам потрібно трохи [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)посипати.
Jacob Krall

Цей заклик EnableSharingкидає цей виняток, навіть якщо я запускаю PowerShell як адміністратор: Виняток: Виняток викликає "EnableSharing" з аргументом "1": "Подія не змогла викликати жодного з підписників (Виняток з HRESULT: 0x80040201) "-> Виняток було викинуто ціллю виклику. -> Подія не змогла викликати жодного з підписників (Виняток з HRESULT: 0x80040201)
Jacob Krall

Спробуйте запустити regsvr32 hnetcfg.dllадміністратора вручну.
utapyngo

Цікаво: що означає "включення загальнодоступного інтерфейсу на адаптері"?
Якоб Кралл

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.

Використання потужності

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

    Імпорт-модуль IcsManager.dll

  2. Список мережевих підключень:

    Get-NetworkConnections

  3. Запустити спільний доступ до Інтернет:

    Увімкнути-ICS "Підключення до спільного доступу" "Домашнє з'єднання"

  4. Зупинити спільний доступ до інтернет-з'єднання:

    Відключити-ICS


Відмова: Я ще не перевіряв інструмент. Використовуйте його на свій страх і ризик. Не соромтеся відкривати випуск у GitHub, якщо щось не працює. Запрошення про виклик також вітаються.


Акуратний. Для цього використовується зовнішній двійковий файл, який називається NETCONLib; звідки воно взялося? Що це робить?
Джейкоб Кралл

Ага. Це обгортка класу COM для бібліотеки типів NetCon 1.0, що входить до Windows.
Джейкоб Кралл

@JacobKrall, так, він знаходиться за адресою C:\Windows\System32\hnetcfg.dll.
utapyngo

Це виглядає так, що це зробить саме те, що я хочу - спробую це.
Джейкоб Кралл

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

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

Перезавантажте, перш ніж щось спробувати.


1
Чи законно копіювати файли з XP, якщо у мене немає ліцензії на XP?
utapyngo

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-розрядних. Що стосується законності пересадження долів, на які ви маєте право в обох ОС, то це незрозуміло. Ви не маєте права змінювати файли Windows, але копіювання їх, можливо, не виключається в ліцензії на XP (це б здивувало мене, що Microsoft міг би передбачити це заздалегідь).
harrymc

1
У відповіді слід зазначити, що він не працює для 64-розрядних Windows. Зауважте також, що файли слід скопіювати з 32-розрядного XP.
utapyngo

@utapyngo: Не можна бути впевненим, що насправді немає можливості зробити цю роботу на 64-розрядному. Згідно з моїми дослідженнями, проблема полягає в тому, що потрібно скопіювати більше dll, ніж ці два, але повністю проаналізувати проблему потрібно більше часу, ніж я можу дати.
harrymc

2

Колишній мій колега раніше це робив через власну інструментальну мережу Windows. Оскільки я ніколи цього не робив сам, я можу особисто порадити вам ознайомитися з документацією на мікрософт .

Наскільки я пам’ятаю, це було досить безладно і безліч дзвінків у мережі, куди потрібно було це зробити, але в кінцевому підсумку це спрацювало ...


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

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 до ноутбука, який передає підключення до віртуального адаптера. Це може спрацювати так само, якщо ви намагаєтеся поділитися джерелом бездротового з'єднання.


Ласкаво просимо до Супер Користувача! Дякую за детальну відповідь, я відредагував ваше запитання, щоб упорядкувати частину тексту та помістити вміст файлу вашої команди в блок коду. Ви можете побачити інші вказівки щодо форматування, якщо є якісь проблеми з цим - перевірте, чи я не змінив значення коду.
bertieb

Так, це добре і дякую. Я знав, що я мав би зробити кращу роботу над форматуванням. Приємний дотик до посилання MS, щоб запобігти необхідності насправді їхати туди.
користувач2562950

Не хвилюйтеся з цього приводу, ви підберете синтаксис розмітки досить швидко :) Включення вмісту посилання є частиною політики щодо відповіді на запитання - посилання можуть старіти, змінитися або зникнути. У випадку Microsoft це менш вірогідно, але все-таки дуже можливо. Доброю практикою є все необхідне для рішення у саму відповідь. З нетерпінням чекаю на вас більше хороших відповідей!
bertieb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.