我可以通过右键单击网络连接、打开“共享”选项卡并单击“允许其他网络用户通过此计算机的 Internet 连接进行连接”复选框来手动执行此操作。
现在我需要自动执行此任务。是否有命令行工具或 Powershell cmdlet 可以完成此操作?
答案1
这是一个纯 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:
您必须在所连接的适配器上启用公共接口,并在您想要用于网络的适配器的私有接口上启用共享。
答案2
我已经创建了一个简单的命令行工具为了这。
下载并解压缩或
git clone [email protected]:utapyngo/icsmanager.git
通过运行构建
build.cmd
注册
HNetCfg
COM 库:(regsvr32 hnetcfg.dll
它是位于的标准库%WINDIR%\System32
)
命令行用法
以管理员身份打开命令行提示符
cd
到icsmanager
目录(或者icsmanager-master
如果你下载了 zip)。类型
icsmanager
这应该会显示可用的网络连接。请注意 GUID 属性。要使用此工具,您至少需要有两个连接。
类型
icsmanager enable {GUID-OF-CONNECTION-TO-SHARE} {GUID-OF-HOME-CONNECTION}
这应该会启用 ICS。
Powershell 使用
导入模块:
导入模块 IcsManager.dll
列出网络连接:
获取网络连接
启动 Internet 连接共享:
启用 ICS“共享连接”“家庭连接”
停止 Internet 连接共享:
禁用ICS
免责声明:我尚未测试该工具。使用它需要您自担风险。如果出现问题,请随时在 GitHub 上打开问题。也欢迎提交拉取请求。
答案3
据我了解,自 Vista 以来,路由功能已从 Windows 中删除,现在仅在 Windows Server 中可用。
您可以在互联网上找到以下技巧来重新启用netsh routing
,您可以自行尝试,但风险自负。我建议首先采取通常的预防措施,包括创建系统还原点。
- 从 2003 或 XP 获取 IPMONTR.DLL 和 IPPROMON.DLL
- 将它们复制到 WINDOWS\SYSTEM32
以管理员身份在命令提示符(cmd)中运行:
netsh add helper ipmontr.dll
netsh add helper ippromon.dll
您可能还需要将路由和远程访问服务设置为自动启动。
尝试任何操作之前请重新启动。
答案4
不幸的是,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
请注意“”是必填项。玩得开心。