سؤال

نحن نعمل على خدمة ويب التي قد لتشغيل 3rd الطرف العملية التي تتفاعل مع محرك أقراص شبكة.لذلك علينا أن خريطة محرك الأقراص هذا برمجيا من خدمة ويب.

لقد سبق ملفوفة WNetAddConnection2 ، إلخ.في أجمل من الدرجة مشروع آخر ، إذا رميت رمز الحق في.

لدينا خدمة ويب قيد التشغيل ضمن UltiDev كاسيني (بدلا من IIS) التي يتم تشغيلها ضمن حساب النظام.ونحن الحصول على رمز الخطأ:"تحديد اسم الجهاز غير صالح" في كل مرة.كما أنني حاولت انتحال شخصية المستخدمين الآخرين في الشبكة.config مع نفس النتائج.

سوف محرك خريطة على ما يرام عند تشغيل التعليمات البرمجية من برنامج وحدة تحت حساب المستخدم العادي.

كما أنني حاولت تشغيل أي ما يعادل "صافي استخدام" القيادة من C# مع نفس النتائج كما WNetAddConnection.

لا أحد يعرف لماذا خدمة ويندوز أو نظام المستخدم لن يكون قادرا على خريطة شبكة محركات الأقراص ؟

لا أحد يعرف الحل?ببساطة تعيين محرك الأقراص في نظام بدء التشغيل قد يكون حلا ولكن كيف النظام/انتحاله المستخدم الوصول إليها ؟

رابط UltiDev كاسيني: UltiDev

الحل: أنا وضعت UltiDev كاسيني خدمة تسجيل الدخول تحت مسؤول و كل شيء يعمل.ASP .صافي التمثيل يجب أن لا تعمل كما هو مخطط لها.

هل كانت مفيدة؟

المحلول

على LOCAL_SYSTEM حساب يعرض مجهول الاعتماد على الشبكة.هل يمكن استخدام UNC مشاركة شبكة الاتصال الوصول إلى هذه المعلومات ، شريطة أن مجهول (الجميع) لديه حق الوصول إلى المشاركة.

يمكنك أيضا تثبيت كاسيني مثل خدمة windows والتي يمكن تكوين لتعمل تحت مستخدم مختلف.

نصائح أخرى

إذا كنت تستخدم حساب النظام المحلي ، ثم أعتقد هو بطبيعته غير قادر على الوصول إلى الشبكة [فو].أنا أقول الانتحال هو الطريق الوحيد الفعال.من الناحية الفنية يمكن أن تقلل من ضوابط الحصول على حصة إلى النقطة التي يمكن لأي شخص أن القراءة/الكتابة إلى المشاركة ولكن هذا يجلب المزيد من المشاكل بدلا من الحلول.

كان لدينا نفس المشكلة.المشكلة يحدث بسبب الحساب يتم تشغيل التعليمات البرمجية في إطار.يمكنك الحصول على حول هذا كما فعلنا من قبل فئة.لديك لتعيين محرك الأقراص في نفس الكود الذي تستخدمه للوصول إلى/نسخ الملفات.نمط نستخدمها دائما التحقق t انظر إذا كان محرك الأقراص متصلا الأولى.لو قطع الاتصال ثم إعادة الاتصال.إذا لا, نحن فقط توصيله.يبدو واضحا في مسألة أنت تصف.

public static class NetworkDrives
    {
        public static bool  MapDrive(string DriveLetter, string Path, string Username, string Password)
        {

            bool ReturnValue = false;

            if(System.IO.Directory.Exists(DriveLetter + ":\\"))
            {
                DisconnectDrive(DriveLetter);
            }
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }
        public static bool DisconnectDrive(string DriveLetter)
        {
            bool ReturnValue = false;
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }

    }

بدلا من محرك أقراص معين, يمكنك الاتصال باستخدام UNC حصة ؟

كنت لا تزال انتحال شخصية المستخدم لديه حق الوصول إلى المشاركة.

أنا فعلا فعلت هذا من قبل, ولكن ذلك كان منذ زمن طويل جدا -- مثل 1997 ، Win NT 3.51 مع دلفي 2

أنا على التوالي من الذاكرة ، ولكن أعتقد أنه يذهب شيء من هذا القبيل:كنت تستخدم Win API:

WNetAddConnection2()

معلومات الاتصال: http://msdn.microsoft.com/en-us/library/aa385413(مقابل.85).aspx

يمكنك الحصول على c# توقيع pInvoke.net: http://www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html

ملاحظة على التكوين:أعتقد أنك سوف تحتاج إلى إعداد حساب مجال الخدمة لتشغيل الخدمة مع هوية هذا الحساب بدلا من "النظام المحلي".أعتقد أنه يمكنك تمرير null مثل اسم المستخدم وكلمة المرور.

لك قد تكون قادرة على تشغيل خدمة النظام المحلي تمرير اسم المستخدم وكلمة مرور حساب المجال-أنا لا أعرف ما إذا كان النظام يسمح بحساب أي الوصول إلى الشبكة على الإطلاق.

المفهوم العام أن نأخذ في الاعتبار هو أن 'تعيين أحرف محركات الأقراص' هي المستخدم مفهوم غير مفهوم النظام.لذلك عندما جو بتسجيل الدخول إلى الكمبيوتر ويندوز ، محركات الأقراص المعينة تعلق على جو حساب المستخدم.عندما Windows تشغيل الخدمة عموما انها تعمل تحت LOCAL_SYSTEM 'حساب المستخدم' ، وهذا يعني أن LOCAL_SYSTEM لا يعرف عن جو تعيين أحرف محركات الأقراص.

ولذلك UNC الوصول إلى شبكة سهم هي الطريق للذهاب عندما تحاول الوصول إلى أي جهاز تحكم عن بعد من الموارد من خلال خدمة Windows.ملاحظة يمكن تشغيل خدمة Windows تحت سياق من " جو " في حساب المستخدم أو يمكنك إنشاء دمية الإعلانية حساب يسمى شيئا مثل 'MyServiceAccount' وإعطاء هذا الحساب حقوق UNC أو يمكنك أن تستخدم الانتحال و خدمة Windows تسجيل الدخول إلى محطة العمل المحلية باستخدام NetLogon (وظيفة) مع التمثيل التعامل معها ومن ثم الوصول إلى UNC من هناك.

هناك الكثير من الطرق للقيام بذلك ، ولكن كل ذلك يأتي نزولا إلى حسابات المستخدمين ترتبط مع محركات الأقراص المعينة و UNC الوصول.

حظا سعيدا, آمل أن تساعد هذه المعلومات!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top