هل يمكنني الاستماع على منفذ (باستخدام HttpListener أو كود .NET آخر) على نظام التشغيل Vista دون الحاجة إلى امتيازات المسؤول؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/169904

  •  05-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أنا أستخدم HttpListener للسماح للمستخدم بإعداد وكيل على منفذ محدد من قبل المستخدم.عندما أقوم بتشغيل HttpListener، أحصل على استثناء إذا كان التطبيق لا يعمل ضمن امتيازات المسؤول في نظام التشغيل Vista.

مما قرأت، وهذا هو السلوك المتوقع - امتيازات المسؤول مطلوبة لبدء الاستماع على المنفذ.لكنني متأكد من أن هناك طرقًا للتغلب على هذا الأمر، حيث أقوم بتشغيل الكثير من البرامج (مثل Skype) التي تستمع على منفذ دون الحاجة إلى الترقية إلى المسؤول.

هل هناك طريقة للقيام بذلك مع HttpListener؟إذا لم يكن الأمر كذلك، فهل يمكنني إجراء استدعاءات API أخرى في كود .NET لإعداد المنفذ؟

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

المحلول

لم أستخدم HttpListener مطلقًا، ولكن من وصفك يبدو أنك تريد الاستماع إلى منفذ TCP عادي، بدلاً من تضمين التطبيق الخاص بك في مساحة اسم عنوان URL للخادم (وهو ما يبدو أن HttpListener يفعله).يجب أن تكون قادرًا على استخدام وظائف المقبس العادية (System.Net.Sockets.TcpListener) لفتح منفذ TCP والاستماع إليه دون الحاجة إلى امتيازات المسؤول.أنا متأكد تقريبًا أن Skype لا يستخدم HttpListener.

نصائح أخرى

بينما يمكنك كتابة خادم HTTP الخاص بك باستخدام TCP/IP العادي (الأمر بسيط نسبيًا)، فمن الأسهل استخدام HttpListener، الذي يستفيد من وظيفة HTTP.SYS المضافة في Windows XP SP2.

ومع ذلك، يضيف HTTP.SYS مفهوم قوائم التحكم في الوصول (ACL) لعنوان URL.ويرجع ذلك جزئيًا إلى أن HTTP.SYS يسمح لك بالربط بمساحات الأسماء الفرعية على المنفذ 80.يؤدي استخدام TCP/IP مباشرة إلى تجنب هذا المطلب، ولكنه يعني أنه لا يمكنك الارتباط بمنفذ قيد الاستخدام بالفعل.

في نظام التشغيل Windows XP، يمكنك استخدام برنامج HttpCfg.exe لإعداد قائمة التحكم بالوصول (ACL) لعنوان URL مما يمنح حساب المستخدم الخاص بك الحق في الارتباط بعنوان URL معين.إنه موجود في عينات Platform SDK.

في نظام التشغيل Windows Vista، لا يزال HTTPCFG مدعومًا، ولكن تم استيعاب الوظيفة في NETSH:

netsh http show urlacl

...سوف يعرض قائمة بقوائم التحكم في الوصول (ACL) الموجودة لعناوين URL.يتم التعبير عن قوائم ACL في SDDL.

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes

...سيقوم بتكوين مساحة الاسم MyURI حتى يتمكن DOMAIN\User من الاستماع إلى الطلبات.

إذا كنت بحاجة إلى التعامل مع الطلبات الواردة من جهاز الكمبيوتر الخاص بك فقط (عادةً لأغراض الاختبار)، فيمكنك الكتابة مضيف محلي بدلاً من * في البادئة.

على سبيل المثال، بدلاً من "http://*:9669/" يمكنك كتابة "http://localhost:9669/".يعمل هذا بشكل جيد مع HttpListener ولا يتطلب امتيازات إدارية (على الأقل في نظام التشغيل Windows 7).

حسنا كان علي أن أتعامل مع شيء مماثل.جهاز الكمبيوتر الخاص بي موجود في مجال مقيد، لذا لا أملك امتيازات المسؤول.بعد بعض البحث والقراءة وجدت هذا الموضوع وقد جعلتني تلميحات netsh أستخدم روابط ACL المؤقتة فقط لتطوير الاختبارات.على جهاز الكمبيوتر الخاص بي توجد هذه القاعدة.

هناك هذا الإدخال:

قم بتشغيل "netsh http show urlacl" (كما هو موضح أعلاه)

    [...]
        Reservierte URL            : http://+:80/Temporary_Listen_Addresses/
            Benutzer: \Jeder
                Abhören: Yes
                Delegieren: No
                SDDL: D:(A;;GX;;;WD)
    [...]

حتى أتمكن من استخدام HttpListener كغير مسؤول (Jeder):

    [...]
    HttpListener l = new HttpListener();
    string prefix = "http://+:80/Temporary_Listen_Addresses/";
    l.Prefixes.Add(prefix);
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
    [...]

قد يساعد هذا أي شخص في العثور على هذا الموضوع.

في نظام التشغيل XP، كان عليك استخدام سطر الأوامر (httpcfg) لفتح المنفذ أولاً، وإلا فلن يعمل مع غير المسؤولين.

يرى هنا - الصفحة تشرح المشكلة ويوجد أَزِيز في الأسفل لجعلها قابلة للاستخدام.

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