วิธีเปิดใช้งานการเชื่อมต่ออินเทอร์เน็ตร่วมกันโดยใช้บรรทัดคำสั่ง


34

ฉันสามารถทำได้ด้วยตนเองโดยคลิกขวาที่การเชื่อมต่อเครือข่ายเปิดแท็บการแชร์และคลิกที่ช่องทำเครื่องหมาย "อนุญาตให้ผู้ใช้เครือข่ายอื่น ๆ เชื่อมต่อผ่านการเชื่อมต่ออินเทอร์เน็ตของคอมพิวเตอร์เครื่องนี้"

ตอนนี้ฉันต้องทำให้งานนี้เป็นอัตโนมัติ มีเครื่องมือบรรทัดคำสั่งหรือ Powershell cmdlet เพื่อทำสิ่งนี้หรือไม่?


4
ไม่สามารถลองได้ในตอนนี้ แต่คุณอาจต้องการลองใช้การตรวจสอบกระบวนการและชี้ไปที่รีจิสตรีของคุณ ดูว่าคีย์ / ค่าใดเปลี่ยนแปลงเมื่อคุณสลับ & ใช้การตั้งค่าแล้วเขียนสคริปต์ของคุณตามนั้น
Iszi


Microsoft-Windows-SharedAccessองค์ประกอบติดตั้งแบบอัตโนมัติของ Windows เพื่อให้ใกล้เคียง แต่การทำงานเฉพาะที่ติดตั้ง Windows! technet.microsoft.com/en-us/library/ff715511.aspx
Jacob Krall

คำตอบ:


19

นี่คือโซลูชัน 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
โอ้ฉันไม่ทราบว่าคุณสามารถใช้ COM interop กับ PowerShell ได้! ฉันคิดว่าคุณต้องการ[System.Runtime.Interopservices.Marshal]::ReleaseComObject(...)โรยใน
ยาโคบ

การเรียกใช้EnableSharingกำลังส่งข้อยกเว้นนี้ถึงแม้ว่าฉันกำลังเรียกใช้ PowerShell ในฐานะผู้ดูแลระบบ: ข้อยกเว้น: การเรียกข้อยกเว้น "EnableSharing" ด้วยอาร์กิวเมนต์ "1": "เหตุการณ์:" เหตุการณ์ไม่สามารถเรียกสมาชิกใด ๆ (ยกเว้นจาก HRESULT: 0x80040201) "-> มีการส่งข้อยกเว้นโดยเป้าหมายของการเรียก -> กิจกรรมไม่สามารถเรียกใช้สมาชิกใด ๆ (ยกเว้นจาก HRESULT: 0x80040201)
Jacob Krall

ลองเรียกใช้regsvr32 hnetcfg.dllในฐานะผู้ดูแลระบบด้วยตนเอง
utapyngo

ฉันสงสัยว่า: "เปิดใช้งานส่วนต่อประสานสาธารณะบนอะแดปเตอร์" หมายความว่าอย่างไร
Jacob Krall

2
ใน Powershell เวอร์ชันใหม่กว่านี้ .SharingType คือ .SharingConnectionType
Baodad

9

ฉันได้สร้างเครื่องมือบรรทัดคำสั่งง่ายๆสำหรับสิ่งนี้

  1. ดาวน์โหลดและเปิดเครื่องรูดหรือgit clone git@github.com:utapyngo/icsmanager.git

  2. สร้างโดยการวิ่ง build.cmd

  3. ลงทะเบียนHNetCfgไลบรารี COM: regsvr32 hnetcfg.dll(เป็นไลบรารีมาตรฐานที่ตั้งอยู่ที่%WINDIR%\System32)

การใช้งานบรรทัดคำสั่ง

  1. เปิดพรอมต์บรรทัดคำสั่งในฐานะผู้ดูแลระบบ

    cdไปยังicsmanagerไดเรกทอรี (หรือicsmanager-masterถ้าคุณดาวน์โหลด zip)

  2. ชนิด icsmanager

    สิ่งนี้ควรแสดงการเชื่อมต่อเครือข่ายที่มีอยู่ สังเกตเห็นแอตทริบิวต์ GUID ในการใช้เครื่องมือนี้คุณต้องมีการเชื่อมต่ออย่างน้อยสองครั้ง

  3. ชนิด icsmanager enable {GUID-OF-CONNECTION-TO-SHARE} {GUID-OF-HOME-CONNECTION}

    สิ่งนี้ควรเปิดใช้งาน ICS

