Como habilitar o compartilhamento de conexão com a Internet usando a linha de comando?

35

Para fazer isso manualmente, clique com o botão direito do mouse em uma conexão de rede, abra a guia Compartilhamento e clique na caixa de seleção "Permitir que outros usuários da rede se conectem através da conexão com a Internet deste computador".

Agora eu preciso automatizar esta tarefa. Existe uma ferramenta de linha de comando ou um cmdlet do Powershell para fazer isso?

utapyngo
fonte
4
Não é possível tentar isso agora, mas você pode tentar executar o Process Monitor e apontá-lo para o seu Registro. Veja quais chaves / valores mudam quando você alterna e aplica a configuração e, em seguida, escreva seu script.
Iszi 17/09/12
Questão relacionada / info Mais em StackOverflow: Ativar compartilhamento de conexão Internet programaticamente
Ƭᴇcʜιᴇ007
O Microsoft-Windows-SharedAccesscomponente de instalação autônoma do Windows está muito próximo, mas funciona apenas na instalação do Windows! technet.microsoft.com/pt-br/library/ff715511.aspx
Jacob Krall 20/13

Respostas:

20

Aqui está uma solução pura do PowerShell (deve ser executada com privilégios 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()

Veja também esta pergunta em social.msdn.microsoft.com :

Você precisa ativar a interface pública no adaptador ao qual está se conectando e ativar o compartilhamento na interface privada para o adaptador que deseja poder usar na rede.

utapyngo
fonte
1
Ooh, eu não sabia que você poderia fazer interoperabilidade COM com o PowerShell! Eu suponho que você precisar de algum [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)polvilhado no.
Jacob Krall
A chamada para EnableSharingestá lançando essa exceção, mesmo que eu esteja executando o PowerShell como Administrador: Exceção: exceção chamando "EnableSharing" com argumento "1": "Um evento não pôde chamar nenhum dos assinantes (Exceção de HRESULT: 0x80040201) "-> A exceção foi lançada pelo destino de uma chamada. -> Um evento não pôde chamar qualquer um dos assinantes (Exceção de HRESULT: 0x80040201)
Jacob Krall
Tente executar regsvr32 hnetcfg.dllcomo administrador manualmente.
Utapyngo
Eu me pergunto: o que significa "ativar a interface pública no adaptador"?
26813 Jacob Krall
2
Nas versões mais recentes do Powershell, o .SharingType agora é .SharingConnectionType
Baodad
9

Eu criei uma ferramenta de linha de comando simples para isso.

  1. Faça o download e descompacte ougit clone [email protected]:utapyngo/icsmanager.git

  2. Construir executando build.cmd

  3. Registre a HNetCfgbiblioteca COM: regsvr32 hnetcfg.dll(é uma biblioteca padrão localizada em %WINDIR%\System32)

Uso da linha de comando

  1. Abra o prompt da linha de comando como administrador

    cdpara o icsmanagerdiretório (ou icsmanager-masterse você baixou o zip).

  2. Tipo icsmanager

    Isso deve exibir as conexões de rede disponíveis. Observe o atributo GUID. Para usar esta ferramenta, você precisa ter pelo menos duas conexões.

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

    Isso deve ativar o ICS.

Uso do PowerShell

  1. Módulo de importação:

    Import-Module IcsManager.dll

  2. Listar conexões de rede:

    Get-NetworkConnections

  3. Inicie o compartilhamento de conexão com a Internet:

    Ative o ICS "Conexão para compartilhar" "Conexão doméstica"

  4. Pare o compartilhamento de conexão com a Internet:

    Desativar-ICS


Isenção de responsabilidade: ainda não testei a ferramenta. Use-o por sua conta e risco. Sinta-se livre para abrir um problema no GitHub se algo não funcionar. Solicitações pull também são bem-vindas.

utapyngo
fonte
Arrumado. Isso usa um binário externo chamado NETCONLib; De onde veio? O que isso faz?
Jacob Krall 23/09
Aha. Este é um invólucro de classe COM para a "Biblioteca de tipos NetCon 1.0" incluída no Windows.
23813 Jacob Krall
@JacobKrall, sim, está localizado em C:\Windows\System32\hnetcfg.dll.
precisa saber é o seguinte
Parece que ele fará exatamente o que eu quero - vou experimentar.
23813 Jacob Krall
1
Desculpe, fiz isso há vários meses e esqueci que o HNetCfg deveria ser registrado manualmente regsvr32 hnetcfg.dll. E eu aprendi sobre hnetcfg.dllem msdn.microsoft.com/en-us/library/windows/desktop/…
utapyngo
5

Pelo meu entendimento, o recurso de roteamento foi removido do Windows desde o Vista e só está disponível agora no Windows Server.

O truque a seguir pode ser encontrado na Internet para reativar netsh routing, que você pode tentar por seu próprio risco. Sugiro primeiro as precauções usuais, incluindo a criação de um ponto de restauração do sistema.

  1. Obtenha o IPMONTR.DLL e o IPPROMON.DLL a partir de 2003 ou do XP
  2. Copie-os para WINDOWS \ SYSTEM32
  3. Execute no prompt de comando (cmd) como administrador:

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

Também pode ser necessário definir o serviço de roteamento e acesso remoto para inicialização automática.

Reinicie antes de tentar qualquer coisa.

harrymc
fonte
1
É legal copiar arquivos do XP se eu não tiver uma licença XP?
utapyngo
1
Tentei isso no Windows 7 64bit. Copiou os arquivos do XP de 64 bits. Executando como administrador. Erros:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo
1
Tentei também o "add helper" e lamento confirmar que ele não funciona para 64 bits. Quanto à legalidade do transplante de dlls às quais você tem direito nos dois sistemas operacionais, isso não está claro. Você não tem o direito de modificar arquivos do Windows, mas talvez não seja possível copiá-los na licença do XP (me surpreenderia que a Microsoft previsse isso com antecedência).
harrymc
1
Deve ser mencionado na resposta que ele não funciona no Windows de 64 bits. Por favor, mencione também que os arquivos devem ser copiados do XP de 32 bits.
Utapyngo
@utapyngo: Não se pode ter certeza de que realmente não há como fazer isso funcionar em 64 bits. De acordo com meus estudos, o problema é que mais dlls do que esses dois devem ser copiadas, mas analisar completamente o problema requer mais tempo do que posso dar.
harrymc
2

Um ex-colega meu costumava fazer isso através do netsh da própria ferramenta do Windows. Como eu nunca fiz isso sozinho, posso aconselhá-lo a dar uma olhada na documentação do Microsoft netsh .

Como eu me lembro, era praticamente uma pena e muitas chamadas netsh eram necessárias, mas funcionou no final ...

Langhard
fonte
6
Era possível fazer isso netsh routingno Windows XP, mas no Windows 7 eles removeram esse comando. É por isso que eu só estou perguntando sobre o Windows 7.
utapyngo
2

O seguinte deve 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
fonte
8
Era possível fazer isso netsh routingno Windows XP, mas no Windows 7 eles removeram esse comando. É por isso que eu estou apenas perguntando sobre o Windows 7.
utapyngo
1

Infelizmente, não existe esse comando cmd para o Windows 7 ou mais, então usei esta função do Visual Basic para fazer isso:

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

Por favor, note que "" "" é necessário. Diverta-se.

trava imad
fonte
1

Com base no que eu li, se os que postaram disseram netshque não funcionam a partir das 7 e acima, isso está incorreto. Agora, se for estritamente sobre " netsh routing", acho que você pode estar certo, mas isso funciona - estou prestes a mostrar o conteúdo de um arquivo em lotes que criei para o Windows 8.1. Em vez de obter os comentários e informações usuais, tentarei ajudar aqueles com todas as informações.

Primeiro, você precisa garantir que a conexão que você compartilhará esteja configurada para realmente compartilhar a conexão. Este link aqui deve ajudar você a:

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

  1. Para abrir Conexões de Rede, clique no botão Iniciar Imagem do botão Iniciar e, em seguida, clique em Painel de Controle. Na caixa de pesquisa, digite adaptador e, em Central de Rede e Compartilhamento, clique em Exibir conexões de rede.

  2. Clique com o botão direito do mouse na conexão que você deseja compartilhar e, em seguida, clique em Propriedades. É necessária permissão do administrador Se você for solicitado com uma senha ou confirmação de administrador, digite a senha ou forneça a confirmação.

  3. Clique na guia Compartilhamento e marque a caixa de seleção Permitir que outros usuários da rede se conectem através da conexão com a Internet deste computador.

Depois de seguir as etapas acima para configurar o ICS no computador host, faça as seguintes alterações em todos os outros computadores (mas não no computador host).

  1. Para abrir Opções da Internet, clique no botão Iniciar Imagem do botão Iniciar, clique em Painel de Controle, clique em Rede e Internet e, em seguida, clique em Opções da Internet.

  2. Clique na guia Conexões e, em seguida, clique em Nunca discar uma conexão.

  3. Clique em Configurações da LAN.

  4. Na caixa de diálogo Configurações da rede local (LAN), em Configuração automática, desmarque as caixas de seleção Detectar automaticamente as configurações e Usar script de configuração automática.

  5. Em servidor proxy, limpe a caixa de seleção Usar um servidor proxy para sua LAN e, em seguida, clique em OK.

Que eu saiba, acho que isso deve funcionar para o Windows 7 e 8.

Agora, como o tópico era sobre uma solução de linha de comando, este é o conteúdo do arquivo em lotes de como eu configuro um adaptador sem fio virtual e pronto para uso.

Depois de criada, talvez você precise usar as instruções acima e verifique se está compartilhando a conexão de origem com o adaptador virtual recém-criado que será visto pelos seus dispositivos sem fio.

Arquivo .bat de compartilhamento de conexão:

@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

Ficarei feliz em responder perguntas sobre isso, porque haverá algumas situações únicas e gostaria de ajudar, pois tive que juntar o que encontrei acima.

Mas, para trazer isso à perspectiva, isso funciona no Windows 8.1 usando uma conexão Ethernet em um laptop, compartilhando sua conexão com o adaptador virtual. Pode funcionar tão bem se você estiver tentando compartilhar uma conexão sem fio de origem.

user2562950
fonte
Bem-vindo ao Super Usuário! Obrigado pela resposta detalhada, editei a sua pergunta para simplificar parte do texto e colocar o conteúdo do seu arquivo bat em um bloco de código. Você pode ver outras instruções de formatação, se houver algum problema; verifique se não alterei o significado do código.
bertieb
Sim, está bem e obrigado. Eu sabia que deveria ter feito um trabalho melhor na formatação. Toque agradável no link do MS para impedir que ele realmente vá até lá.
User2562950
Não se preocupe, você receberá a sintaxe da remarcação com bastante rapidez :) A inclusão do conteúdo do link faz parte de uma política aqui para responder a perguntas - os links podem ficar obsoletos, mudar ou desaparecer. Isso é menos provável no caso da Microsoft, mas ainda é muito possível. É uma boa prática colocar tudo o que é necessário para uma solução na própria resposta. Ansiosos para ver mais boas respostas suas!
bertieb