किसी सेवा द्वारा उपयोग की जाने वाली नेटवर्क ड्राइव को मैप करें


213

मान लीजिए कि कुछ विंडोज सेवा कोड का उपयोग करती है जो मैप किए गए नेटवर्क ड्राइव और कोई UNC पथ नहीं चाहती है। सेवा शुरू होने पर मैं ड्राइव मैपिंग को सेवा के सत्र में कैसे उपलब्ध करा सकता हूं? सेवा उपयोगकर्ता के रूप में लॉग इन करना और एक निरंतर मानचित्रण बनाना वास्तविक सेवा के संदर्भ में मानचित्रण स्थापित नहीं करेगा।


6
ForcePush का जवाब देखें, उनका वर्कअराउंड काम करता है।
उबिक्युटी

जवाबों:


44

आपको या तो सेवा को संशोधित करने की आवश्यकता होगी, या इसे एक सहायक प्रक्रिया के अंदर लपेटना होगा: सत्र / ड्राइव एक्सेस मुद्दों के अलावा, निरंतर ड्राइव मैपिंग केवल एक इंटरैक्टिव लॉगऑन पर पुनर्स्थापित की जाती हैं, जो सेवाएं आमतौर पर प्रदर्शन नहीं करती हैं।

सहायक प्रक्रिया दृष्टिकोण बहुत सरल हो सकता है: बस एक नई सेवा बनाएं जो ड्राइव को मैप करती है और 'वास्तविक' सेवा शुरू करती है। केवल चीजें जो इस बारे में पूरी तरह से तुच्छ नहीं हैं:

  • सहायक सेवा को वास्तविक सेवा के लिए सभी उपयुक्त SCM कमांड (स्टार्ट / स्टॉप इत्यादि) पर पास करना होगा। यदि वास्तविक सेवा कस्टम SCM आदेशों को स्वीकार करती है, तो उन पर भी उत्तीर्ण होना याद रखें (मुझे ऐसी सेवा की उम्मीद नहीं है जो UNC पथों को ऐसे आदेशों का उपयोग करने के लिए विदेशी मानती है, हालांकि ...)

  • चीजें थोड़ी मुश्किल हो सकती हैं विश्वसनीय-बुद्धिमान। यदि वास्तविक सेवा एक सामान्य उपयोगकर्ता खाते के अंतर्गत चलती है, तो आप उस खाते के अंतर्गत सहायक सेवा भी चला सकते हैं, और यह सब तब तक ठीक होना चाहिए, जब तक कि खाते में नेटवर्क शेयर तक उचित पहुंच हो। यदि वास्तविक सेवा केवल LOCALSYSTEM या somesuch के रूप में चलने पर काम करेगी, तो चीजें और अधिक दिलचस्प हो जाती हैं, क्योंकि यह या तो नेटवर्क ड्राइव को 'देखने' में सक्षम नहीं होगी, या काम करने के लिए कुछ विश्वसनीय बाजीगरी की आवश्यकता होगी।


2
बहुत जानकारीपूर्ण ... क्या मैं यह मानने में सही हूं कि लॉगऑन स्क्रिप्ट भी केवल इंटरेक्टिव लॉगऑन सत्रों के लिए ही चलती हैं और सेवा सत्रों के लिए नहीं?
VoidPointer

220

इस का प्रयोग अपने जोखिम पर करें। (मैंने इसे XP और सर्वर 2008 x64 R2 पर परीक्षण किया है)

इस हैक के लिए आपको मार्क रोसिनोविच द्वारा SysinternalsSuite की आवश्यकता होगी :

एक कदम: एक उन्नत cmd.exe प्रॉम्प्ट खोलें (व्यवस्थापक के रूप में चलाएँ)

चरण दो: PSExec.exe का उपयोग करके रूट करने के लिए फिर से ऊपर उठें: SysinternalsSuite वाले फ़ोल्डर पर नेविगेट करें और निम्नलिखित कमांड को निष्पादित करें जो psexec -i -s cmd.exe अब आप एक प्रॉम्प्ट के अंदर हैं nt authority\systemऔर आप इसे टाइप करके साबित कर सकते हैं whoami-iइसलिए आवश्यक है क्योंकि ड्राइव मैपिंग उपयोगकर्ता के साथ बातचीत करने की जरूरत है

चरण तीन: निम्न कमांड के साथ सिस्टम अकाउंट के रूप में लगातार मैप की गई ड्राइव बनाएं net use z: \\servername\sharedfolder /persistent:yes

