如何使用命令行启用Internet连接共享?


35

我可以通过右键单击网络连接,打开“共享”选项卡,然后单击“允许其他网络用户通过此计算机的Internet连接进行连接”复选框来手动完成此操作。

现在,我需要自动执行此任务。是否有命令行工具或Powershell cmdlet可以完成此任务?


4
暂时无法尝试,但是您可能想尝试运行Process Monitor并将其指向注册表。查看在切换和应用设置时哪些键/值会更改,然后相应地编写脚本。
Iszi 2012年

有关StackOverflow的相关问题/信息:以编程方式启用Internet连接共享
2013年

Microsoft-Windows-SharedAccess无人值守的Windows安装程序组件是如此的接近,但它仅适用于Windows安装程序!technet.microsoft.com/zh-CN/library/ff715511.aspx
Jacob Krall 2013年

Answers:


20

这是一个纯PowerShell解决方案(应以管理权限运行):

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

另请参见social.msdn.microsoft.com上的此问题:

您必须在要连接的适配器上启用公共接口,并在专用接口上启用要用于网络的适配器的共享。


1
哦,我不知道您可以使用PowerShell进行COM互操作!我想你需要一些[System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)洒英寸
雅各布·克劳

调用EnableSharing抛出此异常,即使我运行PowerShell中以管理员身份:异常:异常调用“EnableSharing”与“1”的说法(S):“事件无法调用任何订户(从HRESULT异常: 0x80040201)“->调用目标已引发异常。->事件无法调用任何订阅者(HRESULT的异常:0x80040201)
Jacob Krall 2013年

尝试regsvr32 hnetcfg.dll以管理员身份手动运行。
utapyngo

我想知道:“在适配器上启用公共接口”是什么意思?
Jacob Krall 2013年

2
在Powershell的较新版本中,.SharingType现在为.SharingConnectionType
Baodad 2013年

9