การใช้ Powershell

  1. โมดูลนำเข้า:

    นำเข้าโมดูล IcsManager.dll

  2. รายการการเชื่อมต่อเครือข่าย:

    Get-NetworkConnections

  3. เริ่มการแชร์การเชื่อมต่ออินเทอร์เน็ต:

    Enable-ICS "การเชื่อมต่อเพื่อแบ่งปัน" "การเชื่อมต่อที่บ้าน"

  4. หยุดการแชร์การเชื่อมต่ออินเทอร์เน็ต:

    ปิดการใช้งาน-ICS


คำเตือน: ฉันยังไม่ได้ทดสอบเครื่องมือ ใช้ความเสี่ยงของคุณเอง อย่าลังเลที่จะเปิดปัญหาที่ GitHub หากมีบางอย่างไม่ทำงาน ยินดีรับคำขอดึง


เรียบร้อย สิ่งนี้ใช้ไบนารีภายนอกที่เรียกว่า NETCONLib มันมาจากไหน มันทำอะไร?
Jacob Krall

เอเอชเอ นี่คือ wrapper คลาส COM สำหรับ "NetCon 1.0 Type Library" ที่มาพร้อมกับ Windows
Jacob Krall

@JacobKrall C:\Windows\System32\hnetcfg.dllใช่มันตั้งอยู่ที่
utapyngo

ดูเหมือนว่ามันจะทำสิ่งที่ฉันต้องการ - ฉันจะลอง
Jacob Krall

1
ขอโทษนะฉันไม่ได้เป็นเวลาหลายเดือนที่ผ่านมาและลืมไปว่า HNetCfg regsvr32 hnetcfg.dllควรจะลงทะเบียนด้วยตนเอง และผมได้เรียนรู้เกี่ยวกับการhnetcfg.dllที่msdn.microsoft.com/en-us/library/windows/desktop/...
utapyngo

5

จากความเข้าใจของฉันความสามารถในการกำหนดเส้นทางถูกลบออกจาก Windows ตั้งแต่ Vista และมีให้บริการใน Windows Server เท่านั้น

เคล็ดลับต่อไปนี้สามารถพบได้บนอินเทอร์เน็ตเพื่อเปิดใช้งานอีกครั้งnetsh routingซึ่งคุณสามารถลองรับความเสี่ยงของคุณเอง ฉันขอแนะนำข้อควรระวังตามปกติก่อนรวมถึงการสร้างจุดคืนค่าระบบ

  1. รับ IPMONTR.DLL และ IPPROMON.DLL จากปี 2003 หรือจาก XP
  2. คัดลอกไปยัง WINDOWS \ SYSTEM32
  3. ทำงานใน Command Prompt (cmd) ในฐานะผู้ดูแลระบบ:

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

คุณอาจต้องตั้งค่าการกำหนดเส้นทางและบริการการเข้าถึงระยะไกลเป็นการเริ่มต้นอัตโนมัติ

รีบูตก่อนลองทำอะไร


1
การคัดลอกไฟล์จาก XP นั้นถูกต้องหรือไม่หากฉันไม่มีใบอนุญาต XP
utapyngo

1
พยายามทำสิ่งนี้บน Windows 7 64 บิต คัดลอกไฟล์จาก 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
มันควรจะกล่าวถึงในคำตอบว่ามันไม่ทำงานสำหรับ Windows 64 บิต โปรดระบุว่าควรคัดลอกไฟล์จาก XP 32- บิต
utapyngo

@utapyngo: เราไม่สามารถมั่นใจได้ว่าไม่มีวิธีใดที่จะทำให้การทำงานนี้เป็นแบบ 64 บิต จากการศึกษาของฉันปัญหาคือว่าควรจะคัดลอกไฟล์มากกว่าสองตัวนี้ แต่การวิเคราะห์อย่างเต็มที่ปัญหาต้องใช้เวลามากกว่าที่ฉันจะให้
harrymc

2

อดีตเพื่อนร่วมงานของฉันเคยทำสิ่งนี้ผ่านทางเครื่องมือของตัวเอง เนื่องจากฉันไม่เคยทำสิ่งนี้ด้วยตัวเองฉันจึงสามารถแนะนำให้คุณดูเอกสารของ 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