इट्स दैट ईजी!

चेतावनी : आप केवल इस मैपिंग को उसी तरह निकाल सकते हैं जैसे आपने इसे बनाया था, सिस्टम खाते से। यदि आपको इसे हटाने की आवश्यकता है, तो चरण 1 और 2 का पालन करें लेकिन चरण 3 पर कमांड को बदल दें net use z: /delete

नोट : नव निर्मित मैप्ड ड्राइव अब इस प्रणाली के सभी उपयोगकर्ताओं के लिए दिखाई देगा, लेकिन वे इसे "डिस्कनेक्टेड नेटवर्क ड्राइव (जेड :)" के रूप में प्रदर्शित करेंगे। नाम को मूर्ख मत बनने दो। यह डिस्कनेक्ट होने का दावा कर सकता है लेकिन यह सभी के लिए काम करेगा। इस तरह आप बता सकते हैं कि यह हैक M $ द्वारा समर्थित नहीं है।


3
मैं इस समाधान का उपयोग करने की कोशिश कर रहा था और इस समस्या में भाग गया: मैप किया गया ड्राइव उपयोगकर्ताओं के लिए डिस्कनेक्ट हो गया (यहां तक ​​कि प्रवेश भी)। कोई सुझाव?
कांस्टेंटिन बेकी

7
रिबूट के बाद मैप किया गया ड्राइव चला जाता है। किसी भी विचार? मानचित्रण जारी है, लेकिन स्थिति "अनुपलब्ध" है, इसलिए यह प्रदर्शित नहीं होती है
टॉमी

4
मैं रीबूट के बाद मैपिंग को अनुपलब्ध भी देखता हूं।
डेव पैटरसन

33
इसे रिबूट के बाद काम करने के लिए, बस एक स्क्रिप्ट बनाएं net use z: \\servername\sharedfolderऔर इसे कंप्यूटर स्टार्टअप पर चलाने के लिए सेट करें, प्रति Technet.microsoft.com/en-us/library/cc770556.aspx यह सिस्टम खाते के रूप में चलेगा, इसलिए कोई ज़रूरत नहीं है psexec।
TRS-80

