Wie aktiviere ich die gemeinsame Nutzung der Internetverbindung über die Befehlszeile?

35

Ich kann dies manuell tun, indem Sie mit der rechten Maustaste auf eine Netzwerkverbindung klicken, die Registerkarte "Freigabe" öffnen und das Kontrollkästchen "Anderen Netzwerkbenutzern erlauben, über die Internetverbindung dieses Computers eine Verbindung herzustellen" aktivieren.

Jetzt muss ich diese Aufgabe automatisieren. Gibt es ein Befehlszeilentool oder ein Powershell-Cmdlet, um dies zu erreichen?

utapyngo
quelle
4
Dies kann momentan nicht versucht werden, aber möglicherweise möchten Sie Process Monitor ausführen und auf Ihre Registrierung verweisen. Sehen Sie, welche Schlüssel / Werte sich ändern, wenn Sie die Einstellung umschalten und anwenden, und schreiben Sie dann Ihr Skript entsprechend.
Iszi
Zugehörige Fragen / Informationen zu StackOverflow:
Aktivieren Sie die gemeinsame Nutzung der
Die Microsoft-Windows-SharedAccessunbeaufsichtigte Windows Setup-Komponente ist so nah, dass sie nur bei Windows Setup funktioniert! technet.microsoft.com/en-us/library/ff715511.aspx
Jacob Krall

Antworten:

20

Hier ist eine reine PowerShell-Lösung (sollte mit Administratorrechten ausgeführt werden):

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

Siehe auch diese Frage unter social.msdn.microsoft.com :

Sie müssen die öffentliche Schnittstelle auf dem Adapter aktivieren, mit dem Sie eine Verbindung herstellen, und die Freigabe auf der privaten Schnittstelle für den Adapter aktivieren, den Sie für das Netzwerk verwenden möchten.

utapyngo
quelle
1
Oh, ich wusste nicht, dass Sie mit PowerShell COM-Interop durchführen können! Ich nehme an, du brauchst etwas [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)Eingestreutes.
Jacob Krall
Der Aufruf von EnableSharinglöst diese Ausnahme aus, obwohl ich PowerShell als Administrator ausführe: Ausnahme: Ausnahme beim Aufrufen von "EnableSharing" mit "1" -Argumenten: "Ein Ereignis konnte keinen der Abonnenten aufrufen (Ausnahme von HRESULT: 0x80040201) "-> Das Ziel eines Aufrufs hat eine Ausnahme ausgelöst. -> Ein Ereignis konnte keinen der Abonnenten aufrufen (Ausnahme von HRESULT: 0x80040201)
Jacob Krall,
Versuchen Sie, regsvr32 hnetcfg.dllmanuell als Administrator zu arbeiten.
Utapyngo
Ich frage mich: Was bedeutet "die öffentliche Schnittstelle auf dem Adapter aktivieren"?
Jacob Krall
2
In neueren Versionen von Powershell ist .SharingType jetzt .SharingConnectionType
Baodad
9

Ich habe dafür ein einfaches Kommandozeilen-Tool erstellt .

  1. Herunterladen und entpacken odergit clone [email protected]:utapyngo/icsmanager.git

  2. Bauen durch Laufen build.cmd

  3. Registrieren Sie die HNetCfgCOM-Bibliothek: regsvr32 hnetcfg.dll(Dies ist eine Standardbibliothek unter %WINDIR%\System32)

Befehlszeilenverwendung

  1. Öffnen Sie die Eingabeaufforderung als Administrator

    cdin das icsmanagerVerzeichnis (oder icsmanager-masterwenn Sie zip heruntergeladen haben).

  2. Art icsmanager

    Dies sollte die verfügbaren Netzwerkverbindungen anzeigen. Beachten Sie das GUID-Attribut. Um dieses Tool zu verwenden, müssen Sie mindestens zwei Verbindungen haben.

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

    Dies sollte ICS aktivieren.

PowerShell Nutzung

  1. Modul importieren:

    Import-Modul IcsManager.dll

  2. Netzwerkverbindungen auflisten:

    Get-NetworkConnections

  3. Starten Sie die gemeinsame Nutzung der Internetverbindung:

    Enable-ICS "Verbindung zur Freigabe" "Heimverbindung"

  4. Beenden Sie die gemeinsame Nutzung der Internetverbindung:

    Disable-ICS


Haftungsausschluss: Ich habe das Tool noch nicht getestet. Benutzung auf eigenes Risiko. Fühlen Sie sich frei, ein Problem bei GitHub zu eröffnen, wenn etwas nicht funktioniert. Pull-Anfragen sind ebenfalls willkommen.