น่าเสียดายที่ไม่มีคำสั่ง cmd ดังกล่าวสำหรับ Windows 7 ขึ้นไปดังนั้นฉันจึงใช้ฟังก์ชัน 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/en-us/windows/set-internet-connection-sharing#1TC=windows-7

  1. เปิดการเชื่อมต่อเครือข่ายโดยคลิกปุ่มเริ่มรูปภาพของปุ่ม 'เริ่ม' แล้วคลิกแผงควบคุม ในกล่องค้นหาพิมพ์อะแดปเตอร์จากนั้นภายใต้ศูนย์เครือข่ายและการแชร์คลิกดูการเชื่อมต่อเครือข่าย

  2. คลิกขวาที่การเชื่อมต่อที่คุณต้องการแชร์แล้วคลิกคุณสมบัติ จำเป็นต้องได้รับอนุญาตจากผู้ดูแลระบบหากคุณได้รับพร้อมท์ให้ใส่รหัสผ่านผู้ดูแลระบบหรือยืนยันให้พิมพ์รหัสผ่านหรือทำการยืนยัน

  3. คลิกแท็บการแชร์แล้วเลือกกล่องกาเครื่องหมายอนุญาตให้ผู้ใช้เครือข่ายอื่น ๆ เชื่อมต่อผ่านการเชื่อมต่ออินเทอร์เน็ตของคอมพิวเตอร์เครื่องนี้

หลังจากที่คุณทำตามขั้นตอนด้านบนเพื่อตั้งค่า ICS ในคอมพิวเตอร์โฮสต์ให้ทำการเปลี่ยนแปลงต่อไปนี้ในคอมพิวเตอร์เครื่องอื่น ๆ ทั้งหมด (แต่ไม่ใช่ในคอมพิวเตอร์โฮสต์)

  1. เปิดตัวเลือกอินเทอร์เน็ตโดยคลิกปุ่มเริ่มรูปภาพของปุ่ม 'เริ่ม' คลิกแผงควบคุมคลิกเครือข่ายและอินเทอร์เน็ตแล้วคลิกตัวเลือกอินเทอร์เน็ต

  2. คลิกการเชื่อมต่อแท็บแล้วคลิกไม่เรียกเลขหมายการเชื่อมต่อ

  3. คลิกการตั้งค่า LAN

  4. ในกล่องโต้ตอบการตั้งค่าเครือข่ายท้องถิ่น (LAN) ภายใต้การกำหนดค่าอัตโนมัติให้ล้างกล่องกาเครื่องหมายตรวจหาการตั้งค่าโดยอัตโนมัติและใช้สคริปต์การกำหนดค่าอัตโนมัติ

  5. ภายใต้พร็อกซีเซิร์ฟเวอร์ล้างกล่องกาเครื่องหมายใช้พร็อกซีเซิร์ฟเวอร์สำหรับ LAN ของคุณแล้วคลิกตกลง

สำหรับความรู้ของฉันฉันคิดว่าสิ่งนี้ควรใช้งานได้กับทั้ง Windows 7 และ 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 โดยใช้การเชื่อมต่อ Ethernet เข้ากับแล็ปท็อปที่ใช้การเชื่อมต่อกับอะแดปเตอร์เสมือนจริง อาจใช้งานได้เช่นกันหากคุณพยายามแบ่งปันการเชื่อมต่อไร้สายต้นทาง


ยินดีต้อนรับสู่ Super User! ขอบคุณสำหรับคำตอบโดยละเอียดฉันได้แก้ไขคำถามของคุณเพื่อปรับปรุงข้อความบางส่วนและทำให้เนื้อหาไฟล์ค้างคาวของคุณอยู่ในบล็อคโค้ด คุณสามารถดูคำแนะนำการจัดรูปแบบอื่น ๆหากมีปัญหาใด ๆ กับมัน - โปรดตรวจสอบเพื่อให้แน่ใจว่าฉันไม่ได้เปลี่ยนความหมายของรหัส
bertieb

ใช่ดีและขอบคุณ ฉันรู้ว่าฉันควรทำรูปแบบได้ดีขึ้น แตะที่ลิงค์ MS เพื่อป้องกันไม่ให้ไปที่นั่นจริง
2562950

ไม่ต้องกังวลคุณจะรับไวยากรณ์ markdown เร็วพอ :) การรวมเนื้อหาลิงก์เป็นส่วนหนึ่งของนโยบายที่นี่ในการตอบคำถาม - ลิงก์สามารถค้างเปลี่ยนหรือหายไปได้ นี่เป็นโอกาสน้อยที่ในกรณีของ Microsoft แต่ก็ยังเป็นไปได้มาก เป็นวิธีปฏิบัติที่ดีในการใส่ทุกสิ่งที่จำเป็นสำหรับการแก้ปัญหาด้วยตัวเอง หวังว่าจะได้รับคำตอบที่ดีจากคุณ!
bertieb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.