Làm cách nào để bật Chia sẻ kết nối Internet bằng dòng lệnh?


35

Tôi có thể thực hiện thủ công bằng cách nhấp chuột phải vào kết nối mạng, mở tab Chia sẻ và nhấp vào hộp kiểm "Cho phép người dùng mạng khác kết nối thông qua kết nối Internet của máy tính này".

Bây giờ tôi cần tự động hóa nhiệm vụ này. Có một công cụ dòng lệnh hoặc một lệnh ghép ngắn Powershell để thực hiện việc này không?


4
Không thể thử điều này ngay bây giờ, nhưng bạn có thể muốn thử chạy Process Monitor và trỏ nó vào Registry của bạn. Xem những phím / giá trị nào thay đổi khi bạn chuyển đổi và áp dụng cài đặt, sau đó viết tập lệnh của bạn cho phù hợp.
Iszi


Thành phần Microsoft-Windows-SharedAccessWindows Setup không được giám sát rất gần, nhưng nó chỉ hoạt động ở Windows Setup! technet.microsoft.com/en-us/l Library / ff715511.aspx
Jacob Krall

Câu trả lời:


20

Đây là một giải pháp PowerShell thuần túy (nên được chạy với các đặc quyền quản trị):

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

Xem thêm câu hỏi này tại social.msdn.microsoft.com :

Bạn phải bật giao diện chung trên bộ điều hợp bạn đang kết nối và cho phép chia sẻ trên giao diện riêng cho bộ điều hợp bạn muốn có thể sử dụng cho mạng.


1
Ồ, tôi không biết bạn có thể thực hiện COM interop với PowerShell! Tôi giả sử bạn cần một ít [System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)rắc vào.
Jacob Krall

Cuộc gọi đến EnableSharingđang ném ngoại lệ này, mặc dù tôi đang chạy PowerShell với tư cách Quản trị viên: Ngoại lệ: Ngoại lệ gọi "EnableShared" với (1) đối số: "Một sự kiện không thể gọi bất kỳ người đăng ký nào (Ngoại lệ từ HRESULT: 0x80040201) "-> Ngoại lệ đã bị ném bởi mục tiêu của một lời mời. -> Một sự kiện không thể gọi bất kỳ người đăng ký nào (Ngoại lệ từ HRESULT: 0x80040201)
Jacob Krall

Hãy thử chạy regsvr32 hnetcfg.dllvới tư cách quản trị viên.
utaccngo

Tôi tự hỏi: "kích hoạt giao diện công cộng trên bộ chuyển đổi" nghĩa là gì?
Jacob Krall

2
Trong các phiên bản mới hơn của Powershell, .SharingType tại là .SharingConnectionType
Baodad

9

Tôi đã tạo ra một công cụ dòng lệnh đơn giản cho việc này.

  1. Tải xuống và giải nén hoặcgit clone git@github.com:utapyngo/icsmanager.git

  2. Xây dựng bằng cách chạy build.cmd

  3. Đăng ký HNetCfgthư viện COM: regsvr32 hnetcfg.dll(đây là thư viện chuẩn nằm ở %WINDIR%\System32)

Sử dụng dòng lệnh

  1. Mở dấu nhắc dòng lệnh với tư cách quản trị viên

    cdvào icsmanagerthư mục (hoặc icsmanager-masternếu bạn đã tải xuống zip).

  2. Kiểu icsmanager

    Điều này sẽ hiển thị các kết nối mạng có sẵn. Lưu ý thuộc tính GUID. Để sử dụng công cụ này, bạn cần có ít nhất hai kết nối.

  3. Kiểu icsmanager enable {GUID-OF-CONNECTION-TO-SHARE} {GUID-OF-HOME-CONNECTION}

    Điều này sẽ kích hoạt ICS.

Sử dụng Powershell

  1. Mô-đun nhập khẩu:

    Mô-đun nhập IcsManager.dll

  2. Liệt kê các kết nối mạng:

    Kết nối mạng

  3. Bắt đầu chia sẻ kết nối Internet:

    Bật-ICS "Kết nối để chia sẻ" "Kết nối nhà"

  4. Dừng chia sẻ kết nối Internet:

    Vô hiệu hóa-ICS


Tuyên bố miễn trừ trách nhiệm: Tôi chưa kiểm tra công cụ này. Sử dụng nó có nguy cơ của riêng bạn. Vui lòng mở một vấn đề tại GitHub nếu một cái gì đó không hoạt động. Yêu cầu kéo cũng được chào đón.


Khéo léo. Điều này sử dụng một nhị phân bên ngoài được gọi là NETCONLib; nó từ đâu đến? Nó làm gì?
Jacob Krall

Aha. Đây là trình bao bọc lớp COM cho "Thư viện loại NetCon 1.0" có trong Windows.
Jacob Krall

