Windows Service: ฉันสามารถกำหนดค่าไดเรกทอรีการทำงานปัจจุบันได้หรือไม่?


11

ตามค่าเริ่มต้นบริการ Windows จะเริ่มต้นในไดเรกทอรี sytem32 (ปกติC:\WINDOWS\system32)

มีวิธีการตั้งค่าไดเรกทอรีการทำงานที่แตกต่างกันหรือไม่? HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeServiceฉันคิดของพารามิเตอร์ของรีจิสทรีบางใต้

ดังนั้น - สามารถทำได้หรือไม่


3
@ Tomalak: เป็นบริการที่คุณเขียนหรือไม่? คุณสามารถทำได้ด้วยรหัส แต่ฉันไม่คิดว่าจะมีวิธีการตั้งค่าบริการ
MattB

ไม่มันไม่ใช่บริการที่ฉันเขียน ฉันหวังว่าจะมีการตั้งค่ารีจิสทรีที่รู้จักกันเล็กน้อยที่นี่
Tomalak

จุดประสงค์ของการทำคืออะไร?
user35115

@ user35115: ตามจริงแล้ว ... ในขณะที่ติดตามปัญหาที่ไม่เกี่ยวข้องกับ procmon ฉันสังเกตว่าบริการ I / O-heavy (ตัวทำดัชนีข้อความเต็ม) ตรวจสอบไฟล์ของตัวเองในตำแหน่งที่ไม่ถูกต้อง (เป็นใบ้) มันเริ่มต้นที่ system32 ลองอีกสองสามตำแหน่งและในที่สุดก็จะเป็นไดเรกทอรีของตัวเอง ฉันคิดว่ามันจะทำงานในไดเรกทอรีของตัวเองทันทีมันจะทำการตรวจสอบไฟล์ที่ไม่จำเป็นน้อยลง ไม่ใช่ว่ามันจะไม่ทำงานในปัจจุบัน แต่มันทำให้ฉันสงสัยว่ามีที่ว่างสำหรับการปรับปรุงหรือไม่
Tomalak

1
@ user35115 เพื่อหลีกเลี่ยงการเปลี่ยนแปลงการตั้งค่าคอนฟิเกอเรชันของแอพบางตัว (เช่น Apache ฯลฯ ) ซึ่งสัมพันธ์กับไดเรกทอรีการทำงาน
Pacerier

คำตอบ:


5

คุณสามารถใช้การฉีด DLL เพื่อโทรSetCurrentDirectoryหลังจากกระบวนการเปิดตัวแล้ว สิ่งนี้จะทำให้คุณต้องสร้างแอปพลิเคชันหัวฉีดรวมถึง DLL เพื่อฉีด มีบทเรียนบางส่วน; อาจเป็นสองสิ่งที่ดีที่สุดที่ฉันพบคือ:

คุณจะต้องมีพื้นหลังการเขียนโปรแกรม C ++ ในปริมาณที่เหมาะสม

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

เปรียบเทียบไดเรกทอรีที่คุณเห็นในกับของคุณprocmon %path%หากพวกเขาเหมือนกันให้พิจารณาแก้ไขSYSTEM %path%หรือ%path%ผู้ใช้ที่เรียกใช้บริการเพื่อให้ไดเรกทอรีที่คุณต้องการค้นหาเป็นอันดับแรก

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


ตัวแปรสภาพแวดล้อมของระบบ PATH เป็นสิ่งแรกที่นึกถึงฉัน การแทรกเส้นทางของบริการที่จุดเริ่มต้นของตัวแปร PATH จะมีผลกระทบด้านลบต่อประสิทธิภาพการทำงานของแอพพลิเคชั่นอื่น ๆ ดังนั้นฉันจะไม่แนะนำ
Marnix van Valen

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

+1 สำหรับความคิดสร้างสรรค์ :-) ฉันเข้าใจอย่างถ่องแท้ว่าการทำงานของไฟล์เหล่านี้ไม่ส่งผลกระทบต่อประสิทธิภาพการทำงานที่วัดได้ดังนั้นฉันจึงไม่ต้องกังวลกับการเขียนโซลูชันการฉีด DLL อย่างไรก็ตามการปรับเปลี่ยน%PATH%บัญชีผู้ใช้บริการที่ทำงานภายใต้เป็นความคิดที่ดี
Tomalak

1
การสร้างผู้ใช้พิเศษเพื่อเรียกใช้บริการนี้เท่านั้นและปรับเปลี่ยน% PATH% สำหรับผู้ใช้นี้ฟังดูเป็นวิธีที่ดีมาก +1
ซันนี่

@ ฟิชชัน: ใช่มันหมายความว่าฉันยอมรับคำตอบของคุณ ;) ไม่ใช่สิ่งที่ฉันหวังไว้ แต่มันใกล้เคียงกับที่ฉันคาดไว้
Tomalak

1

เช่นเดียวกับ MattB ฉันไม่รู้วิธีใด ๆ ในการเปลี่ยนไดเรกทอรีการทำงานของบริการที่ไม่มีการเข้าถึงซอร์สโค้ด สำหรับสถานการณ์เฉพาะนี้เป็นไปได้ว่าการตรวจสอบไดเรกทอรีพิเศษไม่ได้กำหนดกิจกรรมของดิสก์ที่ไม่จำเป็นจำนวนมากซึ่งสัมพันธ์กับจำนวน i / o ที่จำเป็นสำหรับการดำเนินการทำดัชนีข้อความแบบเต็ม แม้ว่าคุณจะสามารถปรับมันให้เหมาะที่สุด แต่ดัชนีข้อความแบบเต็มจะมีความเข้มข้นของดิสก์ตามธรรมชาติของสัตว์ร้าย


1

เพิ่มค่าสตริง "AppDirectory" ให้กับคีย์พารามิเตอร์และตั้งค่าเป็นไดเรกทอรีทำงานที่คุณต้องการ


ฮึ่ม เพิ่งทดสอบดูเหมือนจะไม่ทำงาน (บน Windows 7 ใช้ชนิดข้อมูล REG_EXPAND_SZ) คุณช่วยยืนยันได้ไหมว่ามันใช้งานได้จริงสำหรับคุณ
Tomalak

srvanyนี้จะทำงานเมื่อใช้ ไม่แน่ใจเกี่ยวกับบริการปกติ
Konstantin Spirin

1

ทำสิ่งนี้ภายในฟังก์ชั่นหลักของบริการ:

  • GetModuleFilenameโทรไป มันจะเรียกโมดูล (exe) C:\path\to\exe\your_service.exeในชื่อไฟล์รวมทั้งเส้นทางในรูปแบบ
  • ใช้การจัดการสตริง (อาจใช้std::stringฟังก์ชันfind_last_of()) เพื่อค้นหาแบ็กสแลชสุดท้าย ตัด / ตัดสตริงจากที่นั่นเพื่อให้ได้พา ธ ไปยังโมดูลของคุณและทำให้ไดเรกทอรีของ exe ของคุณ
  • โทรไปที่ฟังก์ชั่นSetCurrentDirectoryและ voila!

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