Come abilitare la Condivisione connessione Internet usando la riga di comando?


35

Posso farlo manualmente facendo clic con il pulsante destro del mouse su una connessione di rete, aprendo la scheda Condivisione e facendo clic sulla casella di controllo "Consenti ad altri utenti della rete di connettersi tramite la connessione Internet di questo computer".

Ora devo automatizzare questo compito. Esiste uno strumento da riga di comando o un cmdlet Powershell per ottenere questo risultato?


4
Non puoi provarlo adesso, ma potresti provare a eseguire Process Monitor e puntarlo sul tuo registro. Scopri quali chiavi / valori cambiano quando attivi o disattiva l'impostazione, quindi scrivi lo script di conseguenza.
Iszi,

Domanda / informazioni correlate su StackOverflow: abilita la condivisione della connessione Internet a livello di
codice

Il Microsoft-Windows-SharedAccesscomponente Installazione automatica di Windows è così vicino, ma funziona solo con Installazione di Windows! technet.microsoft.com/en-us/library/ff715511.aspx
Jacob Krall

Risposte:


20

Ecco una soluzione PowerShell pura (dovrebbe essere eseguita con privilegi di amministratore):

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

Vedi anche questa domanda su social.msdn.microsoft.com :

È necessario abilitare l'interfaccia pubblica sull'adattatore a cui ci si sta connettendo e abilitare la condivisione sull'interfaccia privata per l'adattatore che si desidera poter utilizzare per la rete.


1
Ooh, non sapevo che potresti fare l'interoperabilità COM con PowerShell! Presumo che tu abbia bisogno di un po 'di [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)spolverato.
Jacob Krall

La chiamata a EnableSharingsta generando questa eccezione, anche se eseguo PowerShell come amministratore: eccezione: eccezione che chiama "EnableSharing" con argomenti "1": "Un evento non è stato in grado di invocare nessuno degli abbonati (eccezione di HRESULT: 0x80040201) "-> È stata generata un'eccezione dalla destinazione di una chiamata. -> Un evento non è stato in grado di invocare nessuno degli abbonati (eccezione di HRESULT: 0x80040201)
Jacob Krall

Prova a eseguire regsvr32 hnetcfg.dllmanualmente come amministratore.
utapyngo,

Mi chiedo: cosa significa "abilitare l'interfaccia pubblica sull'adattatore"?
Jacob Krall

2
Nelle versioni più recenti di Powershell, .SharingType è ora .SharingConnectionType
Baodad,

9

Per questo ho creato un semplice strumento da riga di comando .

  1. Scarica e decomprimi ogit clone git@github.com:utapyngo/icsmanager.git

  2. Costruisci correndo build.cmd

  3. Registrare la HNetCfglibreria COM:regsvr32 hnetcfg.dll (è una libreria standard situata in %WINDIR%\System32)

Utilizzo della riga di comando

  1. Aprire il prompt della riga di comando come amministratore

    cdalla icsmanagerdirectory (oicsmanager-master se hai scaricato zip).

  2. genere icsmanager

    Questo dovrebbe visualizzare le connessioni di rete disponibili. Notare l'attributo GUID. Per utilizzare questo strumento è necessario disporre di almeno due connessioni.

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

    Ciò dovrebbe abilitare ICS.

Utilizzo di Powershell

  1. Modulo di importazione:

    Modulo di importazione IcsManager.dll

  2. Elenca connessioni di rete:

    Get-NetworkConnections

  3. Inizia la condivisione della connessione Internet:

    Enable-ICS "Connessione per condividere" "Connessione domestica"

  4. Interrompere la condivisione della connessione Internet:

    Disable-ICS


Disclaimer: non ho ancora testato lo strumento. Usalo a tuo rischio e pericolo. Sentiti libero di aprire un problema su GitHub se qualcosa non funziona. Anche le richieste pull sono benvenute.