utapyngo
quelle
Ordentlich. Dies verwendet eine externe Binärdatei namens NETCONLib; wo ist es hergekommen? Was tut es?
Jacob Krall
Aha. Dies ist ein COM-Klassenwrapper für die in Windows enthaltene "NetCon 1.0-Typbibliothek".
Jacob Krall
@JacobKrall, ja, es liegt bei C:\Windows\System32\hnetcfg.dll.
Utapyngo
Das sieht so aus, als würde es genau das tun, was ich will - ich werde es ausprobieren.
Jacob Krall
1
Entschuldigung, ich habe es vor einigen Monaten getan und habe vergessen, dass HNetCfg manuell mit registriert werden sollte regsvr32 hnetcfg.dll. Und ich habe hnetcfg.dllunter msdn.microsoft.com/en-us/library/windows/desktop/…
utapyngo
5

Nach meinem Verständnis wurde die Routing-Funktion von Windows seit Vista entfernt und ist jetzt nur in Windows Server verfügbar.

Der folgende Trick kann im Internet gefunden werden, um es wieder zu aktivieren netsh routing, den Sie auf eigenes Risiko ausprobieren können. Ich empfehle zunächst die üblichen Vorsichtsmaßnahmen, einschließlich der Erstellung eines Systemwiederherstellungspunkts.

  1. Holen Sie sich IPMONTR.DLL und IPPROMON.DLL von 2003 oder von XP
  2. Kopieren Sie sie nach WINDOWS \ SYSTEM32
  3. In der Eingabeaufforderung (cmd) als Administrator ausführen:

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

Möglicherweise müssen Sie auch den Routing- und RAS-Dienst auf Automatischer Start einstellen.

Starten Sie den Computer neu, bevor Sie etwas ausprobieren.

Harrymc
quelle
1
Ist es legal, Dateien von XP zu kopieren, wenn ich keine XP-Lizenz habe?
Utapyngo
1
Versuchte dies auf Windows 7 64bit. Kopierte die Dateien von XP 64-Bit. Als Administrator ausführen. Fehler:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo
1
Ich habe es auch mit dem "Add-Helfer" versucht und es tut mir leid zu bestätigen, dass es für 64-Bit nicht funktioniert. In Bezug auf die Rechtmäßigkeit der Übertragung von DLLs, auf die Sie auf beiden Betriebssystemen zugreifen können, ist dies unklar. Sie haben nicht das Recht, Windows-Dateien zu ändern, aber das Kopieren ist in der XP-Lizenz möglicherweise nicht verboten (es würde mich wundern, wenn Microsoft dies im Voraus vorausgesehen hätte).
Harrymc
1
In der Antwort sollte erwähnt werden, dass es für 64-Bit-Windows nicht funktioniert. Bitte erwähnen Sie auch, dass die Dateien von XP 32-Bit kopiert werden sollen.
Utapyngo
@utapyngo: Man kann nicht sicher sein, dass es wirklich keine Möglichkeit gibt, diese Funktion für 64-Bit zu nutzen. Laut meinen Studien ist das Problem, dass mehr DLLs als diese beiden kopiert werden sollten, aber die vollständige Analyse des Problems erfordert mehr Zeit, als ich geben kann.
Harrymc
2

Ein ehemaliger Kollege von mir hat dies über das Windows-eigene Tool netsh gemacht. Da ich das noch nie selbst gemacht habe, kann ich Ihnen raten, sich die Microsoft Netsh-Dokumentation anzusehen .

Wie ich mich erinnern kann, war es ziemlich schade und es wurden viele Netsh-Anrufe benötigt, aber es hat am Ende funktioniert ...

Langhard
quelle
6
netsh routingIn Windows XP war dies möglich, aber in Windows 7 wurde dieser Befehl entfernt. Deshalb
frage
2

Folgendes sollte funktionieren

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
quelle
8
netsh routingIn Windows XP war dies möglich, aber in Windows 7 wurde dieser Befehl entfernt. Deshalb
frage
1

Leider gibt es keinen solchen cmd-Befehl für Windows 7 oder höher. Daher habe ich diese Visual Basic-Funktion verwendet, um dies zu erreichen:

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

Bitte beachten Sie, dass "" "erforderlich ist. Habe Spaß.

Imad Riegel
quelle
1

Basierend auf dem, was ich gelesen habe, netshist es falsch , wenn diejenigen, die das Gesagte gepostet haben, ab 7 nicht mehr funktionieren. Wenn es sich streng genommen um " netsh routing" handelt, haben Sie wahrscheinlich Recht, aber das funktioniert - ich werde den Inhalt einer Batch-Datei anzeigen, die ich mit Windows 8.1 erstellt habe. Anstatt die üblichen Kommentare und Informationen zu erhalten, werde ich versuchen, denen mit den vollständigen Informationen zu helfen.

