Jak włączyć Udostępnianie połączenia internetowego za pomocą wiersza polecenia?

35

Mogę to zrobić ręcznie, klikając prawym przyciskiem myszy połączenie sieciowe, otwierając kartę Udostępnianie i klikając pole wyboru „Zezwalaj innym użytkownikom sieci na łączenie się za pośrednictwem połączenia internetowego tego komputera”.

Teraz muszę zautomatyzować to zadanie. Czy istnieje narzędzie wiersza polecenia lub polecenie cmdlet programu Powershell, aby to osiągnąć?

utapyngo
źródło
4
Nie możesz tego teraz wypróbować, ale możesz spróbować uruchomić Process Monitor i skierować go do rejestru. Sprawdź, jakie klucze / wartości zmieniają się po przełączeniu i zastosowaniu ustawienia, a następnie odpowiednio napisz skrypt.
Iszi
Powiązane pytanie / informacje na temat StackOverflow: Włącz programowe udostępnianie połączenia internetowego
ᴇcʜιᴇ007
Składnik Microsoft-Windows-SharedAccessnienadzorowanej instalacji systemu Windows jest tak blisko, ale działa tylko w instalacji systemu Windows! technet.microsoft.com/en-us/library/ff715511.aspx
Jacob Krall

Odpowiedzi:

20

Oto czyste rozwiązanie PowerShell (powinno być uruchamiane z uprawnieniami administracyjnymi):

# 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()

Zobacz także to pytanie na social.msdn.microsoft.com :

Musisz włączyć publiczny interfejs adaptera, z którym się łączysz, i włączyć udostępnianie w interfejsie prywatnym adaptera, którego chcesz używać w sieci.

utapyngo
źródło
1
Ooh, nie wiedziałem, że możesz zrobić interakcja COM z PowerShell! Zakładam, że potrzebujesz odrobiny [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...).
Jacob Krall,
Wywołanie EnableSharingto generuje ten wyjątek, mimo że korzystam z programu PowerShell jako Administrator: Wyjątek: wyjątek wywołujący „EnableSharing” z argumentami „1”: „Zdarzenie nie mogło wywołać żadnego z subskrybentów (Wyjątek od HRESULT: 0x80040201) „-> Zgłoszony został wyjątek przez cel wywołania. -> Wydarzenie nie mogło wywołać żadnego z subskrybentów (wyjątek od HRESULT: 0x80040201)
Jacob Krall
Spróbuj uruchomić regsvr32 hnetcfg.dlljako administrator ręcznie.
utapyngo 24.09.2013
Zastanawiam się: co oznacza „Włącz interfejs publiczny na adapterze”?
Jacob Krall,
2
W nowszych wersjach Powershell, .SharingType jest teraz
.SharingConnectionType
9

Stworzyłem do tego proste narzędzie wiersza poleceń .

  1. Pobierz i rozpakuj lubgit clone [email protected]:utapyngo/icsmanager.git

  2. Buduj, uruchamiając build.cmd

  3. Zarejestruj HNetCfgbibliotekę COM: regsvr32 hnetcfg.dll(jest to standardowa biblioteka znajdująca się pod %WINDIR%\System32)

Wykorzystanie wiersza polecenia

  1. Otwórz wiersz polecenia jako administrator

    cddo icsmanagerkatalogu (lub icsmanager-masterjeśli pobrałeś zip).

  2. Rodzaj icsmanager

    Powinno to wyświetlić dostępne połączenia sieciowe. Zwróć uwagę na atrybut GUID. Aby korzystać z tego narzędzia, musisz mieć co najmniej dwa połączenia.

  3. Rodzaj icsmanager enable {GUID-OF-CONNECTION-TO-SHARE} {GUID-OF-HOME-CONNECTION}

    To powinno włączyć ICS.

Wykorzystanie PowerShell

  1. Moduł importu:

    Moduł importu IcsManager.dll

  2. Lista połączeń sieciowych:

    Get-NetworkConnections

  3. Rozpocznij udostępnianie połączenia internetowego:

    Włącz-ICS „Połączenie, aby udostępnić” „Połączenie domowe”

  4. Zatrzymaj udostępnianie połączenia internetowego:

    Wyłącz-ICS


Oświadczenie: Nie przetestowałem jeszcze tego narzędzia. Używaj go na własne ryzyko. Jeśli coś nie działa, możesz otworzyć problem w GitHub. Żądania ściągania są również mile widziane.