Neat. Questo utilizza un binario esterno chiamato NETCONLib; Da dove proviene? Che cosa fa?
Jacob Krall,

Aha. Questo è un wrapper di classe COM per la "Libreria dei tipi NetCon 1.0" inclusa in Windows.
Jacob Krall,

@JacobKrall, sì, si trova in C:\Windows\System32\hnetcfg.dll.
utapyngo,

Sembra che farà esattamente quello che voglio - lo proverò.
Jacob Krall,

1
Siamo spiacenti, l'ho fatto diversi mesi fa e ho dimenticato che HNetCfg deve essere registrato manualmente regsvr32 hnetcfg.dll. E ho imparato a conoscere hnetcfg.dlla msdn.microsoft.com/en-us/library/windows/desktop/...
utapyngo

5

Da quanto ho capito, la funzionalità di routing è stata rimossa da Windows da Vista ed è disponibile solo ora in Windows Server.

Il seguente trucco può essere trovato su Internet per riattivare netsh routing, che puoi provare a tuo rischio e pericolo. Suggerisco innanzitutto le consuete precauzioni, inclusa la creazione di un punto di ripristino del sistema.

  1. Ottieni IPMONTR.DLL e IPPROMON.DLL dal 2003 o da XP
  2. Copiarli in WINDOWS \ SYSTEM32
  3. Esegui nel prompt dei comandi (cmd) come amministratore:

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

Potrebbe inoltre essere necessario impostare il servizio Routing e Accesso remoto su Avvio automatico.

Riavvia prima di provare qualsiasi cosa.


1
È legale copiare file da XP se non ho la licenza XP?
utapyngo,

1
Ho provato questo su Windows 7 a 64 bit. Copiato i file da XP 64 bit. In esecuzione come amministratore. Errori:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo

1
Ho provato anche "aggiungi helper" e mi dispiace confermare che non funziona per 64-bit. Per quanto riguarda la legalità del trapianto di dll a cui hai diritto su entrambi i sistemi operativi, questo non è chiaro. Non hai il diritto di modificare i file di Windows, ma la loro copia potrebbe non essere esclusa dalla licenza XP (mi stupirebbe che Microsoft avrebbe potuto prevederlo in anticipo).
harrymc

1
Dovrebbe essere menzionato nella risposta che non funziona per Windows a 64 bit. Si noti inoltre che i file devono essere copiati da XP a 32 bit.
utapyngo,

@utapyngo: non si può essere certi che non ci sia davvero alcun modo per farlo funzionare a 64 bit. Secondo i miei studi, il problema è che dovrebbero essere copiate più DLL di queste due, ma l'analisi completa del problema richiede più tempo di quello che posso dare.
harrymc

2

Un mio ex collega era solito farlo tramite il proprio strumento di Windows netsh. Dato che non l'ho mai fatto da solo, posso consigliarti personalmente di dare un'occhiata alla documentazione di Microsoft Netsh .

Come posso ricordare, era praticamente un peccato e molte chiamate netsh dove necessario per farlo, ma alla fine ha funzionato ...


6
Era possibile farlo con netsh routingWindows XP ma in Windows 7 hanno rimosso quel comando. Ecco perché sto solo chiedendo di Windows 7.
utapyngo,

2

Quanto segue dovrebbe funzionare

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
Era possibile farlo con netsh routingWindows XP ma in Windows 7 hanno rimosso quel comando. Ecco perché sto solo chiedendo di Windows 7.
utapyngo

1

Sfortunatamente non esiste un comando cmd di questo tipo per Windows 7 o più, quindi ho usato questa funzione di Visual Basic per farlo:

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

Si noti che "" "" è obbligatorio. Divertiti.


1

Sulla base di quello che ho letto, se quelli che hanno pubblicato hanno detto netshche non funziona a partire da 7 e fino, che non è corretto. Ora se si tratta strettamente di "netsh routing ", suppongo che potresti avere ragione, ma questo funziona, sto per mostrare il contenuto di un file batch che ho creato che funziona su Windows 8.1. Invece di ottenere i soliti commenti e informazioni, cercherò di aiutare quelli con le informazioni complete.