Zunächst müssen Sie sicherstellen, dass die Verbindung, die Sie freigeben möchten, so eingestellt ist, dass sie die Verbindung tatsächlich freigibt. Dieser Link hier soll Sie dazu bringen:

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

  1. Öffnen Sie Netzwerkverbindungen, indem Sie auf die Schaltfläche Start Schaltfläche "Start" und anschließend auf Systemsteuerung klicken. Geben Sie im Suchfeld Adapter ein, und klicken Sie dann unter Netzwerk- und Freigabecenter auf Netzwerkverbindungen anzeigen.

  2. Klicken Sie mit der rechten Maustaste auf die Verbindung, die Sie freigeben möchten, und klicken Sie dann auf Eigenschaften. Administratorberechtigung erforderlich Wenn Sie zur Eingabe eines Administratorkennworts oder einer Bestätigung aufgefordert werden, geben Sie das Kennwort ein oder geben Sie eine Bestätigung ein.

  3. Klicken Sie auf die Registerkarte Freigabe, und aktivieren Sie das Kontrollkästchen Anderen Netzwerkbenutzern erlauben, über die Internetverbindung dieses Computers eine Verbindung herzustellen.

Nachdem Sie die obigen Schritte ausgeführt haben, um ICS auf dem Hostcomputer einzurichten, nehmen Sie die folgenden Änderungen auf allen anderen Computern vor (jedoch nicht auf dem Hostcomputer).

  1. Öffnen Sie die Internetoptionen, indem Sie auf die Schaltfläche Start Schaltfläche "Start" klicken, auf Systemsteuerung klicken, auf Netzwerk und Internet klicken und dann auf Internetoptionen klicken.

  2. Klicken Sie auf die Registerkarte Verbindungen, und klicken Sie dann auf Keine Verbindung wählen.

  3. Klicken Sie auf LAN-Einstellungen.

  4. Deaktivieren Sie im Dialogfeld Einstellungen für lokales Netzwerk (LAN) unter Automatische Konfiguration die Kontrollkästchen Einstellungen automatisch erkennen und Automatisches Konfigurationsskript verwenden.

  5. Deaktivieren Sie unter Proxyserver das Kontrollkästchen Proxyserver für Ihr LAN verwenden, und klicken Sie dann auf OK.

Meines Wissens sollte dies für Windows 7 und 8 funktionieren.

Da es sich bei dem Thema um eine Befehlszeilenlösung handelte, ist dies der Inhalt der Batchdatei, mit der ich einen virtuellen WLAN-Adapter konfiguriert und einsatzbereit mache.

Nach der Erstellung müssen Sie möglicherweise die obigen Anweisungen befolgen und sicherstellen, dass Sie die Quellverbindung für den neu erstellten virtuellen Adapter freigeben, der von Ihren drahtlosen Geräten erkannt wird.

BAT-Datei für die gemeinsame Nutzung von Verbindungen:

@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

Gerne beantworte ich Fragen dazu, denn es wird einige einzigartige Situationen geben, und ich würde gerne helfen, da ich zusammensetzen musste, was ich oben gefunden habe.

Um dies zu verdeutlichen, funktioniert dies unter Windows 8.1 unter Verwendung einer Ethernet-Verbindung zu einem Laptop, der seine Verbindung zum virtuellen Adapter teilt. Dies funktioniert möglicherweise auch, wenn Sie versuchen, eine drahtlose Quellverbindung freizugeben.

user2562950
quelle
Willkommen bei Super User! Vielen Dank für die ausführliche Antwort, ich habe Ihre Frage bearbeitet, um einen Teil des Textes zu optimieren und den Inhalt Ihrer Bat-Datei in einen Codeblock zu setzen. Sie können andere Formatierungsanweisungen anzeigen, wenn Probleme damit auftreten. Überprüfen Sie, ob ich die Bedeutung des Codes geändert habe.
Bertieb
Ja, das ist in Ordnung und danke. Ich wusste, dass ich die Formatierung besser hätte machen sollen. Eine nette Berührung des MS-Links, um zu verhindern, dass Sie tatsächlich dorthin müssen.
user2562950
Mach dir keine Sorgen, du wirst die Markdown-Syntax schnell genug erlernen :) Die Einbeziehung des Link-Inhalts ist Teil einer Richtlinie zur Beantwortung von Fragen - Links können veraltet sein, sich ändern oder verschwinden. Dies ist bei Microsoft weniger wahrscheinlich, aber dennoch sehr gut möglich. Es ist eine gute Praxis, alles Notwendige für eine Lösung in die Antwort selbst zu schreiben. Freuen Sie sich auf weitere gute Antworten von Ihnen!
Bertieb