utapyngo
źródło
Schludny. Używa zewnętrznego pliku binarnego o nazwie NETCONLib; Skąd to się wzieło? Co to robi?
Jacob Krall,
Aha. Jest to opakowanie klasy COM dla „biblioteki typów NetCon 1.0” zawartej w systemie Windows.
Jacob Krall,
@JacobKrall, tak, znajduje się na C:\Windows\System32\hnetcfg.dll.
utapyngo
Wygląda na to, że zrobi dokładnie to, co chcę - wypróbuję to.
Jacob Krall,
1
Przepraszam, zrobiłem to kilka miesięcy temu i zapomniałem, że HNetCfg powinien zostać zarejestrowany ręcznie regsvr32 hnetcfg.dll. I dowiedziałem się o tym hnetcfg.dllpod adresem msdn.microsoft.com/en-us/library/windows/desktop/…
utapyngo 24.09.2013
5

Według mojego zrozumienia, możliwość routingu została usunięta z systemu Windows od czasu Vista i jest dostępna tylko teraz w systemie Windows Server.

Poniższą sztuczkę można znaleźć w Internecie, aby ponownie włączyć netsh routing, którą możesz wypróbować na własne ryzyko. Najpierw sugeruję typowe środki ostrożności, w tym utworzenie punktu przywracania systemu.

  1. Pobierz IPMONTR.DLL i IPPROMON.DLL z 2003 roku lub z XP
  2. Skopiuj je do WINDOWS \ SYSTEM32
  3. Uruchom w wierszu polecenia (cmd) jako administrator:

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

Może być również konieczne ustawienie usługi routingu i dostępu zdalnego na automatyczne uruchamianie.

Uruchom ponownie przed wypróbowaniem czegokolwiek.

harrymc
źródło
1
Czy kopiowanie plików z XP jest legalne, jeśli nie mam licencji XP?
utapyngo 24.09.2013
1
Próbowałem tego na Windows 7 64bit. Skopiowano pliki z XP w wersji 64-bitowej. Działa jako administrator. Błędy:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo 24.09.2013
1
Próbowałem też „dodać pomocnika” i przykro mi, że nie działa w wersji 64-bitowej. Jeśli chodzi o zgodność z prawem przeszczepiania bibliotek DLL, do których masz prawo w obu systemach operacyjnych, nie jest to jasne. Nie masz prawa modyfikować plików Windows, ale kopiowanie ich może nie jest wykluczone w licencji XP (dziwi mnie, że Microsoft mógł to przewidzieć z góry).
harrymc
1
W odpowiedzi należy wspomnieć, że nie działa w 64-bitowym systemie Windows. Proszę również wspomnieć, że pliki należy skopiować z 32-bitowego systemu XP.
utapyngo,
@utapyngo: Nie można mieć pewności, że tak naprawdę nie ma sposobu, aby to działało na 64-bitach. Według moich badań problem polega na tym, że należy skopiować więcej bibliotek DLL niż te dwa, ale pełna analiza problemu wymaga więcej czasu, niż mogę dać.
harrymc
2

Mój były kolega robił to za pośrednictwem własnego narzędzia Windows Netsh. Ponieważ sam tego nigdy nie robiłem, mogę doradzić, abyś zapoznał się z dokumentacją netsh firmy Microsoft .

Jak pamiętam, było to raczej żałosne i wiele netshowych połączeń tam, gdzie trzeba było to zrobić, ale w końcu zadziałało ...

Langhard
źródło
6
Można było to zrobić netsh routingw Windows XP, ale w Windows 7 usunęli to polecenie. Dlatego pytam tylko o Windows 7.
utapyngo
2

Następujące powinny działać

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
źródło
8
Można było to zrobić netsh routingw Windows XP, ale w Windows 7 usunęli to polecenie. Dlatego pytam tylko o Windows 7.
utapyngo
1

Niestety nie ma takiego polecenia cmd dla systemu Windows 7 lub nowszego, więc skorzystałem z tej funkcji języka Visual Basic, aby to zrobić:

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

Pamiętaj, że „” „” jest wymagane. Baw się dobrze.

zatrzask imad
źródło
1

Na podstawie tego, co przeczytałem, jeśli te, które napisały, że netshnie działa, zaczynają się od 7 i więcej - to jest nieprawidłowe. Teraz, jeśli chodzi tylko o „ netsh routing”, myślę, że masz rację, ale to działa - zaraz pokażę zawartość pliku wsadowego, który utworzyłem w systemie Windows 8.1. Zamiast otrzymywać zwykłe komentarze i informacje, postaram się pomóc tym z pełnymi informacjami.

