แมปไดรฟ์เครือข่ายที่บริการจะใช้


213

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


6
ดูคำตอบของ ForcePush วิธีแก้ปัญหาของเขาทำงานได้
Ubikuity

คำตอบ:


44

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

กระบวนการของผู้ช่วยนั้นค่อนข้างง่าย: เพียงแค่สร้างบริการใหม่ที่แมปไดรฟ์และเริ่มบริการ 'ของจริง' สิ่งเดียวที่ไม่น่าสนใจเลยคือ

  • บริการช่วยเหลือจะต้องส่งคำสั่ง SCM ที่เหมาะสม (เริ่ม / หยุด ฯลฯ ) ไปยังบริการจริง หากบริการจริงยอมรับคำสั่ง SCM ที่กำหนดเองอย่าลืมส่งคำสั่งเหล่านั้นด้วย (ฉันไม่คาดหวังบริการที่พิจารณาเส้นทาง UNC ที่แปลกใหม่เพื่อใช้คำสั่งดังกล่าวแม้ว่า ...

  • สิ่งที่อาจได้รับข้อมูลประจำตัวที่ยุ่งยากเล็กน้อย หากบริการจริงทำงานภายใต้บัญชีผู้ใช้ปกติคุณสามารถเรียกใช้บริการผู้ช่วยภายใต้บัญชีนั้นได้เช่นกันและทั้งหมดควรจะใช้ได้ตราบใดที่บัญชีนั้นมีการเข้าถึงเครือข่ายแชร์ที่เหมาะสม หากบริการจริงจะใช้งานได้เมื่อทำงานเป็น LOCALSYSTEM หรือ somesuch เท่านั้นสิ่งต่าง ๆ น่าสนใจยิ่งขึ้นเนื่องจากจะไม่สามารถ 'เห็น' ไดรฟ์เครือข่ายได้เลยหรือต้องการการเล่นกลข้อมูลรับรองเพื่อให้ทำงานได้


2
มีข้อมูลมาก ... ฉันถูกต้องหรือไม่ถ้าสมมติว่าสคริปต์การเข้าสู่ระบบนั้นใช้สำหรับเซสชันการเข้าสู่ระบบแบบโต้ตอบเท่านั้นและไม่ใช่สำหรับการบริการ
VoidPointer

220

ใช้สิ่งนี้ด้วยความเสี่ยงของคุณเอง (ฉันได้ทดสอบกับ XP และ Server 2008 x64 R2)

สำหรับแฮ็คนี้คุณจะต้องใช้SysinternalsSuite โดย Mark Russinovich :

ขั้นตอนที่หนึ่ง: เปิดพรอมต์ cmd.exe (เรียกใช้ในฐานะผู้ดูแลระบบ)

ขั้นตอนที่สอง: ยกระดับอีกครั้งเพื่อรากใช้ PSExec.exe: นำทางไปยังโฟลเดอร์ที่มี SysinternalsSuite และรันคำสั่งต่อไปนี้ psexec -i -s cmd.exe คุณอยู่ตอนนี้ภายในของพรอมต์ที่เป็นและคุณสามารถพิสูจน์เรื่องนี้โดยการพิมพ์nt authority\system เป็นสิ่งจำเป็นเพราะแมปไดรฟ์ต้องในการโต้ตอบกับผู้ใช้whoami-i

ขั้นตอนที่สาม: สร้างไดรฟ์ที่แมปแบบถาวรเป็นบัญชีระบบด้วยคำสั่งต่อไปนี้ net use z: \\servername\sharedfolder /persistent:yes

มันง่ายมาก!

คำเตือน : คุณสามารถลบการแมปนี้ในแบบเดียวกับที่คุณสร้างขึ้นได้จากบัญชีระบบ หากคุณต้องการที่จะลบออกทำตามขั้นตอนที่ 1 และ 2 แต่เปลี่ยนคำสั่งในขั้นตอนที่ net use z: /delete3

หมายเหตุ : ไดรฟ์ที่เพิ่งสร้างใหม่จะปรากฏขึ้นสำหรับผู้ใช้ทุกคนในระบบนี้ แต่พวกเขาจะเห็นมันปรากฏเป็น "Disconnected Network Drive (Z :)" อย่าปล่อยให้ชื่อหลอกคุณ มันอาจอ้างว่าถูกตัดการเชื่อมต่อ แต่มันจะทำงานสำหรับทุกคน นั่นเป็นวิธีที่คุณสามารถบอกได้ว่าแฮ็คนี้ไม่รองรับ M $


3
ฉันพยายามใช้วิธีแก้ปัญหานี้และพบปัญหานี้: ไดรฟ์ที่แมปปรากฏขึ้นเมื่อไม่ได้เชื่อมต่อกับผู้ใช้ (แม้กระทั่งผู้ดูแลระบบ) ข้อเสนอแนะใด ๆ
Constantin Baciu

7
หลังจากรีบูตไดรฟ์ที่แมปจะหายไป ความคิดใด ๆ การทำแผนที่ยังคงอยู่ แต่สถานะเป็น "ไม่พร้อมใช้งาน" ดังนั้นจึงไม่ปรากฏขึ้น
Tommy

4
ฉันเห็นการทำแผนที่ว่าใช้งานไม่ได้หลังจากรีบูต
Dave Patterson

33
หากต้องการให้มันทำงานหลังจากรีบูตให้สร้างสคริปต์ที่มีnet use z: \\servername\sharedfolderและตั้งค่าให้ทำงานเมื่อเริ่มต้นคอมพิวเตอร์ตามtechnet.microsoft.com/en-us/library/cc770556.aspxสิ่งนี้จะทำงานเป็นบัญชีระบบดังนั้นจึงไม่จำเป็นต้อง psexec
TRS-80

2
ฉันต้องการเพิ่มว่าเป็นสิ่งสำคัญที่ทุกคนใช้ clause /USER:[remotecomp]\[remoteusername] [password](คำสั่งทำงานไม่ถูกต้องในบางครั้งเมื่อชื่อผู้ใช้ระยะไกลไม่ได้นำหน้าด้วยชื่อคอมพิวเตอร์ระยะไกลและแบ็กสแลชมาก่อนนอกจากนี้หากใช้ร่วมกันได้รับการป้องกันด้วยรหัสผ่าน ขับรถก็เป็นสิ่งที่ไม่สามารถเข้าถึงได้สำหรับทุกคนใดที่ใช้ในระบบที่ที่ระบบเมาท์หุ้นต้องรู้รหัสผ่านเพื่อใช้ร่วมกัน (การทดสอบเกี่ยวกับ XPx64)..
Kitet

65

ฉันพบโซลูชันที่คล้ายคลึงกับ psexec แต่ทำงานได้โดยไม่ต้องใช้เครื่องมือเพิ่มเติมและสามารถรีบูตได้

เพียงเพิ่มงานที่กำหนดไว้แล้วใส่ "system" ในฟิลด์ "run as" และชี้งานไปที่ไฟล์แบตช์ด้วยคำสั่งง่าย ๆ

net use z: \servername\sharedfolder /persistent:yes

จากนั้นเลือก "ทำงานเมื่อเริ่มต้นระบบ" (หรือคล้ายกันฉันไม่มีเวอร์ชันภาษาอังกฤษ) และคุณทำเสร็จแล้ว


สิ่งที่เริ่มต้นก่อน บริการ windows หรืองานที่กำหนดเวลานี้ บริการของเราตายเมื่อเริ่มต้นหากเส้นทางไม่พร้อมใช้งาน เราต้องสร้างใหม่หากบริการเริ่มต้นล่าสุด
โทมัส

1
ฉันลองสิ่งนี้ในปี 2008 R2 มันสร้าง Disconnected Mapped Drive และเมื่อฉันพยายามที่จะเปิดมันก็บอกว่า "z: \ ไม่สามารถเข้าถึงได้การเข้าสู่ระบบล้มเหลว: ชื่อผู้ใช้หรือรหัสผ่านไม่ดี" แต่ฉันสามารถสร้างไดรฟ์ที่แมปได้สำเร็จด้วยการรันไฟล์แบ็ตเดียวกันด้วยตนเอง เข้าใจอย่างถ่องแท้ใช่ไหม
Gopi

1
@ โทมัสมันไม่สำคัญว่าการเริ่มต้นครั้งแรกจะทำให้งานถูกเรียกใช้อย่างน้อยหนึ่งครั้งเนื่องจากการ/persistent:yes
Edd

4
ทำไมมันต้องเป็นงานที่กำหนดเวลาไว้? มันคือ / ถาวร: ใช่ไม่พอที่จะให้มันไปรอบ ๆ ?
Scott Stafford

2
@ScottStafford ไม่ / ขัดขืน: ใช่ไม่เพียงพอใน Win7 และใหม่กว่า การแมปจะถูกลบออกหลังจากรีบูตโดยไม่คำนึงถึงสวิตช์นั้น
Eternal21 21

44

วิธีที่ดีกว่าคือการใช้ลิงค์สัญลักษณ์โดยใช้ mklink.exe คุณสามารถสร้างลิงค์ในระบบไฟล์ที่แอพใด ๆ สามารถใช้ได้ ดูhttp://en.wikipedia.org/wiki/NTFS_symbolic_link


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

1
นี่เป็นคำตอบที่ดีกว่าสำหรับคำถามขอบคุณมาก!
Sten Petrov

3
น่าเสียดายถ้าลิงก์ sym เข้าถึงเครือข่ายแชร์คุณจะกลับไปที่ช่องสี่เหลี่ยมหนึ่ง
davidfrancis

23

มีคำตอบที่ดีที่นี่: https://superuser.com/a/651015/299678

เช่นคุณสามารถใช้ลิงก์สัญลักษณ์เช่น

mklink /D C:\myLink \\127.0.0.1\c$

1
ถ้าคุณได้รับหลังจากพยายามสร้างไดเรกทอรีจากข้อผิดพลาดในการอนุญาตใช้บริการ
tyoc213

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

@ tyoc213 คุณได้รับคำตอบหรือไม่?
Lsakurifaisu

9

คุณสามารถใช้คำสั่ง 'net use':

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

หากไม่ได้ทำงานในบริการลอง Winapi และ PInvoke WNetAddConnection2

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


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

ฉันคิดว่า <disclaim> ควร </disclaim> - มีเพียงสภาพแวดล้อมเดียวสำหรับแต่ละเซสชันของ winlogon
Treb

รหัสของคุณทำงานในบริการ ฉันมาที่นี่ด้วยปัญหาเดียวกันกับ OP แต่ฉันเป็นผู้เขียนบริการ คำตอบของคุณแก้ไขปัญหาของฉัน
Joe Gayetty

5

ForcePush,

หมายเหตุ : ไดรฟ์ที่เพิ่งสร้างใหม่จะปรากฏขึ้นสำหรับผู้ใช้ทุกคนในระบบนี้ แต่พวกเขาจะเห็นมันปรากฏเป็น "Disconnected Network Drive (Z :)" อย่าปล่อยให้ชื่อหลอกคุณ มันอาจอ้างว่าถูกตัดการเชื่อมต่อ แต่มันจะทำงานสำหรับทุกคน นั่นเป็นวิธีที่คุณสามารถบอกได้ว่าแฮ็คนี้ไม่รองรับ M $ ...

ทุกอย่างขึ้นอยู่กับการอนุญาตการแชร์ หากคุณมีสิทธิ์การแชร์ทุกคนไดรฟ์ที่แมปนี้จะสามารถเข้าถึงได้โดยผู้ใช้รายอื่น แต่ถ้าคุณมีผู้ใช้บางรายเท่านั้นที่มีข้อมูลประจำตัวที่คุณใช้ในสคริปต์ชุดงานของคุณและสคริปต์ชุดนี้ถูกเพิ่มลงในสคริปต์เริ่มต้นบัญชีระบบเท่านั้นที่จะสามารถเข้าถึงส่วนแบ่งนั้นไม่ใช่แม้แต่ผู้ดูแลระบบ ดังนั้นหากคุณใช้งาน ntbackuo ตามกำหนดเวลาบัญชีระบบจะต้องใช้ใน 'Run as' หากบริการของคุณเป็น 'เข้าสู่ระบบในฐานะ: บัญชี Local System' มันควรจะทำงาน

สิ่งที่ฉันทำฉันไม่ได้แมปอักษรระบุไดรฟ์ในสคริปต์เริ่มต้นของฉันเพียงใช้net use \\\server\share ...และใช้เส้นทาง UNC ในงานที่กำหนดเวลาไว้ เพิ่มสคริปต์การเข้าสู่ระบบ (หรือเพิ่มไฟล์แบตช์ลงในโฟลเดอร์เริ่มต้น) ด้วยการแมปไปยังการแชร์เดียวกันด้วยตัวอักษรชื่อไดรฟ์: net use Z: \\\...ด้วยข้อมูลรับรองเดียวกัน ขณะนี้ผู้ใช้ที่เข้าสู่ระบบสามารถดูและเข้าถึงไดรฟ์ที่แมปได้ มีคนรู้จัก 2 คนในการแชร์เดียวกัน ในกรณีนี้ผู้ใช้จะไม่เห็นว่า "Disconnected network drive ... " น่ารำคาญ แต่ถ้าคุณต้องการเข้าถึงการแชร์นั้นด้วยตัวอักษรชื่อไดรฟ์ไม่ใช่แค่ UNC แผนที่ที่แชร์กับตัวอักษรไดรฟ์อื่นเช่น Y สำหรับ System และ Z สำหรับผู้ใช้


4

ค้นพบวิธีที่จะอนุญาตให้ Windows Service เข้าถึง Network Drive

ใช้ Windows Server 2012 ด้วย NFS Disk ตัวอย่างเช่น

ขั้นตอนที่ 1: เขียนไฟล์ Batch ไปที่ Mount

เขียนแบตช์ไฟล์เช่น: C: \ mount_nfs.bat

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

ขั้นตอนที่ 2: ติดตั้งดิสก์เป็น NT AUTHORITY / SYSTEM

เปิด "Task Scheduler" สร้างงานใหม่:

  1. ทำงานเป็น "SYSTEM" ที่ "System Startup"
  2. สร้างการทำงาน: เรียกใช้ "C: \ mount_nfs.bat"

หลังจากสองขั้นตอนง่าย ๆ บริการ Windows ActiveMQ ของฉันทำงานภายใต้สิทธิพิเศษ "Local System" ทำงานได้อย่างสมบูรณ์แบบโดยไม่ต้องเข้าสู่ระบบ


3

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

อาจมีวิธีแก้ไขปัญหานี้สองวิธี

  1. เพื่อแมปไดรฟ์ให้คงอยู่ดังที่ได้ชี้ไปแล้ว

  2. มีอีกวิธีหนึ่งที่สามารถติดตามได้ หากคุณเปิดผู้จัดการบริการโดยพิมพ์ 'services.msc'you คุณสามารถไปที่บริการของคุณและในคุณสมบัติของบริการของคุณมีแท็บเข้าสู่ระบบที่คุณสามารถระบุบัญชีเป็นบัญชีอื่นที่ไม่ใช่' ระบบ 'คุณสามารถ เริ่มบริการจากบัญชีผู้ใช้ของคุณเองหรือผ่าน 'บริการเครือข่าย' เมื่อคุณทำสิ่งนี้ .. บริการนี้สามารถเข้าถึงส่วนประกอบเครือข่ายและไดรฟ์ได้แม้ว่าจะยังไม่ขัดจังหวะก็ตาม เพื่อให้บรรลุตามวัตถุประสงค์นี้โดยทางโปรแกรมคุณสามารถตรวจสอบฟังก์ชั่น 'CreateService' ได้ที่ http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspxและสามารถตั้งค่าพารามิเตอร์ 'lpServiceStartName' เป็น 'NT AUTHORITY \ NetworkService' นี่จะเป็นการเริ่มบริการของคุณภายใต้ 'บริการเครือข่าย'

  3. คุณสามารถลองใช้บริการแบบโต้ตอบโดยระบุ SERVICE_INTERACTIVE_PROCESS ในการตั้งค่าพารามิเตอร์ servicetype ของฟังก์ชัน CreateService () ของคุณ แต่จะถูก จำกัด จนถึง XP เป็น Vista และ 7 donot รองรับคุณสมบัตินี้

หวังว่าโซลูชันจะช่วยคุณ .. แจ้งให้เราทราบว่าสิ่งนี้ได้ผลสำหรับคุณหรือไม่


1

คุณไม่ต้องการเปลี่ยนผู้ใช้ที่บริการดำเนินการภายใต้ "ระบบ" หรือค้นหาวิธีการทำแผนที่ในระบบ

สิ่งที่ตลกคือสามารถทำได้โดยใช้คำสั่ง"at"เพียงกำหนดการแมปไดรฟ์ของคุณหนึ่งนาทีในอนาคตและจะทำงานภายใต้บัญชีระบบเพื่อให้บริการของคุณมองเห็นไดรฟ์


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

1

แทนที่จะพึ่งพาไดรฟ์แบบถาวรคุณสามารถตั้งค่าสคริปต์เพื่อแมป / ถอนการแมปไดรฟ์ทุกครั้งที่คุณใช้งาน:

net use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
net use Q: /delete

มันใช้งานได้สำหรับฉัน


0

ฉันยังไม่สามารถแสดงความคิดเห็น (ทำงานกับชื่อเสียง) แต่สร้างบัญชีเพียงเพื่อตอบ @Tech Jerk @ spankmaster79 (ชื่อที่ดี lol) และปัญหา @NMC ที่พวกเขารายงานในการตอบกลับไปที่ "ฉันพบวิธีแก้ปัญหาที่คล้ายกับ psexec แต่ทำงานได้โดยไม่ต้องใช้เครื่องมือเพิ่มเติมและจะสามารถรีบูตได้ " โพสต์ @ แลร์รี่ทำแล้ว

วิธีการแก้ปัญหานี้คือเพียงแค่เรียกดูโฟลเดอร์นั้นจากภายในบัญชีที่ลงชื่อเข้าใช้เช่น:

    \\servername\share  

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

    \\123.456.789.012\share 

มันอาจหลีกเลี่ยงปัญหาโดยสิ้นเชิง

ถ้าฉันเคยได้รับคะแนนตัวแทนเพียงพอที่นี่ฉันจะเพิ่มนี่เป็นคำตอบแทน

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