@JacobKrall, vâng, nó nằm ở C:\Windows\System32\hnetcfg.dll.
utaccngo

Điều này có vẻ như nó sẽ làm chính xác những gì tôi muốn - tôi sẽ thử.
Jacob Krall

1
Xin lỗi, tôi đã làm điều đó vài tháng trước và quên rằng HNetCfg nên được đăng ký thủ công với regsvr32 hnetcfg.dll. Và tôi đã tìm hiểu về hnetcfg.dlltại msdn.microsoft.com/en-us/l
Library / windows / desktop / Giả

5

Theo hiểu biết của tôi, khả năng định tuyến đã bị xóa khỏi Windows kể từ Vista và hiện chỉ khả dụng trong Windows Server.

Thủ thuật sau đây có thể được tìm thấy trên Internet để kích hoạt lại netsh routing, bạn có thể tự chịu rủi ro khi thử. Tôi đề nghị trước tiên các biện pháp phòng ngừa thông thường, bao gồm tạo điểm khôi phục hệ thống.

  1. Nhận IPMONTR.DLL và IPPROMON.DLL từ 2003 hoặc từ XP
  2. Sao chép chúng vào WINDOWS \ HỆ THỐNG32
  3. Chạy trong Command Prompt (cmd) với tư cách quản trị viên:

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

Bạn cũng có thể cần đặt Dịch vụ truy cập từ xa và định tuyến thành Tự động khởi động.

Khởi động lại trước khi thử bất cứ điều gì.


1
Có hợp pháp để sao chép các tệp từ XP nếu tôi không có giấy phép XP không?
utaccngo

1
Đã thử điều này trên Windows 7 64 bit. Sao chép các tệp từ XP 64 bit. Chạy với tư cách quản trị viên. Lỗi:The following helper DLL cannot be loaded: IPMONTR.DLL. The following helper DLL cannot be loaded: IPPROMON.DLL.
utaccngo

1
Tôi cũng đã thử "thêm trình trợ giúp" và tôi rất tiếc phải xác nhận rằng nó không hoạt động trong 64-bit. Liên quan đến tính hợp pháp của việc ghép các dll mà bạn có quyền trên cả hai hệ điều hành, điều này không rõ ràng. Bạn không có quyền sửa đổi các tệp Windows, nhưng sao chép chúng có thể không được áp dụng trong giấy phép XP (điều này sẽ làm tôi kinh ngạc rằng Microsoft có thể thấy trước điều này).
harrymc

1
Nó nên được đề cập trong câu trả lời rằng nó không hoạt động cho Windows 64 bit. Cũng xin đề cập rằng các tệp nên được sao chép từ XP 32-bit.
utaccngo

@utaccogo: Người ta không thể chắc chắn rằng thực sự không có cách nào để thực hiện công việc này trên 64-bit. Theo các nghiên cứu của tôi, vấn đề là cần sao chép nhiều hơn hai dll này, nhưng để phân tích đầy đủ vấn đề đòi hỏi nhiều thời gian hơn tôi có thể đưa ra.
harrymc

2

Một đồng nghiệp cũ của tôi đã từng làm điều này thông qua các công cụ riêng của windows. Vì tôi chưa bao giờ làm điều này cho mình, tôi có thể khuyên bạn nên xem tài liệu của microsoft Netsh .

Như tôi có thể nhớ nó khá là đáng tiếc và rất nhiều cuộc gọi Netsh cần phải làm như vậy nhưng cuối cùng nó đã hoạt động ...


6
Có thể làm với netsh routingWindows XP nhưng trong Windows 7 họ đã loại bỏ lệnh đó. Đó là lý do tại sao tôi chỉ hỏi về Windows 7.
utaccngo

2

Sau đây nên làm việc

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
Có thể làm với netsh routingWindows XP nhưng trong Windows 7 họ đã loại bỏ lệnh đó. Đó là lý do tại sao tôi chỉ hỏi về Windows 7.
utaccngo

1

Thật không may, không có lệnh cmd nào cho Windows 7 trở lên, vì vậy tôi đã sử dụng chức năng Visual Basic này để hoàn thành nó:

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

Xin lưu ý rằng "" "" là bắt buộc. Chúc vui vẻ.


1

Dựa trên những gì tôi đã đọc, nếu những người đã đăng cho biết netshkhông hoạt động bắt đầu từ 7 trở lên - điều đó không chính xác. Bây giờ nếu nó đúng về " netsh routing", tôi đoán bạn có thể đúng, nhưng điều này không hoạt động- Tôi sắp hiển thị nội dung của một tệp bó mà tôi đã tạo ra Windows 8.1. Thay vì nhận được những bình luận và mẩu thông tin thông thường, tôi sẽ cố gắng giúp đỡ những người có thông tin đầy đủ.

