حل التحكم عن بعد والبرمجة النصية عن بعد، تم تصميمه باستخدام .NET وBlazor وSignalR Core.
أبحث عن مشرفين لمساعدتي! إذا كنت أحد مطوري .NET ومهتمًا بالمساعدة في مواصلة المضي قدمًا عن بُعد، فأرسل لي رسالة مباشرة على Discord على jaredatimmy
.
ريديت: https://www.reddit.com/r/remotely_app/
عامل الميناء: https://hub.docker.com/r/immybot/remotely
البرنامج التعليمي: https://www.youtube.com/watch?v=t-TFvr7sZ6M (شكرًا، @bmcgonag!)
mkdir -p /var/www/remotely wget -q https://raw.githubusercontent.com/immense/Remotely/master/docker-compose/docker-compose.yml docker-compose up -d
الوكيل العكسي الوحيد المدعوم هو Caddy، وفقط عندما يكون مواجهًا للإنترنت مباشرةً. يوفر التكوين الافتراضي لـ Caddy كل ما يحتاجه ASP.NET Core وSignalR للعمل بشكل صحيح.
إذا كنت تواجه مشكلات في الشبكة مع أي إعداد آخر، مثل جدار الحماية الإضافي أو مع Nginx، فيرجى طلب دعم المجتمع في علامة التبويب "المناقشات" أو على Reddit أو أي موقع اجتماعي آخر. لا يستطيع المشرفون عن بعد ببساطة تقديم التوجيه والدعم لجميع إعدادات البيئة الممكنة.
مع ذلك، يتطلب ASP.NET Core تعيين الرؤوس التالية عند وجود وكيل عكسي: X-Forwarded-Proto
و X-Forwarded-Host
و X-Forwarded-For
. وترتبط هذه بالمخطط (http/https)، وعنوان URL للطلب الأصلي، وعنوان IP الخاص بالعميل، على التوالي. يتم إدخال المخطط والمضيف الناتج في المثبتين وعملاء سطح المكتب، حتى يعرفوا مكان إرسال الطلبات. يتم استخدام عنوان IP للعميل في معلومات الجهاز.
لا يقوم التعليمة البرمجية عن بعد بتحليل هذه القيم أو معالجتها. ويتم ذلك داخليًا بواسطة البرامج الوسيطة المدمجة في ASP.NET Core. إذا لم تظهر القيم كما هو متوقع، فذلك لأن الرؤوس كانت مفقودة، أو لا تحتوي على القيم الصحيحة، أو لم تكن بالتنسيق الصحيح، أو لم تأتي من خلال سلسلة من الوكلاء المعروفين (انظر أدناه).
لتجنب هجمات الحقن، يقوم ASP.NET Core افتراضيًا بقبول الرؤوس المُعاد توجيهها من عناوين الاسترجاع فقط. سيضيف Remotely أيضًا عنوان IP لبوابة Docker (172.28.0.1) المحدد في ملف إنشاء عامل الإرساء. إذا كنت تستخدم تكوينًا غير افتراضي، فيجب عليك إضافة كافة عناوين جدار الحماية وعناوين الوكيل العكسي إلى صفيف KnownProxies
في تكوين الخادم.
إذا لم تتمكن من تكوين الوكلاء العكسيين بشكل صحيح، فيمكنك على الأقل فرض استخدام نظام HTTPS عن طريق تعيين Force Client HTTPS
في صفحة تكوين الخادم.
يمكن العثور على وثائق Microsoft الكاملة حول هذا الموضوع هنا: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
سيتم حفظ بيانات Remotely في الحاوية ضمن /app/AppData
، والتي سيتم تثبيتها على /var/www/remotely/
على مضيف Docker الخاص بك.
سيحتوي هذا المجلد على Remotely.db والسجلات التي تم إنشاؤها بواسطة الخادم.
ستستمر هذه الملفات خلال عملية التفكيك وإعداد حاويات جديدة عن بُعد.
في حالة الترقية من إصدار غير تابع لـ Docker من Remotely، قم بالكتابة فوق ملف قاعدة البيانات من التثبيت السابق.
استخدم Caddy كوكيل عكسي إذا كنت تريد كشف الموقع على الإنترنت.
إذا كانت هذه هي المرة الأولى، قم بإنشاء حسابك عن طريق النقر فوق زر Register
في الصفحة الرئيسية.
تُستخدم المؤسسات لتجميع المستخدمين والأجهزة وعناصر البيانات الأخرى معًا في تجمع واحد.
افتراضيًا، يمكن أن توجد مؤسسة واحدة فقط على الخادم.
سوف يختفي زر Register
.
لن يتمكن الأشخاص بعد الآن من إنشاء حسابات بأنفسهم.
للسماح بالتسجيل الذاتي، قم بزيادة MaxOrganizationCount
أو اضبطه على -1 (راجع قسم التكوين).
سيكون هذا الحساب هو مسؤول الخادم ومسؤول المؤسسة.
يتم إنشاء مؤسسة تلقائيًا للحساب.
يمكنك تمكين تسجيل HTTP لرؤية جميع الطلبات والاستجابات في سجلات الخادم، بما في ذلك الرؤوس. يمكن أن يكون هذا مفيدًا لتصحيح مشكلات الوكيل العكسي أو واجهة برمجة التطبيقات (API) أو SignalR. يمكن تمكين الخيار في صفحة تكوين الخادم.
بعد تغيير ما سبق، يجب عليك إعادة تشغيل الحاوية لتصبح التغييرات نافذة المفعول.
ستقوم الخطوات التالية بتكوين جهاز Windows 11 الخاص بك لإنشاء الخادم والعملاء عن بعد.
تثبيت فيجوال ستوديو 2022.
.NET SDK (أحدث إصدار).
MSBuild (الذي يقوم بتحديد برامج التحويل البرمجي لـ Roslyn تلقائيًا).
أهداف NuGet وبناء المهام.
.NET Framework 4.8 SDK.
لتصحيح الأخطاء والتطوير، ستحتاج إلى جميع أعباء العمل ذات الصلة.
ASP.NET وتطوير الويب
تطوير سطح المكتب .NET
تطوير .NET Core عبر الأنظمة الأساسية
الرابط: https://visualstudio.microsoft.com/downloads/
يجب أن يكون لديك أحمال العمل التالية محددة:
يجب أن يتم تحديد المكونات الفردية التالية:
تثبيت جيت لنظام التشغيل Windows.
الرابط: https://git-scm.com/downloads
قم بتثبيت أحدث عقدة LTS:
الرابط: https://nodejs.org/
استنساخ مستودع git: git clone https://github.com/immense/Remotely --recurse
عند تصحيح الأخطاء، سيستخدم الوكيل معرف الجهاز المحدد مسبقًا ويتصل بـ https://localhost:5001.
في بيئة التطوير، سيقوم الخادم بتعيين جميع وكلاء الاتصال للمؤسسة الأولى.
يتيح لك الخياران المذكوران أعلاه تصحيح أخطاء الوكيل والخادم معًا، ورؤية جهازك في القائمة.
سيكون الحساب الأول الذي يتم إنشاؤه مسؤولاً لكل من الخادم والمؤسسة التي تم إنشاؤها للحساب.
يتمتع مسؤول المؤسسة بحق الوصول إلى صفحة المؤسسة وإدخالات سجل الخادم الخاصة بمؤسسته. يتمتع مسؤول الخادم بحق الوصول إلى صفحة تكوين الخادم ويمكنه رؤية إدخالات سجل الخادم التي لا تنتمي إلى مؤسسة.
ضمن قسم الحساب، توجد علامة تبويب للعلامة التجارية، والتي سيتم تطبيقها على عملاء الدعم السريع ومثبت Windows.
ومع ذلك، سيحتاج العملاء إلى أن يكونوا قد تم إنشاؤهم من المصدر باستخدام عنوان URL للخادم الذي تم ترميزه بشكل ثابت في التطبيقات حتى يتمكنوا من استرداد معلومات العلامة التجارية.
يمكن تكوين موفر قاعدة البيانات وسلاسل الاتصال ومنفذ ASP.NET Core عبر متغيرات البيئة في docker-compose.yml
.
تتم جميع عمليات التكوين الأخرى في صفحة تكوين الخادم بمجرد تسجيل الدخول.
AllowApiLogin: ما إذا كان سيتم السماح بتسجيل الدخول عبر وحدة تحكم API. يوصى باستخدام رموز الوصول إلى واجهة برمجة التطبيقات (API) عبر هذا الأسلوب.
الأجهزة المحظورة: مجموعة من معرفات الأجهزة أو الأسماء أو عناوين IP المطلوب حظرها. عندما يحاولون الاتصال، سيتم إرسال أمر إلغاء التثبيت على الفور.
DataRetentionInDays: المدة التي سيتم خلالها الاحتفاظ بالسجلات والبيانات الأخرى على الخادم. اضبط على -1 للاحتفاظ به لأجل غير مسمى (غير مستحسن).
DBProvider: يحدد أي من سلاسل الاتصال الثلاثة (في الأعلى) سيتم استخدامها. يتم تحميل موفر قاعدة البيانات المناسب لنوع قاعدة البيانات تلقائيًا في التعليمات البرمجية.
EnableWindowsEventLog: ما إذا كان سيتم أيضًا إضافة إدخالات سجل الخادم إلى سجل أحداث Windows.
EnforceAttenedAccess: سيُطلب من العملاء السماح بمحاولات التحكم عن بعد غير المراقبة.
EnableRemoteControlRecording: ما إذا كان سيتم حفظ تسجيلات جلسات التحكم عن بعد على الخادم.
سيتم حفظها في /app/AppData/recordings
.
يخضع الاحتفاظ بها لـ DataRetentionInDays
.
ForceClientHTTPS: إجبار المثبتين وعملاء سطح المكتب على استخدام نظام HTTPS، حتى إذا تم تكوين الرؤوس المعاد توجيهها بشكل خاطئ.
KnownProxies: إذا كان الوكيل العكسي الخاص بك موجودًا على جهاز مختلف ويقوم بإعادة توجيه الطلبات إلى الخادم البعيد، فستحتاج إلى إضافة عنوان IP الخاص بالخادم الوكيل العكسي إلى هذه المصفوفة.
MaxOrganizationCount: بشكل افتراضي، يمكن أن توجد مؤسسة واحدة على الخادم، والتي يتم إنشاؤها تلقائيًا عند تسجيل الحساب الأول. وبعد ذلك، سيتم تعطيل التسجيل الذاتي.
اضبط هذا على -1 أو قم بزيادته إلى رقم محدد للسماح بتعدد الإيجارات.
RedirectToHttps: ما إذا كان ASP.NET Core سيعيد توجيه كل حركة المرور من HTTP إلى HTTPS. وهذا مستقل عن تكوينات Caddy وNginx وIIS التي تفعل الشيء نفسه.
RemoteControlNotifyUsers: ما إذا كان سيتم عرض إشعار للمستخدم النهائي عند بدء جلسة تحكم عن بعد غير مراقبة.
RemoteControlRequiresAuthentication: ما إذا كانت صفحة التحكم عن بعد تتطلب مصادقة لتأسيس اتصال.
Require2FA: مطالبة المستخدمين بإعداد 2FA قبل أن يتمكنوا من استخدام التطبيق الرئيسي.
Smpt-: إعدادات SMTP لرسائل البريد الإلكتروني للنظام التي يتم إنشاؤها تلقائيًا (مثل التسجيل وإعادة تعيين كلمة المرور).
الموضوع: موضوع اللون الذي سيتم استخدامه للموقع. القيم هي "Light" أو "Dark". يمكن أيضًا تكوين هذا لكل مستخدم في الحساب - الخيارات.
TrustedCorsOrigins: لطلبات واجهة برمجة التطبيقات عبر الأصل عبر JavaScript. يُسمح لمواقع الويب المدرجة في هذه المصفوفة بتقديم طلبات إلى واجهة برمجة التطبيقات (API). وهذا لا يمنح المصادقة، التي لا تزال مطلوبة في معظم نقاط النهاية.
UseHsts: ما إذا كان ASP.NET Core سيستخدم أمان النقل الصارم لـ HTTP.
UseHttpLogging: تمكين التسجيل لجميع طلبات HTTP. يتيح أيضًا إدخالات سجل إضافية في ClientDownloadsController
فيما يتعلق بالمخطط الفعال والمضيف وعنوان IP البعيد نتيجة لمعالجة الرؤوس المعاد توجيهها.
يجب عليك تعيين مستوى سجل بشكل صريح لـ Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware
حتى يعمل هذا. راجع appsettings.json للحصول على مثال.
بشكل افتراضي، يستخدم Remotely قاعدة بيانات SQLite. عند التشغيل لأول مرة، يقوم بإنشاء ملف كما هو محدد لسلسلة اتصال SQLite في appsettings.json.
يمكنك تغيير قاعدة البيانات عن طريق تغيير DBProvider
في ApplicationOptions
إلى SQLServer
أو PostgreSQL
.
بالنسبة للعملاء، يتم الاحتفاظ بالسجلات في %ProgramData%RemotelyLogs
داخل حاوية الخادم، ستتم كتابة السجلات إلى /app/AppData/logs
، والتي (افتراضيًا) سيتم تثبيتها على /var/www/remotely/Logs
على المضيف.
تتم كتابة سجلات ASP.NET Core المضمنة إلى وحدة التحكم (stdout). يمكنك إعادة توجيه هذا إلى ملف إذا رغبت في ذلك.
في IIS، يمكن القيام بذلك في ملف web.config عن طريق تعيين stdoutLogEnabled إلى true.
على خوادم Windows، يمكن أيضًا كتابة السجلات المذكورة أعلاه في سجل أحداث Windows.
يتم تمكين هذا في تكوين الخادم عن طريق تعيين EnableWindowsEventLog على true.
يمكنك تكوين مستويات التسجيل والإعدادات الأخرى في appsetttings.json.
مزيد من المعلومات: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/
Windows: يتم اختبار الإصدار الأحدث فقط من Windows 11. يجب أن يعمل نظاما التشغيل Windows 7 و8.1، على الرغم من أن الأداء سينخفض على نظام التشغيل Windows 7.
من المفترض أن يعمل Windows 2019/2022 أيضًا، ولكن لا يتم اختباره بانتظام.
Linux: يتم اختبار أحدث إصدار LTS فقط من Ubuntu.
بالنسبة إلى عميل "الدعم السريع" الخاص بـ Ubuntu، يجب عليك أولاً تثبيت التبعيات التالية:
libc6-dev
libxtst-dev
com.xclip
libx11-dev
libxrandr-dev
من الناحية المثالية، ستقوم بالتحكم عن بعد من جهاز كمبيوتر أو كمبيوتر محمول فعلي. ومع ذلك، فقد حاولت أن أجعل جهاز التحكم عن بعد قابلاً للاستخدام إلى حد ما على الأقل من جهاز محمول. وهنا الضوابط:
النقر بزر الماوس الأيسر: نقرة واحدة
النقر بزر الماوس الأيمن: الضغط لفترة طويلة، ثم تحريره
النقر والسحب: اضغط لفترة طويلة، ثم اسحب
توجد صفحة على /get-support
حيث يمكن للمستخدمين النهائيين طلب الدعم. عند إرسال النموذج، يظهر تنبيه على الصفحة الرئيسية، أعلى الشبكة.
يتم وضع اختصار لهذه الصفحة في المجلد Program FilesRemotely
. يمكنك نسخه في أي مكان تريد. يمكنك أيضًا نسخه إلى سطح المكتب تلقائيًا باستخدام مفتاح -supportshortcut
الموجود في برنامج التثبيت.
لدى .NET طريقتان للنشر: تعتمد على إطار العمل ومكتفية بذاتها.
تتطلب عمليات النشر المعتمدة على إطار العمل تثبيت وقت تشغيل .NET على أجهزة الكمبيوتر المستهدفة. يجب أن يكون هو نفس الإصدار الذي تم استخدامه لإنشاء التطبيق.
تتضمن عمليات النشر المستقلة نسخة من وقت التشغيل، لذلك لا تحتاج إلى تثبيتها على أجهزة الكمبيوتر المستهدفة. ونتيجة لذلك، فإن الحجم الإجمالي للملف أكبر بكثير.
يستخدم .NET معرفات وقت التشغيل التي يتم استهدافها عند الإنشاء.
الرابط: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
هناك عدد قليل من مفاتيح الاختصار المتاحة عند استخدام وحدة التحكم.
/ : شرطة مائلة ستسمح لك بالتبديل بين الأصداف. الأسماء قابلة للتكوين في صفحة الخيارات.
أعلى/أسفل: استخدم السهم لأعلى/لأسفل للتنقل عبر سجل الإدخال.
Ctrl + Q: مسح نافذة الإخراج.
يمكن تكوين المنفذ المضيف (الجانب الأيسر) في docker-compose.yml
. لا ينبغي تغيير منفذ الحاوية (الجانب الأيمن). راجع مستندات الإنشاء للحصول على التفاصيل.
يحتوي Remotely على واجهة برمجة تطبيقات أساسية، والتي يمكن تصفحها على https://{your_server_url}/swagger
. تتطلب معظم نقاط النهاية المصادقة عبر رمز وصول API، والذي يمكن إنشاؤه بالانتقال إلى الحساب - الوصول إلى API.
عند الوصول إلى واجهة برمجة التطبيقات (API) من المتصفح على موقع ويب آخر، ستحتاج إلى إعداد CORS في إعدادات التطبيقات عن طريق إضافة عنوان URL الأصلي لموقع الويب إلى مصفوفة TrustedCorsOrigins. إذا لم تكن على دراية بكيفية عمل CORS، فإنني أوصي بقراءتها قبل المتابعة. على سبيل المثال، إذا أردت إنشاء نموذج تسجيل دخول على https://exmaple.com الذي قام بتسجيل الدخول إلى Remotely API، فسأحتاج إلى إضافة "https://example.com" إلى TrustedCorsOrigins.
يجب أن يكون لكل طلب إلى واجهة برمجة التطبيقات (API) رأس يسمى "X-Api-Key". يجب أن تكون القيمة عبارة عن معرّف وسر مفتاح واجهة برمجة التطبيقات، مفصولين بنقطتين (على سبيل المثال [ApiKey]:[ApiSecret]).
فيما يلي مثال لطلب واجهة برمجة التطبيقات:
POST https://localhost:5001/API/Scripting/ExecuteCommand/PSCore/f2b0a595-5ea8-471b-975f-12e70e0f3497 HTTP/1.1 Content-Type: application/json X-Api-Key: 31fb288d-af97-4ce1-ae7b-ceebb98281ac:HLkrKaZGExYvozSPvcACZw9awKkhHnNK User-Agent: PostmanRuntime/7.22.0 Accept: */* Cache-Control: no-cache Host: localhost:5001 Accept-Encoding: gzip, deflate, br Content-Length: 12 Connection: close Get-Location
فيما يلي أمثلة لاستخدام واجهة برمجة تطبيقات تسجيل الدخول المستندة إلى ملفات تعريف الارتباط (JavaScript):
// Log in with one request, then launch remote control with another. fetch("https://localhost:5001/api/Login/", { method: "post", credentials: "include", mode: "cors", body: '{"email":"[email protected]", "password":"P@ssword1"}', headers: { "Content-Type": "application/json", } }).then(response=>{ if (response.ok) { fetch("https://localhost:44351/api/RemoteControl/Viewer/b68c24b0-2c67-4524-ad28-dadea7a576a4", { method: "get", credentials: "include", mode: "cors" }).then(response=>{ if (response.ok) { response.text().then(url=>{ window.open(url); }) } }) } }) // Log in and launch remote control in the same request. fetch("https://localhost:5001/api/RemoteControl/Viewer/", { method: "post", credentials: "include", mode: "cors", body: '{"email":"[email protected]", "password":"P@ssword1", "deviceID":"b68c24b0-2c67-4524-ad28-dadea7a576a4"}', headers: { "Content-Type": "application/json", } }).then(response=>{ if (response.ok) { response.text().then(url=>{ window.open(url); }) } })
تمنحك Alerts API القدرة على إضافة وظائف المراقبة والتنبيه إلى نقاط نهاية جهازك. تهدف هذه الميزة إلى إضافة وظائف أساسية من نوع RMM دون الابتعاد كثيرًا عن الغرض الأساسي لـ Remotely.
يمكن إعداد التنبيهات لإظهار إشعار على موقع ويب Remotely، وإرسال بريد إلكتروني، و/أو تنفيذ طلب منفصل لواجهة برمجة التطبيقات.
لاستخدام التنبيهات، ستحتاج أولاً إلى إنشاء رمز مميز لواجهة برمجة التطبيقات (أو رموز مميزة متعددة) لتستخدمه أجهزتك. ثم قم بإنشاء مهمة مجدولة أو بعض البرامج النصية المتكررة الأخرى للقيام بهذا العمل. فيما يلي مثال لكيفية استخدام PowerShell لإنشاء مهمة مجدولة تتحقق من مساحة القرص وفقًا لجدول يومي.
$Trigger = New-JobTrigger -Daily -At "5 AM" $Option = New-ScheduledJobOption -RequireNetwork Register-ScheduledJob -ScriptBlock { $OsDrive = Get-PSDrive -Name C $FreeSpace = $OsDrive.Free / ($OsDrive.Used + $OsDrive.Free) if ($FreeSpace -lt .1) { Invoke-WebRequest -Uri "https://localhost:5001/api/Alerts/Create/" -Method Post -Headers @{ X-Api-Key="3e9d8273-1dc1-4303-bd50-7a133e36b9b7:S+82XKZdvg278pSFHWtUklqHENuO5IhH" } -Body @" { "AlertDeviceID": "f2b0a595-5ea8-471b-975f-12e70e0f3497", "AlertMessage": "Low hard drive space. Free Space: $([Math]::Round($FreeSpace * 100))%", "ApiRequestBody": null, "ApiRequestHeaders": null, "ApiRequestMethod": null, "ApiRequestUrl": null, "EmailBody": "Low hard drive space for device Maker.", "EmailSubject": "Hard Drive Space Alert", "EmailTo": "[email protected]", "ShouldAlert": true, "ShouldEmail": true, "ShouldSendApiRequest": false } "@ -ContentType "application/json" } } -Name "Check OS Drive Space" -Trigger $Trigger -ScheduledJobOption $Option