2
मैं यह जोड़ना चाहता हूं कि यह महत्वपूर्ण है कि हर कोई क्लॉज का उपयोग करता है /USER:[remotecomp]\[remoteusername] [password](कमांड कभी-कभी ठीक से काम नहीं करता है जब दूरस्थ उपयोगकर्ता का नाम दूरस्थ कंप्यूटर नाम और बैकस्लैश के साथ नहीं लिया जाता है। इसके अलावा, यदि शेयर पासवर्ड संरक्षित है, और दूसरों के लिए प्रकट होता है। ड्राइव, यह हर किसी के लिए सुलभ नहीं है। उस सिस्टम पर कोई भी उपयोगकर्ता, जहां सिस्टम एक हिस्से की
गणना करता है

65

मुझे एक समाधान मिला जो पेसेक के साथ एक जैसा है लेकिन बिना अतिरिक्त टूल के काम करता है और रिबूट बच जाता है

बस एक शेड किए गए कार्य को जोड़ें, "सिस्टम" को "रन के रूप में" फ़ील्ड में डालें और कार्य को साधारण कमांड के साथ बैच फ़ाइल में इंगित करें

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

फिर "सिस्टम स्टार्टअप पर चलाएं" (या समान, मेरे पास अंग्रेजी संस्करण नहीं है) का चयन करें और आप कर रहे हैं।


पहले क्या शुरू होता है? एक विंडोज़ सेवा या यह निर्धारित कार्य? यदि पथ अनुपलब्ध है, तो हमारी सेवा प्रारंभ में ही समाप्त हो जाती है। यदि सेवा अंतिम हो जाती है तो हमें इसका पुनर्निर्माण करना होगा।
थॉमस

1
मैंने 2008 R2 पर यह कोशिश की, यह एक डिस्कनेक्ट मैप्ड ड्राइव बनाता है और जब मैं इसे खोलने की कोशिश करता हूं तो यह कहता है कि "z: \ Access नहीं है। लॉगऑन फेल्योर: अज्ञात उपयोगकर्ता नाम या खराब पासवर्ड।" लेकिन मैं मैन्युअल रूप से एक ही बैट फ़ाइल चलाकर सफलतापूर्वक मैप्ड ड्राइव बनाने में सक्षम था। Ny अंतर्दृष्टि?
गोपी

1
@ थोमस से कोई फर्क नहीं पड़ता है जो पहले कार्य प्रदान करना शुरू कर देता है - कम से कम एक बार चलने के कारण/persistent:yes
एड्ड

4
अनुसूचित कार्य करने की आवश्यकता क्यों है? यह है / लगातार: हाँ, यह पर्याप्त नहीं है कि इसे इधर-उधर रखा जाए?
स्कॉट स्टैफोर्ड

2
@ScottStafford नहीं / लगातार: हाँ Win7 और बाद में पर्याप्त नहीं है। उस स्विच की परवाह किए बिना रिबूट के बाद मैपिंग हटा दी जाती है।
अनन्त

44

एक बेहतर तरीका mklink.exe का उपयोग करके एक प्रतीकात्मक लिंक का उपयोग करना होगा। आप फ़ाइल सिस्टम में एक लिंक बना सकते हैं जिसे कोई भी ऐप इस्तेमाल कर सकता है। Http://en.wikipedia.org/wiki/NTFS_symbolic_link देखें ।


इतना सरल और अच्छा काम करता है। चूंकि यह फ़ाइल सिस्टम का हिस्सा है, इसलिए लिंक सभी खातों के लिए उपलब्ध है। बस यह सुनिश्चित करें कि सेवा एक ऐसे खाते के रूप में चल रही है, जिसकी पहुंच नेटवर्क संसाधन तक है (जो सिस्टम आदि के मामले में नहीं हो सकता है)।
जेरेमी फ्रैंक

1
यह सवाल का बेहतर जवाब है, बहुत-बहुत धन्यवाद!
पेट्रोव

3
दुर्भाग्य से अगर सिम्पल लिंक एक नेटवर्क शेयर तक पहुँचता है तो आप एक वर्ग में वापस आ
जायेंगे

23

यहाँ एक अच्छा जवाब है: https://superuser.com/a/651015/299678

यानी आप एक प्रतीकात्मक लिंक का उपयोग कर सकते हैं, जैसे

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

1
यदि आपको सेवा में अनुमति त्रुटि के बाद निर्देशिका बनाने की कोशिश करने के बाद क्या मिलता है?
tyoc213

आपको इस ऑफ-लाइन को चैट रूम में ले जाना चाहिए, और फिर त्रुटि संदेश का विवरण देना चाहिए। आपको संभवतः उन्नत अनुमतियों के साथ कमांड चलाने की आवश्यकता है।
दारु

@ tyoc213 क्या आपको जवाब मिला?
लसकुरीफैसु

9

आप हमें 'शुद्ध उपयोग' कमांड दे सकते हैं:

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

यदि वह एक सेवा में काम नहीं करता है, तो Winapi और PInvoke WNetAddConnection2 आज़माएं

संपादित करें: जाहिर है कि मैंने आपको गलत समझा - आप सेवा के सोर्सकोड को बदल नहीं सकते हैं, है ना? उस स्थिति में मैं mdb द्वारा सुझाव का पालन करूंगा , लेकिन थोड़ा ट्विस्ट के साथ: अपनी स्वयं की सेवा बनाएं (इसे मैपिंग सेवा कहते हैं) जो ड्राइव को मैप करती है और इस मैपिंग सेवा को पहली (वास्तविक कार्य) सेवा के लिए निर्भरता में जोड़ देती है। इस तरह से मैपिंग सेवा शुरू होने से पहले काम शुरू नहीं होगा (और ड्राइव को मैप किया गया)।


इस मैपिंग सेवा सेटअप के साथ, मुझे लगता है कि मैपिंग सेवा द्वारा स्थापित ड्राइव मैपिंग मूल सेवा के संदर्भ में उपलब्ध नहीं होगी, होगा?
VoidPointer

मुझे लगता है कि यह <अस्वीकरण> चाहिए </ अस्वीकरण> - प्रत्येक विनोग्लोन सत्र के लिए केवल एक ही वातावरण है।
ट्रेब

आपका कोड एक सेवा में काम करता है। मैं ओपी के रूप में एक ही मुद्दे के साथ यहां आया था लेकिन मैं सेवा का लेखक हूं। आपके उत्तर ने मेरी समस्या हल कर दी।
जो गेयटी

5

ForcePush,

नोट : नव निर्मित मैप्ड ड्राइव अब इस प्रणाली के सभी उपयोगकर्ताओं के लिए दिखाई देगा, लेकिन वे इसे "डिस्कनेक्टेड नेटवर्क ड्राइव (जेड :)" के रूप में प्रदर्शित करेंगे। नाम को मुर्ख मत बनने दो। यह डिस्कनेक्ट होने का दावा कर सकता है लेकिन यह सभी के लिए काम करेगा। इस तरह आप बता सकते हैं कि यह हैक M $ द्वारा समर्थित नहीं है ...

यह सब शेयर की अनुमति पर निर्भर करता है। यदि आपके पास शेयर अनुमतियों में हर कोई है, तो यह मैप की गई ड्राइव अन्य उपयोगकर्ताओं द्वारा सुलभ होगी। लेकिन अगर आपके पास केवल कुछ विशेष उपयोगकर्ता हैं, जिनकी आपने अपने बैच स्क्रिप्ट में उपयोग किया है और इस बैच स्क्रिप्ट को स्टार्टअप स्क्रिप्ट में जोड़ा गया है, तो केवल सिस्टम खाते के पास उस हिस्से तक पहुंच भी होगी जो प्रशासक के पास भी नहीं होगी। इसलिए यदि आप उपयोग करते हैं, उदाहरण के लिए, एक अनुसूचित ntbackuo नौकरी, सिस्टम खाते का उपयोग 'रन के रूप में' किया जाना चाहिए। यदि आपकी सेवा का 'लॉग ऑन: लोकल सिस्टम अकाउंट' काम करना चाहिए।

मैंने जो भी किया , मैंने अपने स्टार्टअप स्क्रिप्ट में कोई भी ड्राइव लेटर मैप नहीं किया, बस net use \\\server\share ...अपनी निर्धारित नौकरियों में यूएनसी पथ का उपयोग और उपयोग किया। एक लॉगऑन स्क्रिप्ट को जोड़ा (या बस स्टार्टअप फ़ोल्डर में एक बैच फ़ाइल जोड़ें) मैपिंग के साथ कुछ ड्राइव अक्षर के साथ एक ही शेयर में: net use Z: \\\...समान क्रेडेंशियल्स के साथ। अब लॉग किया गया उपयोगकर्ता उस मैप किए गए ड्राइव को देख और एक्सेस कर सकता है। एक ही शेयर के 2 कनेक्शन हैं। इस मामले में उपयोगकर्ता उस कष्टप्रद "डिस्कनेक्टेड नेटवर्क ड्राइव ..." को नहीं देखता है। लेकिन अगर आपको वास्तव में यूएनसी ही नहीं, बल्कि ड्राइव लेटर के द्वारा उस शेयर तक पहुंच की जरूरत है, तो अलग-अलग ड्राइव लेटर के साथ शेयर करने वाले मैप, जैसे यू फॉर सिस्टम और जेड यूजर्स के लिए।


4

नेटवर्क ड्राइव में विंडोज सर्विस एक्सेस देने का एक तरीका मिला।

उदाहरण के लिए NFS डिस्क के साथ विंडोज सर्वर 2012 लें:

चरण 1: माउंट करने के लिए एक बैच फ़ाइल लिखें।

एक बैच फ़ाइल लिखें, उदा: 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 के रूप में माउंट डिस्क।

"कार्य शेड्यूलर" खोलें, एक नया कार्य बनाएं:

  1. "सिस्टम स्टार्टअप" पर "सिस्टम" के रूप में चलाएं।
  2. क्रिया बनाएँ: "C: \ Mount_nfs.bat" चलाएँ।

इन दो सरल चरणों के बाद, मेरी विंडोज एक्टिवएमक्यू सेवा "लोकल सिस्टम" के तहत चलती है, निजीकृत, लॉगिन के बिना पूरी तरह से प्रदर्शन करती है।


3

जब आप सामान्य रूप से कमांड प्रॉम्प्ट से निष्पादन योग्य चलाते हैं तो ड्राइव को एक्सेस करने में सक्षम होने का कारण यह है कि जब आप इसे सामान्य exe के रूप में निष्पादित कर रहे हैं तो आप उस एप्लिकेशन को उस उपयोगकर्ता खाते में चला रहे हैं जिस पर आपने लॉग ऑन किया है। और उस उपयोगकर्ता के पास नेटवर्क तक पहुंचने के विशेषाधिकार हैं। लेकिन, जब आप निष्पादन योग्य को एक सेवा के रूप में स्थापित करते हैं, तो डिफ़ॉल्ट रूप से यदि आप कार्य में देखते हैं तो यह 'सिस्टम' खाते के अंतर्गत चलता है। और आप जान सकते हैं कि नेटवर्क संसाधनों तक पहुँचने के लिए 'सिस्टम' के पास अधिकार नहीं हैं।

इस समस्या के दो समाधान हो सकते हैं।

  1. पहले से ही ऊपर बताए अनुसार ड्राइव को लगातार चलाने के लिए।

  2. एक और दृष्टिकोण है जिसका पालन किया जा सकता है। यदि आप 'service.msc'you' आपकी सेवा में जा सकते हैं और आपकी सेवा के गुणों में टाइप करके सेवा प्रबंधक खोल सकते हैं तो एक लॉगऑन टैब है जहाँ आप खाते को 'सिस्टम' के अलावा किसी अन्य खाते के रूप में निर्दिष्ट कर सकते हैं। अपने स्वयं के लॉग इन उपयोगकर्ता खाते से या 'नेटवर्क सेवा' के माध्यम से सेवा शुरू करें। जब आप ऐसा करते हैं .. सेवा किसी भी नेटवर्क घटक तक पहुंच सकती है और यहां तक ​​कि अगर वे लगातार भी नहीं हैं तो भी ड्राइव कर सकते हैं। इस प्रोग्राम को प्राप्त करने के लिए आप http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx पर 'CreateService' फ़ंक्शन को देख सकते हैं और 'NT के लिए' lpServiceartartName पैरामीटर सेट कर सकते हैं। प्राधिकारी \ NetworkService '। यह आपकी सेवा को 'नेटवर्क सेवा' के तहत शुरू करेगा।

  3. आप अपने CreateService () फ़ंक्शन के सर्विसपाइप पैरामीटर फ़्लैग में SERVICE_INTERACTIVE_PROCESS को निर्दिष्ट करके सेवा को सहभागी बनाकर भी प्रयास कर सकते हैं, लेकिन यह केवल XP तक ही सीमित रहेगा क्योंकि Vista और 7 डोनट इस सुविधा का समर्थन करते हैं।

आशा है कि समाधान आपकी मदद करेंगे .. मुझे बताएं कि क्या यह आपके लिए काम करता है।


1

आप उस उपयोगकर्ता को बदलना नहीं चाहते हैं जो सेवा "सिस्टम" से चलती है या सिस्टम के रूप में आपकी मैपिंग को चलाने के लिए एक डरपोक तरीका ढूंढती है।

मज़ेदार बात यह है कि यह "एट" कमांड का उपयोग करके संभव है , बस अपने ड्राइव को भविष्य में एक मिनट मैप करने के लिए शेड्यूल करें और यह सिस्टम खाते के तहत चलाया जाएगा जिससे ड्राइव आपकी सेवा में दिखाई दे।


सेवा "सिस्टम" के रूप में नहीं चलती है। यह एक विशिष्ट स्थानीय खाते के तहत चलाने के लिए स्थापित किया गया है। यहां तक ​​कि मैं उस खाते से लॉग इन करता हूं, एक निरंतर नेटवर्क मैपिंग बनाता हूं, लॉग आउट करता हूं और सेवा को पुनरारंभ करता हूं, मैपिंग सेवा के लिए उपलब्ध नहीं होगी।
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 जर्क @ spankmaster79 (अच्छा नाम lol) और @NMC मुद्दों के जवाब में उन्होंने कहा "मुझे एक समाधान मिला जो एक के समान है psexec लेकिन अतिरिक्त टूल के बिना काम करता है और एक रिबूट बच जाता है। " post @Larry ने बनाया था।

इसका समाधान सिर्फ लॉग इन खाते से उस फ़ोल्डर को ब्राउज़ करना है, अर्थात:

    \\servername\share  

और इसे लॉगिन करने के लिए संकेत दें, और उसी साख को दर्ज करें जिसका उपयोग आपने UNC के लिए psexec में किया था। इसके बाद यह काम करना शुरू कर देता है। मेरे मामले में, मुझे लगता है कि यह इसलिए है क्योंकि सेवा वाला सर्वर उसी डोमेन का सदस्य नहीं है जिस सर्वर पर मैं मैप कर रहा हूं। अगर UNC और निर्धारित कार्य दोनों होस्टनाम के बजाय IP को संदर्भित करते हैं तो मैं सोच रहा हूँ

    \\123.456.789.012\share 

यह पूरी तरह से समस्या से बच सकता है।

अगर मुझे कभी भी यहाँ पर पर्याप्त प्रतिनिधि मिलते हैं तो मैं इसे उत्तर के रूप में जोड़ूँगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.