Po pierwsze, musisz upewnić się, że połączenie, które będziesz udostępniać, jest ustawione tak, aby współdzielić połączenie. Ten link tutaj powinien Cię zabrać:

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

  1. Otwórz Połączenia sieciowe, klikając przycisk Start Obraz przycisku Start, a następnie Panel sterowania. W polu wyszukiwania wpisz adapter, a następnie w obszarze Centrum sieci i udostępniania kliknij opcję Wyświetl połączenia sieciowe.

  2. Kliknij prawym przyciskiem myszy połączenie, które chcesz udostępnić, a następnie kliknij polecenie Właściwości. Wymagane pozwolenie administratora Jeśli zostanie wyświetlony monit o hasło administratora lub potwierdzenie, wpisz hasło lub potwierdź.

  3. Kliknij kartę Udostępnianie, a następnie zaznacz pole wyboru Zezwalaj innym użytkownikom sieci na łączenie się za pośrednictwem połączenia internetowego tego komputera.

Po wykonaniu powyższych kroków, aby skonfigurować ICS na komputerze hosta, wprowadź następujące zmiany na wszystkich pozostałych komputerach (ale nie na komputerze hosta).

  1. Otwórz Opcje internetowe, klikając przycisk Start Obraz przycisku Start, klikając Panel sterowania, klikając Sieć i Internet, a następnie klikając Opcje internetowe.

  2. Kliknij kartę Połączenia, a następnie kliknij opcję Nigdy nie wybieraj połączenia.

  3. Kliknij Ustawienia LAN.

  4. W oknie dialogowym Ustawienia sieci lokalnej (LAN), w obszarze Konfiguracja automatyczna wyczyść pola wyboru Automatycznie wykryj ustawienia i Użyj skryptu automatycznej konfiguracji.

  5. W obszarze Serwer proxy wyczyść pole wyboru Użyj serwera proxy do sieci LAN, a następnie kliknij przycisk OK.

Według mojej wiedzy uważam, że powinno to działać zarówno w systemie Windows 7, jak i 8.

Ponieważ tematem było rozwiązanie z linii poleceń, jest to zawartość pliku wsadowego, w jaki sposób konfiguruję i jestem gotowy do pracy z wirtualnym adapterem bezprzewodowym.

Po utworzeniu może być konieczne skorzystanie z powyższych instrukcji i upewnienie się, że współdzielisz połączenie źródłowe z nowo utworzonym wirtualnym adapterem, który będzie widoczny dla twoich urządzeń bezprzewodowych.

Plik .bat udostępniania połączenia:

@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

Z przyjemnością odpowiem na pytania na ten temat, ponieważ będą wyjątkowe sytuacje i chciałbym pomóc, ponieważ musiałem poskładać to, co znalazłem powyżej.

Aby jednak spojrzeć na to z perspektywy, działa to w systemie Windows 8.1 za pomocą połączenia Ethernet z laptopem współdzielącym połączenie z wirtualnym adapterem. Może działać równie dobrze, jeśli próbujesz udostępnić źródłowe połączenie bezprzewodowe.

użytkownik2562950
źródło
Witamy w Super User! Dzięki za szczegółową odpowiedź, edytowałem twoje pytanie, aby usprawnić część tekstu i umieścić zawartość pliku nietoperza w bloku kodu. Jeśli występują jakiekolwiek problemy, możesz zobaczyć inne instrukcje formatowania - sprawdź, czy nie zmieniłem znaczenia kodu.
bertieb
Tak, w porządku i dzięki. Wiedziałem, że powinienem był lepiej wykonać formatowanie. Miły akcent na link MS, aby nie musiał tam naprawdę iść.
user2562950,
Nie przejmuj się tym, szybko dostrzeżesz składnię przecen :) Dołączanie treści linków jest częścią zasady udzielania odpowiedzi na pytania - linki mogą się zestarzeć, zmienić lub zniknąć. Jest to mniej prawdopodobne w przypadku Microsoft, ale nadal bardzo możliwe. Dobrą praktyką jest umieszczenie wszystkiego, co niezbędne dla rozwiązania, w samej odpowiedzi. Czekamy na więcej dobrych odpowiedzi od Ciebie!
bertieb