Solusi kendali jarak jauh dan skrip jarak jauh, dibuat dengan .NET, Blazor, dan SignalR Core.
Saya mencari pengelola untuk membantu saya! Jika Anda seorang pengembang .NET dan tertarik untuk membantu memajukan Remotely, kirimi saya DM di Discord di jaredatimmy
.
Subreddit: https://www.reddit.com/r/remotely_app/
buruh pelabuhan: https://hub.docker.com/r/immybot/remotely
Tutorial: https://www.youtube.com/watch?v=t-TFvr7sZ6M (Terima kasih, @bmcgonag!)
mkdir -p /var/www/remotely wget -q https://raw.githubusercontent.com/immense/Remotely/master/docker-compose/docker-compose.yml docker-compose up -d
Satu-satunya proxy terbalik yang didukung adalah Caddy, dan hanya jika terhubung langsung ke internet. Konfigurasi default untuk Caddy menyediakan semua yang dibutuhkan ASP.NET Core dan SignalR agar berfungsi dengan benar.
Jika Anda mengalami masalah jaringan dengan pengaturan lainnya, misalnya dengan firewall tambahan atau dengan Nginx, silakan mencari dukungan komunitas di tab Diskusi, di Reddit, atau situs sosial lainnya. Pengelola Remotely tidak bisa memberikan panduan dan dukungan untuk semua kemungkinan pengaturan lingkungan.
Oleh karena itu, ASP.NET Core memerlukan header berikut untuk disetel saat berada di belakang proxy terbalik: X-Forwarded-Proto
, X-Forwarded-Host
, dan X-Forwarded-For
. Ini masing-masing berkorelasi dengan skema (http/https), URL permintaan asli, dan alamat IP klien. Skema dan host yang dihasilkan dimasukkan ke dalam penginstal dan klien desktop, sehingga mereka tahu ke mana harus mengirim permintaan. Alamat IP klien digunakan dalam info perangkat.
Kode Remotely tidak mengurai atau menangani nilai-nilai ini. Hal ini dilakukan secara internal oleh middleware bawaan ASP.NET Core. Jika nilai tidak muncul seperti yang diharapkan, ini karena headernya hilang, tidak berisi nilai yang benar, formatnya tidak benar, atau tidak muncul melalui rangkaian proxy yang dikenal (lihat di bawah).
Untuk menghindari serangan injeksi, ASP.NET Core secara default hanya menerima header yang diteruskan dari alamat loopback. Secara jarak jauh juga akan menambahkan IP gateway Docker (172.28.0.1) yang ditentukan dalam file docker-compose. Jika Anda menggunakan konfigurasi non-default, Anda harus menambahkan semua firewall dan membalikkan alamat proxy ke array KnownProxies
di Konfigurasi Server.
Jika Anda tidak dapat mengkonfigurasi proxy terbalik dengan benar, Anda setidaknya dapat memaksa penggunaan skema HTTPS dengan mengatur Force Client HTTPS
di halaman Konfigurasi Server.
Dokumentasi lengkap Microsoft tentang topik ini dapat ditemukan di sini: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
Data untuk Remotely akan disimpan dalam wadah di bawah /app/AppData
, yang akan dipasang ke /var/www/remotely/
pada host Docker Anda.
Folder ini akan berisi Remotely.db dan log yang dihasilkan oleh server.
File-file ini akan bertahan melalui pembongkaran dan penyiapan container Remotely baru.
Jika memutakhirkan dari Remotely versi non-Docker, timpa file DB dari instalasi Anda sebelumnya.
Gunakan Caddy sebagai proxy terbalik jika Anda ingin mengekspos situs ke internet.
Jika ini pertama kali dijalankan, buat akun Anda dengan mengklik tombol Register
di halaman utama.
Organisasi digunakan untuk mengelompokkan pengguna, perangkat, dan item data lainnya ke dalam satu kumpulan.
Secara default, hanya satu organisasi yang dapat berada di server.
Tombol Register
akan hilang.
Orang tidak lagi dapat membuat akun sendiri.
Untuk mengizinkan pendaftaran mandiri, tingkatkan MaxOrganizationCount
atau setel ke -1 (lihat bagian Konfigurasi).
Akun ini akan menjadi admin server dan admin organisasi.
Sebuah organisasi secara otomatis dibuat untuk akun tersebut.
Anda dapat mengaktifkan logging HTTP untuk melihat semua permintaan dan respons di log server, termasuk header. Ini dapat berguna untuk men-debug masalah proxy terbalik, API, atau SignalR. Opsi ini dapat diaktifkan di halaman Konfigurasi Server.
Setelah mengubah hal di atas, Anda harus memulai ulang penampung agar perubahan diterapkan.
Langkah-langkah berikut akan mengonfigurasi mesin Windows 11 Anda untuk membangun server dan klien jarak jauh.
Instal Visual Studio 2022.
.NET SDK (versi terbaru).
MSBuild (yang secara otomatis memilih kompiler Roslyn).
NuGet menargetkan dan membangun tugas.
.NET Framework 4.8 SDK.
Untuk proses debug dan pengembangan, Anda memerlukan semua beban kerja yang relevan.
ASP.NET dan pengembangan web
Pengembangan desktop .NET
Pengembangan lintas platform .NET Core
Tautan: https://visualstudio.microsoft.com/downloads/
Anda harus memilih Beban Kerja berikut:
Anda harus memilih Komponen Individual berikut:
Instal Git untuk Windows.
Tautan: https://git-scm.com/downloads
Instal Node LTS terbaru:
Tautan: https://nodejs.org/
Kloning repositori git: git clone https://github.com/immense/Remotely --recurse
Saat melakukan debug, agen akan menggunakan ID perangkat yang telah ditentukan sebelumnya dan terhubung ke https://localhost:5001.
Dalam lingkungan pengembangan, server akan menugaskan semua agen penghubung ke organisasi pertama.
Dua cara di atas memungkinkan Anda untuk men-debug agen dan server secara bersamaan, dan melihat perangkat Anda dalam daftar.
Akun pertama yang dibuat akan menjadi admin untuk server dan organisasi yang dibuat untuk akun tersebut.
Admin organisasi memiliki akses ke halaman Organisasi dan entri log server khusus untuk organisasinya. Admin server memiliki akses ke halaman Konfigurasi Server dan dapat melihat entri log server yang bukan milik organisasi.
Di bagian Akun, terdapat tab untuk pencitraan merek, yang akan berlaku untuk klien dukungan cepat dan penginstal Windows.
Namun, klien harus dibuat dari sumber dengan URL server yang dikodekan dalam aplikasi agar mereka dapat mengambil informasi merek.
Penyedia database, string koneksi, dan port ASP.NET Core dapat dikonfigurasi melalui variabel lingkungan di docker-compose.yml
.
Semua konfigurasi lainnya dilakukan di halaman Konfigurasi Server setelah Anda masuk.
AllowApiLogin: Apakah mengizinkan login melalui pengontrol API. Token akses API direkomendasikan untuk pendekatan ini.
Perangkat yang Dilarang: Serangkaian ID perangkat, nama, atau alamat IP yang akan dilarang. Saat mereka mencoba menyambung, perintah uninstall akan segera dikirim kembali.
DataRetentionInDays: Berapa lama log dan data lainnya akan disimpan di server. Setel ke -1 untuk mempertahankannya tanpa batas waktu (tidak disarankan).
DBProvider: Menentukan mana dari tiga string koneksi (di atas) yang akan digunakan. Penyedia DB yang sesuai untuk tipe database secara otomatis dimuat dalam kode.
EnableWindowsEventLog: Apakah akan menambahkan entri log server ke Windows Event Log.
EnforceAtendedAccess: Klien akan diminta untuk mengizinkan upaya kendali jarak jauh tanpa pengawasan.
EnableRemoteControlRecording: Apakah akan menyimpan rekaman sesi kendali jarak jauh di server.
Mereka akan disimpan di /app/AppData/recordings
.
Retensinya diatur oleh DataRetentionInDays
.
ForceClientHTTPS: Memaksa penginstal dan klien desktop untuk menggunakan skema HTTPS, meskipun header yang diteruskan salah dikonfigurasi.
Proksi yang Dikenal: Jika proksi terbalik Anda berada di mesin lain dan meneruskan permintaan ke server Jarak Jauh, Anda perlu menambahkan IP server proksi terbalik ke array ini.
MaxOrganizationCount: Secara default, satu organisasi dapat ada di server, yang dibuat secara otomatis saat akun pertama didaftarkan. Setelah itu, pendaftaran mandiri akan dinonaktifkan.
Setel ini ke -1 atau tingkatkan ke angka tertentu untuk memungkinkan multi-tenancy.
RedirectToHttps: Apakah ASP.NET Core akan mengalihkan semua lalu lintas dari HTTP ke HTTPS. Ini tidak bergantung pada konfigurasi Caddy, Nginx, dan IIS yang melakukan hal yang sama.
RemoteControlNotifyUsers: Apakah akan menampilkan pemberitahuan kepada pengguna akhir ketika sesi kendali jarak jauh tanpa pengawasan dimulai.
RemoteControlRequiresAuthentication: Apakah halaman kendali jarak jauh memerlukan otentikasi untuk membuat koneksi.
Require2FA: Mewajibkan pengguna untuk menyiapkan 2FA sebelum mereka dapat menggunakan aplikasi utama.
Smpt-: Pengaturan SMTP untuk email sistem yang dibuat secara otomatis (seperti pendaftaran dan pengaturan ulang kata sandi).
Tema: Tema warna yang digunakan untuk situs. Nilainya adalah "Terang" atau "Gelap". Ini juga dapat dikonfigurasi per pengguna di Akun - Opsi.
TrustedCorsOrigins: Untuk permintaan API lintas asal melalui JavaScript. Situs web yang terdaftar dalam array ini diizinkan untuk membuat permintaan ke API. Ini tidak memberikan autentikasi, yang masih diperlukan di sebagian besar titik akhir.
UseHsts: Apakah ASP.NET Core akan menggunakan HTTP Strict Transport Security.
UseHttpLogging: Mengaktifkan pencatatan untuk semua permintaan HTTP. Juga mengaktifkan entri log tambahan di ClientDownloadsController
mengenai skema efektif, host, dan alamat IP jarak jauh sebagai hasil pemrosesan header yang diteruskan.
Anda harus secara eksplisit menetapkan tingkat log untuk Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware
agar ini berfungsi. Lihat appsettings.json sebagai contoh.
Secara default, Remotely menggunakan database SQLite. Saat pertama kali dijalankan, ini membuat file seperti yang ditentukan untuk string koneksi SQLite di appsettings.json.
Anda dapat mengubah database dengan mengubah DBProvider
di ApplicationOptions
menjadi SQLServer
atau PostgreSQL
.
Pada klien, log disimpan di %ProgramData%RemotelyLogs
Di dalam wadah server, log akan ditulis ke /app/AppData/logs
, yang (secara default) akan dipasang ke /var/www/remotely/Logs
di host.
Log ASP.NET Core bawaan ditulis ke konsol (stdout). Anda dapat mengarahkan ini ke file jika diinginkan.
Di IIS, ini dapat dilakukan di file web.config dengan menyetel stdoutLogEnabled ke true.
Di Server Windows, log di atas juga dapat ditulis ke Log Peristiwa Windows.
Ini diaktifkan di Server Config dengan mengatur EnableWindowsEventLog ke true.
Anda dapat mengonfigurasi tingkat logging dan pengaturan lainnya di appsetttings.json.
Informasi lebih lanjut: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/
Windows: Hanya versi terbaru Windows 11 yang diuji. Windows 7 dan 8.1 seharusnya berfungsi, meskipun kinerjanya akan berkurang pada Windows 7.
Windows 2019/2022 seharusnya berfungsi juga, tetapi tidak diuji secara berkala.
Linux: Hanya Ubuntu versi LTS terbaru yang diuji.
Untuk klien "dukungan cepat" Ubuntu, Anda harus menginstal dependensi berikut terlebih dahulu:
libc6-dev
libxtst-dev
xclip
libx11-dev
libxrandr-dev
Idealnya, Anda melakukan kendali jarak jauh dari komputer atau laptop sebenarnya. Namun, saya telah mencoba membuat remote control setidaknya dapat digunakan dari perangkat seluler. Berikut kontrolnya:
Klik kiri: Ketuk satu kali
Klik kanan: Tekan lama, lalu lepaskan
Klik-dan-seret: Tekan lama, lalu seret
Ada halaman di /get-support
tempat pengguna akhir dapat meminta dukungan. Saat formulir dikirimkan, peringatan muncul di halaman utama, di atas kisi.
Pintasan ke halaman ini ditempatkan di folder Program FilesRemotely
. Anda dapat menyalinnya di mana pun Anda suka. Anda juga dapat menyalinnya ke desktop secara otomatis dengan menggunakan tombol -supportshortcut
pada penginstal.
.NET memiliki dua metode penerapan: bergantung pada kerangka kerja dan mandiri.
Penerapan yang bergantung pada kerangka kerja memerlukan runtime .NET untuk diinstal pada komputer target. Versi tersebut harus sama dengan yang digunakan untuk membuat aplikasi.
Penerapan mandiri menyertakan salinan runtime, jadi Anda tidak perlu menginstalnya di komputer target. Hasilnya, ukuran total file jauh lebih besar.
.NET menggunakan pengidentifikasi runtime yang ditargetkan saat membangun.
Tautan: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
Ada beberapa tombol pintas yang tersedia saat menggunakan konsol.
/ : Slash akan memungkinkan Anda untuk beralih antar shell. Nama-nama tersebut dapat dikonfigurasi di halaman Opsi.
Atas/Bawah: Gunakan panah atas/bawah untuk menelusuri riwayat masukan.
Ctrl + Q: Hapus jendela keluaran.
Port host (sisi kiri) dapat dikonfigurasi di docker-compose.yml
. Pelabuhan kontainer (sisi kanan) tidak boleh diubah. Lihat dokumen penulisan untuk detailnya.
Remotely memiliki API dasar, yang dapat dijelajahi di https://{your_server_url}/swagger
. Sebagian besar titik akhir memerlukan autentikasi melalui token akses API, yang dapat dibuat dengan membuka Akun - Akses API.
Saat mengakses API dari browser di situs web lain, Anda harus menyiapkan CORS di pengaturan aplikasi dengan menambahkan URL asal situs web ke array TrustedCorsOrigins. Jika Anda belum memahami cara kerja CORS, saya sarankan untuk membacanya sebelum melanjutkan. Misalnya, jika saya ingin membuat formulir login di https://exmaple.com yang masuk ke API Remotely, saya perlu menambahkan "https://example.com" ke TrustedCorsOrigins.
Setiap permintaan ke API harus memiliki header bernama "X-Api-Key". Nilainya harus berupa ID dan rahasia kunci API, dipisahkan dengan titik dua (yaitu [ApiKey]:[ApiSecret]).
Di bawah ini adalah contoh permintaan API:
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
Di bawah ini adalah contoh penggunaan API login berbasis cookie (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 memberi Anda kemampuan untuk menambahkan fungsionalitas pemantauan dan peringatan ke titik akhir perangkat Anda. Fitur ini dimaksudkan untuk menambahkan fungsionalitas dasar tipe RMM tanpa menyimpang terlalu jauh dari tujuan utama Remotely.
Peringatan dapat diatur untuk menampilkan pemberitahuan di situs web Remotely, mengirim email, dan/atau melakukan permintaan API terpisah.
Untuk menggunakan Alerts, pertama-tama Anda harus membuat token API (atau beberapa token) agar perangkat Anda dapat digunakan. Kemudian buat tugas terjadwal atau skrip berulang lainnya untuk melakukan pekerjaan itu. Di bawah ini adalah contoh cara menggunakan PowerShell untuk membuat Pekerjaan Terjadwal yang memeriksa ruang disk pada jadwal harian.
$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