¿Cómo habilitar la conexión compartida a Internet mediante la línea de comandos?

35

Puedo hacerlo manualmente haciendo clic derecho en una conexión de red, abriendo la pestaña Compartir y haciendo clic en la casilla de verificación "Permitir que otros usuarios de la red se conecten a través de la conexión a Internet de esta computadora".

Ahora necesito automatizar esta tarea. ¿Existe una herramienta de línea de comandos o un cmdlet Powershell para lograr esto?

utapyngo
fuente
44
No puedo probar esto por el momento, pero puede intentar ejecutar Process Monitor y apuntarlo a su Registro. Vea qué teclas / valores cambian cuando alterna y aplica la configuración, luego escriba su secuencia de comandos en consecuencia.
Iszi
Pregunta / información relacionada sobre StackOverflow: Habilite la conexión compartida a Internet mediante programación
Ƭᴇcʜιᴇ007
El Microsoft-Windows-SharedAccesscomponente de instalación desatendida de Windows está muy cerca, ¡pero solo funciona en la instalación de Windows! technet.microsoft.com/en-us/library/ff715511.aspx
Jacob Krall

Respuestas:

20

Aquí hay una solución pura de PowerShell (debe ejecutarse con privilegios administrativos):

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

Consulte también esta pregunta en social.msdn.microsoft.com :

Debe habilitar la interfaz pública en el adaptador al que se está conectando y habilitar el uso compartido en la interfaz privada para el adaptador que desea poder usar para la red.

utapyngo
fuente
1
¡Oh, no sabía que podía hacer interoperabilidad COM con PowerShell! Supongo que necesita un poco [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)espolvoreado.
Jacob Krall
La llamada a EnableSharingestá lanzando esta excepción, aunque estoy ejecutando PowerShell como Administrador: Excepción: Excepción llamando a "EnableSharing" con "1" argumento (s): "Un evento no pudo invocar a ninguno de los suscriptores (Excepción de HRESULT: 0x80040201) "-> El destino de una invocación ha lanzado una excepción. -> Un evento no pudo invocar a ninguno de los suscriptores (Excepción de HRESULT: 0x80040201)
Jacob Krall el
Intenta ejecutarlo regsvr32 hnetcfg.dllcomo administrador manualmente.
utapyngo
Me pregunto: ¿qué significa "habilitar la interfaz pública en el adaptador"?
Jacob Krall
2
En las versiones más nuevas de Powershell, .SharingType es ahora .SharingConnectionType
Baodad
9

He creado una herramienta de línea de comando simple para esto.

  1. Descargar y descomprimir ogit clone [email protected]:utapyngo/icsmanager.git

  2. Construir corriendo build.cmd

  3. Registre la HNetCfgbiblioteca COM: regsvr32 hnetcfg.dll(es una biblioteca estándar ubicada en %WINDIR%\System32)

Uso de la línea de comandos

  1. Abra la línea de comandos como administrador

    cdal icsmanagerdirectorio (o icsmanager-mastersi descargaste zip).

  2. Tipo icsmanager

    Esto debería mostrar las conexiones de red disponibles. Observe el atributo GUID. Para utilizar esta herramienta, debe tener al menos dos conexiones.

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

    Esto debería habilitar ICS.

Uso de Powershell

  1. Módulo de importación:

    Import-Module IcsManager.dll

  2. Lista de conexiones de red:

    Get-NetworkConnections

  3. Iniciar conexión compartida a Internet:

    Enable-ICS "Conexión para compartir" "Conexión de inicio"

  4. Detener la conexión compartida a Internet:

    Disable-ICS


Descargo de responsabilidad: aún no probé la herramienta. Úselo bajo su propio riesgo. No dude en abrir un problema en GitHub si algo no funciona. Las solicitudes de extracción también son bienvenidas.

utapyngo
fuente
Ordenado. Esto usa un binario externo llamado NETCONLib; ¿De dónde vino? ¿Qué hace?
Jacob Krall
Ajá. Este es un contenedor de clase COM para la "Biblioteca de tipos NetCon 1.0" incluida con Windows.
Jacob Krall
@JacobKrall, sí, está ubicado en C:\Windows\System32\hnetcfg.dll.
utapyngo
Parece que hará exactamente lo que quiero: lo probaré.
Jacob Krall
1
Lo siento, lo hice hace varios meses y olvidé que HNetCfg debería registrarse manualmente regsvr32 hnetcfg.dll. Y lo aprendí hnetcfg.dllen msdn.microsoft.com/en-us/library/windows/desktop/…
utapyngo
5

Según tengo entendido, la capacidad de enrutamiento se eliminó de Windows desde Vista y ahora solo está disponible en Windows Server.

Puede encontrar el siguiente truco en Internet para volver a habilitarlo netsh routing, que puede probar bajo su propio riesgo. Sugiero primero las precauciones habituales, incluida la creación de un punto de restauración del sistema.

  1. Obtenga IPMONTR.DLL e IPPROMON.DLL desde 2003 o desde XP
  2. Cópielos a WINDOWS \ SYSTEM32
  3. Ejecutar en el símbolo del sistema (cmd) como administrador:

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

Es posible que también deba configurar el Servicio de enrutamiento y acceso remoto en Inicio automático.

Reinicia antes de intentar cualquier cosa.

