Eine Fernsteuerungs- und Remote-Scripting-Lösung, erstellt mit .NET, Blazor und SignalR Core.
Ich suche Betreuer, die mir helfen! Wenn Sie ein .NET-Entwickler sind und daran interessiert sind, Remotely voranzubringen, senden Sie mir eine DM auf Discord an jaredatimmy
.
Subreddit: https://www.reddit.com/r/remotely_app/
Docker: https://hub.docker.com/r/immybot/remotely
Tutorial: https://www.youtube.com/watch?v=t-TFvr7sZ6M (Danke, @bmcgonag!)
mkdir -p /var/www/remotely wget -q https://raw.githubusercontent.com/immense/Remotely/master/docker-compose/docker-compose.yml docker-compose up -d
Der einzige unterstützte Reverse-Proxy ist Caddy, und zwar nur, wenn er direkt mit dem Internet verbunden ist. Die Standardkonfiguration für Caddy bietet alles, was ASP.NET Core und SignalR für eine ordnungsgemäße Funktion benötigen.
Wenn Sie Netzwerkprobleme mit einem anderen Setup haben, beispielsweise mit einer zusätzlichen Firewall oder mit Nginx, wenden Sie sich bitte an die Community-Unterstützung auf der Registerkarte „Diskussionen“, auf Reddit oder auf einer anderen sozialen Website. Die Remote-Betreuer können einfach nicht Anleitung und Support für alle möglichen Umgebungskonfigurationen bieten.
Vor diesem Hintergrund erfordert ASP.NET Core, dass die folgenden Header festgelegt werden, wenn sie sich hinter einem Reverse-Proxy befinden: X-Forwarded-Proto
, X-Forwarded-Host
und X-Forwarded-For
. Diese beziehen sich auf das Schema (http/https), die URL der ursprünglichen Anfrage bzw. die IP-Adresse des Clients. Das resultierende Schema und der Host werden in die Installationsprogramme und Desktop-Clients eingefügt, damit diese wissen, wohin sie Anfragen senden müssen. Die Client-IP-Adresse wird in den Geräteinformationen verwendet.
Der Remotely-Code analysiert oder verarbeitet diese Werte nicht. Dies erfolgt intern durch die integrierte Middleware von ASP.NET Core. Wenn die Werte nicht wie erwartet angezeigt werden, liegt das daran, dass die Header fehlten, nicht die richtigen Werte enthielten, nicht das richtige Format hatten oder nicht über eine Kette bekannter Proxys kamen (siehe unten).
Um Injektionsangriffe zu vermeiden, akzeptiert ASP.NET Core standardmäßig nur weitergeleitete Header von Loopback-Adressen. Remotely fügt auch die Docker-Gateway-IP (172.28.0.1) hinzu, die in der Docker-Compose-Datei definiert ist. Wenn Sie eine nicht standardmäßige Konfiguration verwenden, müssen Sie alle Firewall- und Reverse-Proxy-Adressen zum KnownProxies
Array in der Serverkonfiguration hinzufügen.
Wenn Sie Ihre Reverse-Proxys nicht richtig konfigurieren können, können Sie zumindest die Verwendung des HTTPS-Schemas erzwingen, indem Force Client HTTPS
auf der Seite „Serverkonfiguration“ festlegen.
Die vollständige Dokumentation von Microsoft zu diesem Thema finden Sie hier: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
Daten für Remotely werden im Container unter /app/AppData
gespeichert, der in /var/www/remotely/
auf Ihrem Docker-Host gemountet wird.
Dieser Ordner enthält Remotely.db und vom Server generierte Protokolle.
Diese Dateien bleiben beim Abbau und der Einrichtung neuer Remote-Container bestehen.
Wenn Sie ein Upgrade von einer Nicht-Docker-Version von Remotely durchführen, überschreiben Sie die DB-Datei Ihrer vorherigen Installation.
Verwenden Sie Caddy als Reverse-Proxy, wenn Sie die Site dem Internet zugänglich machen möchten.
Wenn dies die erste Ausführung ist, erstellen Sie Ihr Konto, indem Sie auf der Hauptseite auf die Schaltfläche Register
klicken.
Organisationen werden verwendet, um Benutzer, Geräte und andere Datenelemente in einem einzigen Pool zusammenzufassen.
Standardmäßig kann auf einem Server nur eine Organisation existieren.
Die Schaltfläche Register
verschwindet.
Es wird nicht mehr möglich sein, selbst Konten zu erstellen.
Um die Selbstregistrierung zu ermöglichen, erhöhen Sie den MaxOrganizationCount
oder setzen Sie ihn auf -1 (siehe Abschnitt „Konfiguration“).
Dieses Konto fungiert sowohl als Serveradministrator als auch als Organisationsadministrator.
Für das Konto wird automatisch eine Organisation erstellt.
Sie können die HTTP-Protokollierung aktivieren, um alle Anfragen und Antworten in den Serverprotokollen anzuzeigen, einschließlich Header. Dies kann beim Debuggen von Reverse-Proxy-, API- oder SignalR-Problemen hilfreich sein. Die Option kann auf der Seite „Serverkonfiguration“ aktiviert werden.
Nachdem Sie die oben genannten Änderungen vorgenommen haben, müssen Sie den Container neu starten, damit die Änderungen wirksam werden.
Mit den folgenden Schritten konfigurieren Sie Ihren Windows 11-Computer für den Aufbau des Remote-Servers und der Remote-Clients.
Installieren Sie Visual Studio 2022.
.NET SDK (neueste Version).
MSBuild (das Roslyn-Compiler automatisch auswählt).
NuGet-Ziele und Build-Aufgaben.
.NET Framework 4.8 SDK.
Für Debugging und Entwicklung benötigen Sie alle relevanten Workloads.
ASP.NET und Webentwicklung
.NET-Desktop-Entwicklung
Plattformübergreifende .NET Core-Entwicklung
Link: https://visualstudio.microsoft.com/downloads/
Sie sollten die folgenden Workloads ausgewählt haben:
Sie sollten die folgenden Einzelkomponenten ausgewählt haben:
Installieren Sie Git für Windows.
Link: https://git-scm.com/downloads
Installieren Sie den neuesten LTS-Knoten:
Link: https://nodejs.org/
Klonen Sie das Git-Repository: git clone https://github.com/immense/Remotely --recurse
Beim Debuggen verwendet der Agent eine vordefinierte Geräte-ID und stellt eine Verbindung zu https://localhost:5001 her.
In der Entwicklungsumgebung weist der Server alle verbindenden Agenten der ersten Organisation zu.
Mit den beiden oben genannten können Sie den Agenten und den Server gemeinsam debuggen und Ihr Gerät in der Liste anzeigen.
Das erste erstellte Konto ist ein Administrator sowohl für den Server als auch für die Organisation, die für das Konto erstellt wurde.
Ein Organisationsadministrator hat Zugriff auf die Organisationsseite und Serverprotokolleinträge, die für seine Organisation spezifisch sind. Ein Serveradministrator hat Zugriff auf die Seite „Serverkonfiguration“ und kann Serverprotokolleinträge sehen, die nicht zu einer Organisation gehören.
Im Abschnitt „Konto“ gibt es eine Registerkarte für das Branding, die für die Schnellsupport-Clients und das Windows-Installationsprogramm gilt.
Allerdings müssen die Clients aus dem Quellcode erstellt und die Server-URL in den Apps fest codiert sein, damit sie die Branding-Informationen abrufen können.
Der Datenbankanbieter, die Verbindungszeichenfolgen und der ASP.NET Core-Port können über Umgebungsvariablen in docker-compose.yml
konfiguriert werden.
Alle anderen Konfigurationen werden auf der Seite „Serverkonfiguration“ vorgenommen, sobald Sie angemeldet sind.
AllowApiLogin: Ob die Anmeldung über den API-Controller zugelassen werden soll. Für diesen Ansatz werden API-Zugriffstokens empfohlen.
BannedDevices: Ein Array von Geräte-IDs, Namen oder IP-Adressen, die gesperrt werden sollen. Wenn sie versuchen, eine Verbindung herzustellen, wird sofort ein Deinstallationsbefehl zurückgesendet.
DataRetentionInDays: Wie lange Protokolle und andere Daten auf dem Server gespeichert werden. Legen Sie den Wert auf -1 fest, um ihn auf unbestimmte Zeit beizubehalten (nicht empfohlen).
DBProvider: Bestimmt, welcher der drei Verbindungsstrings (oben) verwendet wird. Der entsprechende DB-Anbieter für den Datenbanktyp wird automatisch im Code geladen.
EnableWindowsEventLog: Legt fest, ob auch Serverprotokolleinträge zum Windows-Ereignisprotokoll hinzugefügt werden sollen.
EnforceAttendedAccess: Clients werden aufgefordert, unbeaufsichtigte Fernsteuerungsversuche zuzulassen.
EnableRemoteControlRecording: Ob Aufzeichnungen von Fernsteuerungssitzungen auf dem Server gespeichert werden sollen.
Sie werden in /app/AppData/recordings
gespeichert.
Ihre Aufbewahrung wird durch DataRetentionInDays
geregelt.
ForceClientHTTPS: Zwingt Installationsprogramme und Desktop-Clients zur Verwendung des HTTPS-Schemas, auch wenn weitergeleitete Header falsch konfiguriert sind.
KnownProxies: Wenn sich Ihr Reverse-Proxy auf einem anderen Computer befindet und Anforderungen an den Remotely-Server weiterleitet, müssen Sie die IP des Reverse-Proxy-Servers zu diesem Array hinzufügen.
MaxOrganizationCount: Standardmäßig kann eine Organisation auf dem Server existieren, die automatisch erstellt wird, wenn das erste Konto registriert wird. Danach wird die Selbstregistrierung deaktiviert.
Setzen Sie diesen Wert auf -1 oder erhöhen Sie ihn auf eine bestimmte Zahl, um Mandantenfähigkeit zu ermöglichen.
RedirectToHttps: Ob ASP.NET Core den gesamten Datenverkehr von HTTP nach HTTPS umleitet. Dies ist unabhängig von Caddy-, Nginx- und IIS-Konfigurationen, die dasselbe tun.
RemoteControlNotifyUsers: Legt fest, ob dem Endbenutzer eine Benachrichtigung angezeigt werden soll, wenn eine unbeaufsichtigte Fernsteuerungssitzung beginnt.
RemoteControlRequiresAuthentication: Ob die Fernsteuerungsseite eine Authentifizierung erfordert, um eine Verbindung herzustellen.
Require2FA: Benutzer müssen 2FA einrichten, bevor sie die Haupt-App verwenden können.
Smpt-: SMTP-Einstellungen für automatisch generierte System-E-Mails (z. B. Registrierung und Passwort-Reset).
Thema: Das für die Website zu verwendende Farbthema. Die Werte sind „Hell“ oder „Dunkel“. Dies kann auch pro Benutzer unter Konto – Optionen konfiguriert werden.
TrustedCorsOrigins: Für Cross-Origin-API-Anfragen über JavaScript. Die in diesem Array aufgeführten Websites dürfen Anfragen an die API stellen. Dadurch wird keine Authentifizierung gewährt, die auf den meisten Endpunkten immer noch erforderlich ist.
UseHsts: Ob ASP.NET Core HTTP Strict Transport Security verwenden wird.
UseHttpLogging: Aktiviert die Protokollierung für alle HTTP-Anfragen. Ermöglicht außerdem zusätzliche Protokolleinträge in ClientDownloadsController
bezüglich des effektiven Schemas, Hosts und der Remote-IP-Adresse als Ergebnis der Verarbeitung weitergeleiteter Header.
Damit dies funktioniert, müssen Sie explizit eine Protokollebene für Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware
festlegen. Ein Beispiel finden Sie in appsettings.json.
Standardmäßig verwendet Remotely eine SQLite-Datenbank. Bei der ersten Ausführung wird eine Datei erstellt, wie für die SQLite-Verbindungszeichenfolge in appsettings.json angegeben.
Sie können die Datenbank ändern, indem Sie DBProvider
in ApplicationOptions
in SQLServer
oder PostgreSQL
ändern.
Auf Clients werden Protokolle in %ProgramData%RemotelyLogs
gespeichert
Innerhalb des Servercontainers werden Protokolle in /app/AppData/logs
geschrieben, die (standardmäßig) in /var/www/remotely/Logs
auf dem Host gemountet werden.
Integrierte ASP.NET Core-Protokolle werden in die Konsole geschrieben (stdout). Sie können dies bei Bedarf in eine Datei umleiten.
In IIS kann dies in der Datei web.config erfolgen, indem stdoutLogEnabled auf true gesetzt wird.
Auf Windows-Servern können die oben genannten Protokolle auch in das Windows-Ereignisprotokoll geschrieben werden.
Dies wird in der Serverkonfiguration aktiviert, indem EnableWindowsEventLog auf true gesetzt wird.
Sie können Protokollierungsstufen und andere Einstellungen in appsetttings.json konfigurieren.
Weitere Informationen: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/
Windows: Es wird nur die neueste Version von Windows 11 getestet. Windows 7 und 8.1 sollten funktionieren, allerdings wird die Leistung unter Windows 7 reduziert.
Windows 2019/2022 sollte ebenfalls funktionieren, wird aber nicht regelmäßig getestet.
Linux: Es wird nur die neueste LTS-Version von Ubuntu getestet.
Für den „Quick Support“-Client von Ubuntu müssen Sie zunächst die folgenden Abhängigkeiten installieren:
libc6-dev
libxtst-dev
xclip
libx11-dev
libxrandr-dev
Idealerweise führen Sie die Fernsteuerung von einem echten Computer oder Laptop aus durch. Ich habe jedoch versucht, die Fernbedienung zumindest einigermaßen von einem mobilen Gerät aus nutzbar zu machen. Hier sind die Steuerelemente:
Linksklick: Einmaliges Tippen
Rechtsklick: Lange drücken und dann loslassen
Klicken und Ziehen: Lange drücken und dann ziehen
Unter /get-support
gibt es eine Seite, auf der Endbenutzer Support anfordern können. Wenn das Formular gesendet wird, wird auf der Hauptseite über dem Raster eine Warnung angezeigt.
Eine Verknüpfung zu dieser Seite wird im Ordner Program FilesRemotely
abgelegt. Sie können es überall kopieren, wo Sie möchten. Sie können es auch automatisch auf den Desktop kopieren lassen, indem Sie im Installationsprogramm den Schalter -supportshortcut
verwenden.
.NET verfügt über zwei Bereitstellungsmethoden: Framework-abhängig und eigenständig.
Für Framework-abhängige Bereitstellungen muss die .NET-Runtime auf den Zielcomputern installiert sein. Es muss sich um dieselbe Version handeln, die zum Erstellen der App verwendet wurde.
Eigenständige Bereitstellungen umfassen eine Kopie der Laufzeit, sodass Sie diese nicht auf den Zielcomputern installieren müssen. Dadurch ist die Gesamtdateigröße deutlich größer.
.NET verwendet Laufzeitbezeichner, die beim Erstellen als Ziel verwendet werden.
Link: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
Bei der Verwendung der Konsole stehen einige Tastenkombinationen zur Verfügung.
/ : Mit dem Schrägstrich können Sie zwischen Shells wechseln. Die Namen können auf der Seite „Optionen“ konfiguriert werden.
Aufwärts/Abwärts: Verwenden Sie die Aufwärts-/Abwärtspfeile, um durch den Eingabeverlauf zu blättern.
Strg + Q: Leeren Sie das Ausgabefenster.
Der Host-Port (linke Seite) kann in docker-compose.yml
konfiguriert werden. Der Containerport (rechte Seite) sollte nicht verändert werden. Weitere Informationen finden Sie in den Compose-Dokumenten.
Remotely verfügt über eine grundlegende API, die unter https://{your_server_url}/swagger
durchsucht werden kann. Die meisten Endpunkte erfordern eine Authentifizierung über ein API-Zugriffstoken, das unter Konto – API-Zugriff erstellt werden kann.
Wenn Sie über den Browser einer anderen Website auf die API zugreifen, müssen Sie CORS in den App-Einstellungen einrichten, indem Sie die Website-Ursprungs-URL zum TrustedCorsOrigins-Array hinzufügen. Wenn Sie mit der Funktionsweise von CORS nicht vertraut sind, empfehle ich Ihnen, sich darüber zu informieren, bevor Sie fortfahren. Wenn ich beispielsweise ein Anmeldeformular auf https://exmaple.com erstellen möchte, das sich bei der Remotely-API anmeldet, muss ich „https://example.com“ zu TrustedCorsOrigins hinzufügen.
Jede Anfrage an die API muss einen Header mit dem Namen „X-Api-Key“ haben. Der Wert sollte die ID und das Geheimnis des API-Schlüssels sein, getrennt durch einen Doppelpunkt (z. B. [ApiKey]:[ApiSecret]).
Unten finden Sie eine Beispiel-API-Anfrage:
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
Nachfolgend finden Sie Beispiele für die Verwendung der Cookie-basierten Login-API (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); }) } })
Mit der Alerts-API haben Sie die Möglichkeit, Ihren Geräteendpunkten Überwachungs- und Warnfunktionen hinzuzufügen. Diese Funktion soll grundlegende RMM-Funktionen hinzufügen, ohne zu weit vom Hauptzweck von Remotely abzuweichen.
Benachrichtigungen können so eingerichtet werden, dass eine Benachrichtigung auf der Remotely-Website angezeigt wird, eine E-Mail gesendet wird und/oder eine separate API-Anfrage ausgeführt wird.
Um Warnungen verwenden zu können, müssen Sie zunächst ein API-Token (oder mehrere Token) erstellen, damit Ihre Geräte es verwenden können. Erstellen Sie dann eine geplante Aufgabe oder ein anderes wiederkehrendes Skript, um die Arbeit zu erledigen. Nachfolgend finden Sie ein Beispiel für die Verwendung von PowerShell zum Erstellen eines geplanten Jobs, der den Speicherplatz täglich überprüft.
$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