Innanzitutto, devi assicurarti che la connessione che condividerai sia impostata per condividere effettivamente la connessione. Questo link qui dovrebbe farti andare per quello:

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

  1. Aprire Connessioni di rete facendo clic sul pulsante Start Immagine del pulsante Start, quindi su Pannello di controllo. Nella casella di ricerca digitare adattatore e quindi, in Centro connessioni di rete e condivisione, fare clic su Visualizza connessioni di rete.

  2. Fare clic con il pulsante destro del mouse sulla connessione che si desidera condividere, quindi fare clic su Proprietà. È richiesta l'autorizzazione dell'amministratore Se viene richiesta una password dell'amministratore o una conferma, digitare la password o fornire la conferma.

  3. Fare clic sulla scheda Condivisione, quindi selezionare la casella di controllo Consenti ad altri utenti della rete di connettersi tramite la connessione Internet del computer.

Dopo aver seguito i passaggi precedenti per configurare ICS sul computer host, apportare le seguenti modifiche su tutti gli altri computer (ma non sul computer host).

  1. Apri Opzioni Internet facendo clic sul pulsante Start Immagine del pulsante Start, facendo clic su Pannello di controllo, facendo clic su Rete e Internet, quindi su Opzioni Internet.

  2. Fare clic sulla scheda connessioni e quindi fare clic su Non comporre mai una connessione.

  3. Fai clic su Impostazioni LAN.

  4. Nella finestra di dialogo Impostazioni rete locale (LAN), in Configurazione automatica, deselezionare le caselle di controllo Rileva automaticamente impostazioni e Usa script di configurazione automatica.

  5. In Server proxy, deselezionare la casella di controllo Utilizza un server proxy per la LAN e quindi fare clic su OK.

Per quanto ne so, penso che questo dovrebbe funzionare sia per Windows 7 che per 8.

Ora poiché l'argomento riguardava una soluzione a riga di comando, questo è il contenuto del file batch di come ottengo un adattatore wireless virtuale configurato e pronto per l'uso.

Una volta creato, potrebbe essere necessario utilizzare le istruzioni sopra e assicurarsi di condividere la connessione di origine con l'adattatore virtuale appena creato che verrà visualizzato dai dispositivi wireless.

Condivisione connessione file .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

Sarò più che felice di rispondere a domande su questo perché ci saranno alcune situazioni uniche e mi piacerebbe aiutarti dato che ho dovuto mettere insieme quello che ho trovato sopra.

Ma per portarlo in prospettiva, funziona su Windows 8.1 usando una connessione Ethernet in un laptop che condivide la sua connessione all'adattatore virtuale. Potrebbe funzionare altrettanto bene se stai cercando di condividere una connessione wireless di origine.


Benvenuto in Super User! Grazie per la risposta dettagliata, ho modificato la tua domanda per semplificare parte del testo e mettere i contenuti del tuo file bat in un blocco di codice. Puoi vedere altre istruzioni di formattazione se ci sono problemi con esso. Controlla che non abbia modificato il significato del codice.
bertieb,

Sì va bene e grazie. Sapevo che avrei dovuto fare un lavoro migliore sulla formattazione. Bel tocco sul collegamento MS per evitare di dover effettivamente andare lì.
user2562950

Non preoccuparti, raccoglierai la sintassi del markdown abbastanza rapidamente :) Includere il contenuto del link fa parte di una politica qui per rispondere alle domande : i link possono diventare stantii, cambiare o scomparire. Questo è meno probabile nel caso di Microsoft, ma è ancora molto possibile. È buona norma inserire nella risposta stessa tutto il necessario per una soluzione. Non vedo l'ora di vedere altre tue buone risposte!
bertieb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.