harrymc
fuente
1
¿Es legal copiar archivos de XP si no tengo licencia de XP?
utapyngo
1
Probé esto en Windows 7 de 64 bits. Copió los archivos de XP 64 bit. Ejecutando como administrador. Errores:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo
1
También probé el "agregar ayudante" y lamento confirmar que no funciona para 64 bits. En cuanto a la legalidad del trasplante de dlls a los que tiene derecho en ambos sistemas operativos, esto no está claro. No tiene derecho a modificar archivos de Windows, pero copiarlos tal vez no se descarte en la licencia de XP (me sorprendería que Microsoft pudiera haber previsto esto de antemano).
harrymc
1
Cabe mencionar en la respuesta que no funciona para Windows de 64 bits. Mencione también que los archivos deben copiarse desde XP de 32 bits.
utapyngo
@utapyngo: Uno no puede estar seguro de que realmente no hay forma de hacer que esto funcione en 64 bits. Según mis estudios, el problema es que se deben copiar más dlls que estos dos, pero analizar completamente el problema requiere más tiempo del que puedo dar.
harrymc
2

Un antiguo colega mío solía hacerlo a través de la herramienta netsh de Windows. Como nunca he hecho esto yo mismo, puedo aconsejarle que eche un vistazo a la documentación de Microsoft Netsh .

Como puedo recordar, fue una lástima y muchas llamadas netsh donde era necesario hacerlo, pero al final funcionó ...

Langhard
fuente
66
Fue posible hacerlo con netsh routingWindows XP, pero en Windows 7 han eliminado ese comando. Es por eso que solo estoy preguntando sobre Windows 7.
utapyngo
2

Lo siguiente debería funcionar

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
fuente
8
Fue posible hacerlo con netsh routingWindows XP, pero en Windows 7 han eliminado ese comando. Es por eso que solo estoy preguntando sobre Windows 7.
utapyngo
1

Desafortunadamente, no existe dicho comando cmd para Windows 7 o más, así que utilicé esta función de Visual Basic para hacerlo:

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

Tenga en cuenta que se requiere "" "". Que te diviertas.

pestillo de imad
fuente
1

Según lo que he leído, si los que han publicado dicen netshque no funciona a partir de las 7 en adelante, eso es incorrecto. Ahora, si se trata estrictamente de " netsh routing", supongo que podría estar en lo cierto, pero esto funciona. Estoy a punto de mostrar el contenido de un archivo por lotes que he creado que funciona en Windows 8.1. En lugar de obtener los comentarios habituales y piezas de información, voy a tratar de ayudar a aquellos con la información completa.

Primero, debe asegurarse de que la conexión que compartirá esté configurada para compartir realmente la conexión. Este enlace aquí debería ayudarlo a eso:

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

  1. Abra Conexiones de red haciendo clic en el botón Inicio Imagen del botón Inicio y luego en Panel de control. En el cuadro de búsqueda, escriba adaptador y luego, en Centro de redes y recursos compartidos, haga clic en Ver conexiones de red.

  2. Haga clic con el botón derecho en la conexión que desea compartir y luego haga clic en Propiedades. Se requiere permiso de administrador Si se le solicita una contraseña o confirmación de administrador, escriba la contraseña o proporcione la confirmación.

  3. Haga clic en la pestaña Compartir y luego seleccione la casilla de verificación Permitir a otros usuarios de la red conectarse a través de la conexión a Internet de esta computadora.

Después de seguir los pasos anteriores para configurar ICS en la computadora host, realice los siguientes cambios en todas las otras computadoras (pero no en la computadora host).

  1. Para abrir Opciones de Internet, haga clic en el botón Inicio Imagen del botón Inicio, haga clic en Panel de control, haga clic en Redes e Internet y luego haga clic en Opciones de Internet.

  2. Haga clic en la pestaña Conexiones y luego en Nunca marcar una conexión.

  3. Haga clic en Configuración de LAN.

  4. En el cuadro de diálogo Configuración de red de área local (LAN), en Configuración automática, desactive las casillas de verificación Detectar configuración automáticamente y Usar secuencia de comandos de configuración automática.

  5. En Servidor proxy, desactive la casilla Usar un servidor proxy para su LAN y luego haga clic en Aceptar.

Que yo sepa, creo que esto debería funcionar para Windows 7 y 8.

Ahora, dado que el tema era sobre una solución de línea de comandos, este es el contenido del archivo por lotes de cómo configuro y preparo un adaptador inalámbrico virtual.

Una vez creado, es posible que deba seguir las instrucciones anteriores y asegurarse de compartir la conexión de origen con el adaptador virtual recién creado que verán sus dispositivos inalámbricos.

Conexión para compartir el archivo .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

Estaré más que feliz de responder preguntas sobre esto porque habrá algunas situaciones únicas y me gustaría ayudar ya que tuve que reconstruir lo que encontré arriba.

Pero para llevar esto a la perspectiva, esto funciona en Windows 8.1 usando una conexión Ethernet en una computadora portátil que comparte su conexión con el adaptador virtual. Puede funcionar igual de bien si está tratando de compartir una conexión inalámbrica de origen.

usuario2562950
fuente
¡Bienvenido a Super User! Gracias por la respuesta detallada, he editado su pregunta para simplificar parte del texto y poner el contenido del archivo bat en un bloque de código. Puede ver otras instrucciones de formato si hay algún problema con él, verifique para asegurarse de que no haya alterado el significado del código.
bertieb
Sí, está bien y gracias. Sabía que debería haber hecho un mejor trabajo en el formateo. Buen toque en el enlace de MS para evitar tener que ir allí.
user2562950
No te preocupes por eso, recogerás la sintaxis de rebajas lo suficientemente rápido :) Incluyendo el contenido del enlace es parte de una política aquí para responder preguntas : los enlaces pueden quedar obsoletos, cambiar o desaparecer. Esto es menos probable en el caso de Microsoft, pero sigue siendo muy posible. Es una buena práctica poner todo lo necesario para una solución en la respuesta misma. ¡Esperamos ver más buenas respuestas tuyas!
bertieb