ไดรฟ์เครือข่ายที่แมปสามารถเชื่อมต่อใหม่จากบรรทัดคำสั่งได้หรือไม่


32

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

ทางออกที่เร็วที่สุดที่ฉันมีอยู่คือ:

  1. พิมพ์ " start." เพื่อเปิด explorer
  2. Alt- Dเพื่อเน้นแถบที่อยู่
  3. พิมพ์อักษรระบุไดรฟ์ที่ฉันต้องการและกด Enter แล้วรอเพื่อแสดงเนื้อหาของไดรฟ์
  4. จากนั้นในที่สุดปิด explorer และกลับไปที่พรอมต์คำสั่ง

ฉันรู้ว่ามันเป็นความไม่สะดวกเล็ก ๆ น้อย ๆ แต่บ่อยครั้งที่ฉันทำสิ่งนี้ผ่านการเชื่อมต่อ VNC หรือ PCAnywhere แบบช้าๆซึ่งการทำอะไรผ่าน GUI นั้นแย่มากดังนั้นฉันแค่สงสัยว่ามีวิธีแก้ปัญหาที่ดีกว่าหรือเปล่า


1
จะเกิดอะไรขึ้นเมื่อคุณ `dir h: \ '
wfaulk

3
ในสถานที่ของการพิมพ์ "เริ่มต้น <enter>." คุณก็สามารถทำ win-E และบันทึกการกดแป้นพิมพ์ 5 ;-)
fretje

1
ฉัน "แก้ไข" โดยใช้เส้นทาง \\ server \ share แทนไดรฟ์ที่แมป คุณสามารถคัดลอกไฟล์ได้หากต้องการ (นั่นเป็นปัญหาของฉัน)
Peterdk

คำตอบ:


12

อาจจะลองpushd \\server\share?


2
ฉันไม่แน่ใจว่านี่คือสิ่งที่ฉันต้องการ Pushd ดูเหมือนว่าจะสร้างตัวอักษรไดรฟ์ชั่วคราว ฉันมีอักษรชื่อไดรฟ์อยู่แล้ว แต่การแบ่งปันถูกตัดการเชื่อมต่อ (มี X สีแดงใน explorer และมีข้อความระบุว่า "Disconnected Network Drive") บางทีฉันอาจเข้าใจผิด
สตีเฟ่นเจนนิงส์

ใช่ฉันคิดว่าการเข้าถึงวิธีดังกล่าวอาจกระตุ้นให้ไดรฟ์ทำการเชื่อมต่อใหม่ คุณสามารถใช้popdเพื่อลบอักษรระบุไดรฟ์
wfaulk

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

2
ฉันลองมันและมันใช้งานได้จริง ฉันแรกวิ่ง pushd เพื่อแบ่งปันแล้ว popd เพื่อ unmap อักษรชื่อไดรฟ์พิเศษและฉันพบว่าไดรฟ์ที่แมปฉันต้องการเชื่อมต่ออีกครั้ง นี่เป็น upvote แน่นอนและถ้าฉันไม่ได้รับคำตอบสั้น ๆ ในสองสามวันนี้จะได้รับการยอมรับ
สตีเฟ่นเจนนิงส์

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

8

ฉันต้องเริ่ม Windows 7 ก่อนจึงจะสามารถเรียกใช้โปรแกรม VPN ที่เชื่อมต่อฉันกับไดรฟ์เครือข่ายของ บริษัท ดังนั้นไดรฟ์เครือข่ายของฉันไม่เชื่อมต่อใหม่โดยอัตโนมัติเปิดเฉพาะใน Windows Explorer เชื่อมต่อใหม่อีกครั้ง

ฉันสร้างไฟล์แบตช์ขนาดเล็กเพื่อเริ่มต้น VPN เชื่อมต่อไดรฟ์เครือข่ายอีกครั้งและเริ่มต้นแอปพลิเคชันที่ฉันใช้อยู่เสมอ

ในไฟล์แบทช์ของฉันฉันมีดังต่อไปนี้:

REM Connect VPN here...

REM Opens an Explorer window looking at T: forcing a reconnect
Start /min explorer t:\

timeout 3 /nobreak

REM Kill all Explorer windows beginning with "T_drive" in the title
Taskkill /fi "windowtitle eq T_drive*"

REM Finish starting up here...

exit

Taskkill /fi "windowtitle eq"คำสั่งเป็นกรณีที่สำคัญ!


ขอบคุณชายนี่เป็นคำตอบเดียวของกระทู้ทั้งหมดที่ช่วยฉัน แน่นอนฉันยกมันขึ้นมา แต่ฉันยังไม่มีความสามารถ downvote สำหรับโพสต์เหล่านั้นเหนือคุณ
prl77

Btw ฉันไม่พบ "taskkill" ที่มีความไวของตัวพิมพ์เล็กอย่างน้อยก็ไม่ใช่ Win 7 x64 ที่มี patch ล่าสุด
prl77

หมายเหตุ: หากพารามิเตอร์ taskkill ด้านบนไม่ได้ผลสำหรับคุณลองใช้ TASKLIST / FI "IMAGENAME eq explorer.exe" / V เพื่อดูว่าชื่อหน้าต่างที่ถูกต้องคืออะไร สตริงตัวกรองของฉันสำหรับ TASKKILL จบลงด้วยการเป็น "windowtitle eq c $ *"
ลุค

ขอบคุณลุคสำหรับความคิดเห็นของคุณ มันช่วยฉันได้จริงๆ
Pawel

7

สร้างแบตช์ไฟล์ (refreshletters.cmd) ด้วยคำสั่งเหล่านี้

( สิ่งเหล่านี้จะทำงานภายในไฟล์แบตช์เท่านั้น )

ทดสอบบน Win7 และ XP เพื่อรีเฟรชตัวอักษรไดรเวอร์ 'Disconnected' และ 'Unavailable' ในหน้าต่างคอนโซล (บรรทัดคำสั่ง)

@echo off
net use |FIND ":" > %temp%\used.txt
FOR /F " tokens=1,2,3 delims= " %%i in (%temp%\used.txt) do (

  if %%i EQU Unavailable  (
    net use %%j %%k
    echo Activated %%j
   ) ELSE (
     if %%i EQU Disconnected (
       pushd .
       cd /d %%j
       dir . %>nul
       if NOT exist %%j\. (
          net use %%j /del /y
          net use %%j %%k
          echo Remapped %%j
          ) else (
             echo Fixed-up %%j
            )
       popd
       ) ELSE (
          echo Checked %%j
          )
     )
 )

เนื่องจากเราไม่ทราบระดับความเชี่ยวชาญของ OP อาจเป็นความคิดที่ดีที่จะขยายคำตอบของคุณ
Tog

net useทำงานได้สำหรับฉันสำหรับไดรฟ์ที่แมปไม่พร้อมใช้งานใน Win7 ty
Mat M

1
ฉันยังไม่มีความสามารถในการดาวน์โหลดต่ำ แต่คำตอบนี้ไม่ได้ช่วยอะไรฉัน ดูโพสต์ด้านล่างโดย Claus Melander ซึ่งทำ ฉันยังแสดงความคิดเห็นที่นั่น
prl77

1
มันทำงานได้ (ทดสอบกับ win7 x64) แต่มันก็ขึ้นอยู่กับการส่งออกขึ้นอยู่กับภาษาของตามที่มันจะสแกนหาnet use Unavailableแต่สำหรับ win7 ภาษาเยอรมันคุณจะได้รับNicht verfgbคุณจะต้องแก้ไขวิธีแก้ปัญหาให้เป็นภาษาของคุณ
jeb

สิ่งนี้ได้ผลสำหรับฉันยกเว้นสำหรับการแชร์หนึ่งครั้งที่มีช่องว่างในเส้นทางเครือข่าย ... อย่างไรก็ตามฉันเพิ่งลงเอยด้วยการทำโค้ด "net use X: \\ share \ path" ในแบตช์ไฟล์และฉัน จะทำให้เป็นปัจจุบันถ้าฉันเปลี่ยนการแมปไดรฟ์ นี่เป็นทางออกที่ดีที่สุดสำหรับฉันเพราะฉันไม่ต้องการให้เปิดหน้าต่าง Explorer เพื่อให้ไดรฟ์เชื่อมต่อใหม่ ...
Aaron

6

นี่อาจเป็นคำถามที่โง่ แต่สมมติว่าไดรฟ์ "ที่ไม่เชื่อมต่อ" ของคุณคือ H: คุณเคยลองเปลี่ยนเป็นไดรฟ์โดยตรงหรือไม่

มันใช้งานได้สำหรับฉันภายใต้ XPSP3:

C:\>net use
New connections will be remembered.


Status       Local     Remote                    Network

-------------------------------------------------------------------------------
Disconnected H:        \\xxxxxx\wfaulk           Microsoft Windows Network
OK                     \\xxxxxxx\business        Microsoft Windows Network
The command completed successfully.


C:\>h:

H:\>net use
New connections will be remembered.


Status       Local     Remote                    Network

-------------------------------------------------------------------------------
OK           H:        \\xxxxxx\wfaulk           Microsoft Windows Network
OK                     \\xxxxxxx\business        Microsoft Windows Network
The command completed successfully.

2
พรอมต์คำสั่งไม่อนุญาตให้คุณเปลี่ยนเป็นไดรฟ์เครือข่ายที่ถูกตัดการเชื่อมต่อในขณะนี้ อย่างน้อยไม่ได้อยู่ในคอมพิวเตอร์หลายร้อยเครื่องที่ฉันใช้สิ่งนี้ใน (WinNT, Win2k, WinXP, WinXP ฝังตัว)
สตีเฟ่น Jennings

1
แปลก. ฉันสาบานว่ามันใช้ได้สำหรับฉัน
wfaulk

มันเหมาะกับฉันเช่นกัน!
Snark

ฉันยอมรับว่าฉันได้เห็นงานนี้เป็นครั้งคราว แต่ส่วนใหญ่ไม่ได้ทำงาน ฉันไม่รู้ว่าอะไรเป็นตัวกำหนดทางใดทางหนึ่งหรืออาจเป็นไปได้ว่ามีข้อมูลรับรองที่บันทึกไว้หรือไม่
สตีเฟ่นเจนนิงส์

1
โอ้ฉันพนันได้เลยว่ามัน ฉันกำลังตรวจสอบสิทธิ์โดยอัตโนมัติโดยใช้ข้อมูลรับรองโดเมนของฉัน
wfaulk

4

ฉันรู้ว่าคุณพูดว่า "การใช้เน็ต" ไม่ได้ผลสำหรับคุณ - แต่นี่คือสิ่งที่คุณสามารถลองได้

เรียกใช้ไฟล์แบตช์ที่มีตัวเลือก net use / DELETE เพื่อลบการเชื่อมต่อที่มีอยู่ / ถาวรและจากนั้นคุณสามารถใช้ net use พร้อมกับตัวเลือก / SAVECRED เพื่อใช้งานข้อมูลประจำตัว passowd ที่ใช้ซ้ำอีกครั้งเมื่อเข้าสู่ระบบสำเร็จ ฉันไม่แน่ใจว่าสิ่งนี้จะแก้ปัญหาของคุณได้หรือไม่


นี่ไม่ใช่สิ่งที่ฉันต้องการ แต่นี่เป็นเรื่องที่ควรรู้ นี่เป็นการแก้ปัญหาอื่นที่ฉันมี
สตีเฟ่นเจนนิงส์

2

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

ฉันได้สร้างไฟล์แบตช์ชื่อ ex.bat และเก็บไว้ (พร้อมกับสิ่งอื่น ๆ ) ในไดเรกทอรี \ util ที่ฉันใส่ในเส้นทางของฉัน ฉันสามารถพิมพ์ "ex h:" และมันจะเรียกใช้ Windows Explorer และตั้งค่าให้ตรงไปที่ไดรฟ์ h: นี่คือไฟล์แบทช์:

start explorer /e,/select,%1

ใช้ได้ดีกับการกดแป้นน้อยกว่ามาก หรือถ้ามันไม่ทำงานในตอนแรกให้กดปุ่ม Enter เพื่อเปิดโฟลเดอร์ h: root และแสดงเนื้อหา หรือพิมพ์ "ex h: \ sub" โดยที่โฟลเดอร์ย่อย "sub" มีอยู่

ปัญหานี้ดูเหมือนจะเลวร้ายลงมากเมื่อเร็ว ๆ นี้อาจเป็นเพราะหนึ่งในแพตช์ความปลอดภัยของ Windows XP

อีกสิ่งที่ควรลองคือด้านเซิร์ฟเวอร์ บนเซิร์ฟเวอร์ Windows การปรับเปลี่ยนคีย์รีจิสทรีควรจะป้องกันไม่ให้เซิร์ฟเวอร์ยกเลิกการเชื่อมต่อการเชื่อมต่อในการหมดเวลา ฉันทำสิ่งนี้กับเซิร์ฟเวอร์ของเราทั้งหมด ไฟล์คือ:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]
"autodisconnect"=dword:ffffffff

จากกระบวนการที่เรียกใช้ในฐานะผู้ใช้รายอื่นจะใช้งานได้start explorerก็ต่อเมื่อผู้ใช้ทั้งสองมีการตั้งค่า "เรียกใช้หน้าต่างโฟลเดอร์ในกระบวนการแยกต่างหาก"
ivan_pozdeev

1

ฉันมีปัญหาที่คล้ายกันและค้นพบว่าฉันสามารถบังคับให้เชื่อมต่อใหม่ด้วย "dir x:" อย่างง่ายจากบรรทัดคำสั่ง (โดยที่ X: เป็นไดรฟ์ที่แมป แต่ไม่ได้เชื่อมต่อ) นี่คือจากระบบ Server 2003 ถึงแมปไดรฟ์บน XP และ Win7 คอมพิวเตอร์

ฉันสร้างไฟล์แบตช์ wake_network_drives.bat ด้วยสองบรรทัดนี้:

    dir x:
    dir z:

และตั้งค่าภารกิจตามกำหนดเวลาให้รันทุกคืนก่อนโปรแกรมสำรองข้อมูลที่ล้มเหลวเนื่องจากไดรฟ์บางครั้งแสดงว่าถูกตัดการเชื่อมต่อ


วิธีนี้ใช้ได้ผล แม้ว่าdirคำสั่งจะให้ข้อผิดพลาดแก่คุณ แต่ก็มีแนวโน้มที่จะปลุกไดรฟ์เครือข่ายที่ไม่ได้เชื่อมต่อ นี่คือคำตอบที่ดีที่สุดของพวกเขาทั้งหมด
Elliot Cameron

0

เพียงพิมพ์:

NET USE H: \\server\share

(โดยที่ H: เป็นอักษรระบุไดรฟ์ของคุณ)

พิมพ์ 'NET /? ใช้ 'เพื่อดูตัวเลือกทั้งหมดที่คำสั่งนี้ให้คุณ


สิ่งนี้ใช้ไม่ได้ อักษรชื่อไดรฟ์ได้รับการแมปแล้วมันเพิ่งจะถูกยกเลิกการเชื่อมต่อ เมื่อคุณเรียกใช้สิ่งนี้มันจะบ่นว่าอุปกรณ์นั้นมีการใช้งานแล้ว
Stephen Jennings

ใช่ฉันทดสอบสิ่งนี้ในตอนนี้และได้รับ "ชื่ออุปกรณ์ท้องถิ่นที่ใช้งานอยู่แล้ว"
สตีเฟ่นเจนนิงส์

1
มันใช้งานได้สำหรับฉัน ... แต่ฉันใช้ Windows 7 และจริง ๆ แล้วไดรฟ์เชื่อมต่อใหม่ด้วยตัวเอง ... ลองใช้ NET H: เรียบง่าย (ไม่มีเส้นทาง) ที่ควรนำการเชื่อมต่อกลับมา ฉันลืมไปว่ามันเคยเป็นใน XP
Zoran

0

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

net use H: /delete
net use H: \\server\share /user:domain\user password /persistent:yes

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


ในฐานะที่เป็น It Pro ฉันกำลังศัตรูทั้งสำหรับตัวเองและสำหรับผู้ใช้ของฉัน
ivan_pozdeev

0

สรุป TL; DR:ใช้net useและif exist

ฉันพบปัญหาที่เกี่ยวข้องขณะสร้างสคริปต์สำรองข้อมูลทุกคืน ต้องตรวจสอบว่าคอมพิวเตอร์เปิดอยู่ (โดยใช้ ping) ส่งแพ็กเก็ตเวทย์มนตร์เพื่อเปิดใช้ถ้าจำเป็น (ใช้MC-WOL ) รอให้ Windows บูตจากนั้นสร้างการเชื่อมต่อกับการแชร์ SMB และรอ ที่จะนำเสนอ

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

นี่เป็นโค้ดที่อาจเป็นประโยชน์กับคุณ:

set TARGET_IP=192.168.1.3
set TARGET_PATH=\\%TARGET_IP%\d$\backups
set ATTEMPTS=0

:LOOP

REM Give up eventually
if %ATTEMPTS% GEQ 200 goto NOJOY

REM Wait for IP connectivity to host, and/or burn up a couple seconds before retry
ping -n 1 -w 2000 %TARGET_IP% | find "TTL" > nul
if errorlevel 1 set /a ATTEMPTS+=1 & goto LOOP

REM See if we're already connected, and try to give it a kick
if exist %TARGET_PATH% goto CONNECTED

REM Try to reconnect
net use %TARGET_PATH% > nul
if errorlevel 1 set /a ATTEMPTS+=1 & goto LOOP

:CONNECTED
echo Connected
exit /b

:NOJOY
echo Couldn't connect

หากคุณต้องการคุณสามารถแทนที่ที่อยู่ IP ข้างต้นด้วยชื่อโฮสต์ (เช่นserver1)

net useจำเป็นในกรณีที่ไม่มีการเชื่อมต่อที่มีอยู่ ฉันพบว่ามีบางกรณีที่มุมมันไม่เพียงพอที่จะ "ปลุก" การแบ่งปัน (เช่นหากมีการเชื่อมต่อก่อนหน้านี้อยู่ในสถานะที่ไม่ได้เชื่อมต่อ) ผมพบว่าif existsคำสั่งมีผลเช่นเดียวกับทางเลือกที่ระบุไว้ในคำตอบอื่น ๆ (เช่นpushd, dir, Explorerฯลฯ ) แต่ดูเหมือนว่ามันจะเบาน้ำหนักวิธี


0

คำตอบจาก StanZ ได้ผลสำหรับฉัน แต่ฉันต้องสามารถกำหนดไดรฟ์ที่แมปโดยไม่มีสถานะเป็น OK โดยทางโปรแกรมเนื่องจากผู้ใช้ในโดเมนของเราได้รับการแมปไดรฟ์ที่แตกต่างกัน ฉันเขียนโค้ดที่นี่เพื่อทำงานเป็นเวอร์ชันสแตนด์อโลนซึ่งรันnet useก่อนและหลังรหัสจริงเพื่อให้คุณเห็นผลลัพธ์ แต่คุณต้องคัดลอกหนึ่งFORคำสั่ง (สามบรรทัด) ลงในโค้ดของคุณเพื่อรับผลลัพธ์ที่ต้องการ

@ECHO OFF
::  
:: revision of answer from StanZ on superuser.com at the following url  
:: https://superuser.com/questions/52595/can-a-mapped-network-drive-be-reconnected-from-the-command-line/367910#367910  
:: https://superuser.com/a/367910  
:: which resulted in my  
::  
:: DriveStatusOK.bat  
:: iCharlieC  
::  
SETLOCAL ENABLEEXTENSIONS  
::  
:: you need only copy the one FOR statement (three lines)  
::   to use in your own code  
::   to force status of mapped network drives to OK  
::  
:: "tokens=1-2 delims=: " is used in the for statement  
:: to output only the drive letter from the output of...  
:: net use  
:: is piped to the first findstr which outputs only lines with drive letters  
::   then piped to another findstr to eliminate drives with a status of OK  
::   then piped to another findstr to get lines that start with a status  
::     -in other words, those lines that the first character is a letter-  
::     -this due to the fact that in our domain we have a drive  
::      that is mapped to a letter, but never has a status.  
::      I do not know the reason for this,  
::      but adding that last findstr prevents me from getting an error  
::      from trying to execute a dir on a non-existant drive letter.-  
::   then dir is executed on each drive letter (after appending ":\" to the letter)  
::      and the output redirected to NUL  
::  
:: run net use before as a visual here  
net use  
::  
FOR /F "tokens=1-2 delims=: " %%i in (  
    'net use ^| findstr ":" ^| findstr /i /v "^OK" ^| findstr /i "^[A-Z]"'  
    ) do dir "%%j:" > NUL  
::  
:: run net use after "waking" drive(s)  
net use  
::  
ENDLOCAL  

0

อาจเป็นคำถามเก่า แต่ยังคงมีความเกี่ยวข้องในปี 2560 และ Windows 10 เนื่องจากการแชร์เครือข่ายมักจะไม่เชื่อมต่อใหม่หรือเชื่อมต่อกับ Windows ด้วยเหตุผลที่แตกต่างกัน จากปัญหานี้และการไม่มีวิธีแก้ปัญหาที่เป็นไปได้จริงและเต็มรูปแบบฉันได้สร้างโครงการ Github ซึ่งมี Task Scheduler และ VBS ที่แก้ปัญหาได้โดยเพียงพยายามเชื่อมต่อไดรฟ์อีกครั้งหลังจากที่ดำเนินการต่อหรือเข้าสู่ระบบออนไลน์

สคริปต์สามารถกำหนดค่าได้อย่างสมบูรณ์และสามารถตั้งค่าได้ตามความต้องการของผู้ใช้งานจริง

พา ธ ไปยังโครงการ Github

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.