我为此创建了一个简单的命令行工具

  1. 下载并解压缩或git clone git@github.com:utapyngo/icsmanager.git

  2. 通过运行进行构建 build.cmd

  3. 注册HNetCfgCOM库:(regsvr32 hnetcfg.dll这是位于的标准库%WINDIR%\System32

命令行用法

  1. 以管理员身份打开命令行提示符

    cdicsmanager目录(或者icsmanager-master如果您下载了zip)。

  2. 类型 icsmanager

    这应该显示可用的网络连接。注意GUID属性。要使用此工具,您至少需要两个连接。

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

    这应该启用ICS。

Powershell的使用

  1. 导入模块:

    导入模块IcsManager.dll

  2. 列出网络连接:

    获取网络连接

  3. 开始Internet连接共享:

    启用ICS“共享连接”“家庭连接”

  4. 停止Internet连接共享:

    禁用ICS


免责声明:我尚未测试该工具。需要您自担风险使用它。如果无法解决问题,请随时在GitHub上发布问题。也欢迎请求请求。


整齐。这使用了一个称为NETCONLib的外部二进制文件。它从哪里来的?它有什么作用?
Jacob Krall

啊哈 这是Windows附带的“ NetCon 1.0类型库”的COM类包装。
Jacob Krall 2013年

@JacobKrall,是的,它位于C:\Windows\System32\hnetcfg.dll
utapyngo 2013年

看起来它将完全满足我的要求-我将尝试一下。
Jacob Krall 2013年

1
抱歉,几个月前我这样做了,但是忘记了HNetCfg应该通过手动注册regsvr32 hnetcfg.dll。我hnetcfg.dllmsdn.microsoft.com/zh-cn/library/windows/desktop/…上
utapyngo 2013年

5

据我了解,自Vista以来,路由功能已从Windows中删除,现在仅在Windows Server中可用。

netsh routing您可以在Internet上找到以下技巧来重新启用该工具,但后果自负。我首先建议通常的预防措施,包括创建系统还原点。

  1. 从2003或XP获取IPMONTR.DLL和IPPROMON.DLL
  2. 将它们复制到WINDOWS \ SYSTEM32
  3. 以管理员身份在命令提示符(cmd)中运行:

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

您可能还需要将“路由和远程访问服务”设置为“自动启动”。

在尝试任何操作之前,请重新引导。


1
如果我没有XP许可证,从XP复制文件是否合法?
utapyngo

1
在Windows 7 64bit上进行了尝试。从XP 64位复制文件。以管理员身份运行。错误:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utapyngo

1
我也尝试过“添加帮助程序”,很遗憾地确认它不适用于64位。至于在两个操作系统上都有权移植的dll的合法性,目前还不清楚。您没有修改Windows文件的权利,但是XP许可证中可能不禁止复制这些文件(这使我感到震惊,因为Microsoft可能已经预先预料到了这一点)。
harrymc

1
在答案中应该提到它不适用于64位Windows。另请注意,应从32位XP复制文件。
utapyngo

@utapyngo:不能确定确实没有办法在64位上进行这项工作。根据我的研究,问题在于应该复制比这两个更多的dll,但是完全分析问题需要的时间超出我的能力。
harrymc

2

我的一位前同事曾经通过Windows自己的工具netsh来执行此操作。由于我自己从未做过此事,因此我可以自己建议您查看microsoft netsh文档

我记得那几乎是一个微不足道的地方,需要进行许多netsh调用,但最终还是奏效了...


6
netsh routing在Windows XP中可以这样做,但是在Windows 7中,他们已删除了该命令。这就是为什么我只要求有关Windows 7
utapyngo

2

以下应该工作

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
netsh routing在Windows XP中可以这样做,但是在Windows 7中,他们已删除了该命令。这就是为什么我只要求有关Windows 7
utapyngo

1

不幸的是,对于Windows 7或更高版本,没有这样的cmd命令,因此我使用了Visual Basic函数来完成它:

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

请注意,“””是必需的。玩得开心。


1

根据我的阅读,如果已发布的netsh内容从7开始不起作用,那是不正确的。现在,如果严格说来,netsh routing ”,我想您可能是对的,但这确实可行-我将展示我在Windows 8.1中创建的该批处理文件的内容。我将不会尝试获得通常的评论和信息,而是会尝试为他们提供全部信息。

首先,您需要确保将要共享的连接设置为实际共享连接。这里的链接应该帮助您:

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

  1. 通过单击“开始”按钮“开始”按钮的图片,然后单击“控制面板”,打开“网络连接”。在搜索框中,键入适配器,然后在“网络和共享中心”下,单击“查看网络连接”。

  2. 用鼠标右键单击要共享的连接,然后单击“属性”。需要管理员权限如果系统提示您输入管理员密码或确认,请输入密码或提供确认。

  3. 单击共享选项卡,然后选择允许其他网络用户通过此计算机的Internet连接进行连接复选框。

在按照上述步骤在主机上设置ICS之后,请在所有其他计算机(而不是主机)上进行以下更改。

  1. 通过单击“开始”按钮“开始”按钮的图片,“控制面板”,“网络和Internet”,然后单击“ Internet选项”,打开“ Internet选项”。

  2. 单击连接选项卡,然后单击从不拨号连接。

  3. 单击局域网设置。

  4. 在“局域网(LAN)设置”对话框中的“自动配置”下,清除“自动检测设置”和“使用自动配置脚本”复选框。

  5. 在“代理服务器”下,清除“为LAN使用代理服务器”复选框,然后单击“确定”。

据我所知,我认为这对Windows 7和Windows 8均适用。

现在,由于该主题是关于命令行解决方案的,因此这是我如何配置虚拟无线适配器并准备就绪的批处理文件内容。

创建虚拟适配器后,您可能必须使用上述说明,并确保与新创建的虚拟适配器共享源连接,无线设备将看到该虚拟适配器。

连接共享.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

我会很乐意回答有关此问题,因为将会有一些独特的情况,并且由于我不得不拼凑上面的发现,我想提供帮助。

但是,为了清楚起见,它可以在Windows 8.1上使用以太网连接到便携式计算机,并共享其与虚拟适配器的连接。如果您尝试共享源无线连接,则它可能也同样有效。


欢迎来到超级用户!感谢您提供详细的答案,我已经对您的问题进行了编辑,以简化一些文本并将bat文件的内容放在代码块中。如果有任何格式问题,您可以查看其他格式说明-请检查以确保我没有更改代码的含义。
bertieb

是的,很好,谢谢。我知道我应该在格式化方面做得更好。在MS链接上轻触一下即可避免实际上必须去那里。
user2562950

不用担心,您将足够快地掌握markdown语法:)在这里,包括链接内容是回答问题的策略的一部分 -链接可能会陈旧,更改或消失。在Microsoft的情况下,这种可能性较小,但仍然很有可能。优良作法是将答案的所有必要内容都放入答案中。期待看到您的更多好答案!
bertieb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.