Trước tiên, bạn cần đảm bảo kết nối bạn sẽ chia sẻ được thiết lập để thực sự chia sẻ kết nối. Liên kết này ở đây sẽ giúp bạn đi về điều đó:

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

  1. Mở Kết nối mạng bằng cách nhấp vào nút Bắt đầu Hình ảnh của nút Bắt đầu, sau đó nhấp vào Bảng điều khiển. Trong hộp tìm kiếm, nhập bộ điều hợp, sau đó, trong Trung tâm Mạng và Chia sẻ, bấm Xem kết nối mạng.

  2. Bấm chuột phải vào kết nối mà bạn muốn chia sẻ, rồi bấm Thuộc tính. Yêu cầu quyền của quản trị viên Nếu bạn được nhắc nhập mật khẩu hoặc xác nhận của quản trị viên, hãy nhập mật khẩu hoặc cung cấp xác nhận.

  3. Bấm vào tab Chia sẻ, rồi chọn hộp kiểm Cho phép người dùng mạng khác kết nối thông qua hộp kiểm kết nối Internet của máy tính này.

Sau khi bạn đã làm theo các bước trên để thiết lập ICS trên máy tính chủ, hãy thực hiện các thay đổi sau trên tất cả các máy tính khác (nhưng không phải trên máy tính chủ).

  1. Mở Tùy chọn Internet bằng cách nhấp vào nút Bắt đầu Hình ảnh của nút Bắt đầu, nhấp vào Bảng điều khiển, nhấp vào Mạng và Internet, sau đó nhấp vào Tùy chọn Internet.

  2. Bấm vào tab Kết nối, rồi bấm Không bao giờ quay số kết nối.

  3. Nhấp vào Cài đặt mạng LAN.

  4. Trong hộp thoại Cài đặt Mạng cục bộ (LAN), Trong Cấu hình tự động, xóa hộp kiểm Tự động phát hiện cài đặt và Sử dụng hộp kiểm cấu hình tự động.

  5. Trong Máy chủ proxy, hãy bỏ chọn hộp kiểm Sử dụng máy chủ proxy cho mạng LAN của bạn, rồi bấm OK.

Theo hiểu biết của tôi, tôi nghĩ rằng điều này sẽ hoạt động cho cả Windows 7 và 8.

Bây giờ vì chủ đề là về một giải pháp dòng lệnh, đây là nội dung tệp bó về cách tôi có một bộ điều hợp không dây ảo được định cấu hình và sẵn sàng hoạt động.

Sau khi được tạo, bạn có thể phải sử dụng các hướng dẫn ở trên và đảm bảo rằng bạn đang chia sẻ kết nối nguồn với bộ điều hợp ảo mới được tạo sẽ được các thiết bị không dây của bạn nhìn thấy.

Kết nối chia sẻ tập tin .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

Tôi sẽ rất vui khi trả lời các câu hỏi về điều này bởi vì sẽ có một số tình huống độc đáo và tôi muốn giúp đỡ vì tôi phải ghép lại những gì tôi tìm thấy ở trên.

Nhưng để đưa điều này vào viễn cảnh, điều này hoạt động trên Windows 8.1 bằng cách sử dụng kết nối Ethernet vào máy tính xách tay chia sẻ kết nối của nó với bộ điều hợp ảo. Nó cũng có thể hoạt động tốt nếu bạn đang cố gắng chia sẻ kết nối không dây nguồn.


Chào mừng bạn đến với Siêu người dùng! Cảm ơn câu trả lời chi tiết, tôi đã chỉnh sửa câu hỏi của bạn để hợp lý hóa một số văn bản và để đưa nội dung tệp bat của bạn vào một khối mã. Bạn có thể xem các hướng dẫn định dạng khác nếu có bất kỳ vấn đề nào với nó - vui lòng kiểm tra để đảm bảo rằng tôi đã không thay đổi ý nghĩa của mã.
bertieb

Vâng, đó là tốt và cảm ơn. Tôi biết tôi nên đã làm một công việc tốt hơn về định dạng. Liên lạc tốt đẹp trên liên kết MS để ngăn chặn thực sự phải đi đến đó.
dùng2562950

Đừng lo lắng về điều đó, bạn sẽ nhanh chóng nhận được cú pháp đánh dấu :) Bao gồm nội dung liên kết là một phần của chính sách ở đây khi trả lời các câu hỏi - các liên kết có thể bị cũ, thay đổi hoặc biến mất. Điều này ít có khả năng trong trường hợp của Microsoft, nhưng vẫn rất có thể. Đó là thực hành tốt để đặt mọi thứ cần thiết cho một giải pháp trong chính câu trả lời. Mong muốn được nhìn thấy nhiều câu trả lời tốt từ bạn!
bertieb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.