Une solution de contrôle et de script à distance, construite avec .NET, Blazor et SignalR Core.
Je recherche des mainteneurs pour m'aider ! Si vous êtes un développeur .NET et que vous souhaitez contribuer à faire avancer Remotely, envoyez-moi un DM sur Discord à jaredatimmy
.
Sous-reddit : https://www.reddit.com/r/remotely_app/
Docker : https://hub.docker.com/r/immybot/remotely
Tutoriel : https://www.youtube.com/watch?v=t-TFvr7sZ6M (Merci, @bmcgonag !)
mkdir -p /var/www/remotely wget -q https://raw.githubusercontent.com/immense/Remotely/master/docker-compose/docker-compose.yml docker-compose up -d
Le seul proxy inverse pris en charge est Caddy, et uniquement lorsqu'il fait directement face à Internet. La configuration par défaut de Caddy fournit tout ce dont ASP.NET Core et SignalR ont besoin pour fonctionner correctement.
Si vous rencontrez des problèmes de réseau avec une autre configuration, comme avec un pare-feu supplémentaire ou avec Nginx, veuillez rechercher l'assistance de la communauté dans l'onglet Discussions, sur Reddit ou sur un autre site social. Les responsables de Remotely ne peuvent tout simplement pas fournir de conseils et d'assistance pour toutes les configurations d'environnement possibles.
Cela dit, ASP.NET Core nécessite que les en-têtes suivants soient définis derrière un proxy inverse : X-Forwarded-Proto
, X-Forwarded-Host
et X-Forwarded-For
. Ceux-ci correspondent respectivement au schéma (http/https), à l'URL de la demande d'origine et à l'adresse IP du client. Le schéma et l'hôte résultants sont injectés dans les installateurs et les clients de bureau, afin qu'ils sachent où envoyer les requêtes. L'adresse IP du client est utilisée dans les informations sur l'appareil.
Le code Remotely n’analyse ni ne gère ces valeurs. Cela est effectué en interne par le middleware intégré d'ASP.NET Core. Si les valeurs n'apparaissent pas comme prévu, c'est parce que les en-têtes étaient manquants, ne contenaient pas les bonnes valeurs, n'étaient pas dans le bon format ou ne provenaient pas d'une chaîne de proxys connus (voir ci-dessous).
Pour éviter les attaques par injection, ASP.NET Core n'accepte par défaut que les en-têtes transférés des adresses de bouclage. À distance ajoutera également l'adresse IP de la passerelle Docker (172.28.0.1) définie dans le fichier docker-compose. Si vous utilisez une configuration autre que celle par défaut, vous devez ajouter toutes les adresses de pare-feu et de proxy inverse au tableau KnownProxies
dans la configuration du serveur.
Si vous ne parvenez pas à configurer correctement vos proxys inverses, vous pouvez au moins forcer l'utilisation du schéma HTTPS en définissant Force Client HTTPS
dans la page de configuration du serveur.
La documentation complète de Microsoft sur le sujet peut être trouvée ici : https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
Les données pour Remotely seront enregistrées dans le conteneur sous /app/AppData
, qui sera monté sur /var/www/remotely/
sur votre hôte Docker.
Ce dossier contiendra Remotely.db et les journaux générés par le serveur.
Ces fichiers persisteront jusqu'au démontage et à la configuration de nouveaux conteneurs Remotely.
Si vous effectuez une mise à niveau à partir d'une version non Docker de Remotely, écrasez le fichier DB de votre installation précédente.
Utilisez Caddy comme proxy inverse si vous souhaitez exposer le site à Internet.
S'il s'agit de la première exécution, créez votre compte en cliquant sur le bouton Register
sur la page principale.
Les organisations sont utilisées pour regrouper les utilisateurs, les appareils et d’autres éléments de données dans un seul pool.
Par défaut, une seule organisation peut exister sur un serveur.
Le bouton Register
disparaîtra.
Les gens ne pourront plus créer eux-mêmes des comptes.
Pour autoriser l'auto-enregistrement, augmentez le MaxOrganizationCount
ou définissez-le sur -1 (voir la section Configuration).
Ce compte sera à la fois l'administrateur du serveur et l'administrateur de l'organisation.
Une organisation est automatiquement créée pour le compte.
Vous pouvez activer la journalisation HTTP pour voir toutes les demandes et réponses dans les journaux du serveur, y compris les en-têtes. Cela peut être utile pour déboguer les problèmes de proxy inverse, d'API ou de SignalR. L'option peut être activée sur la page de configuration du serveur.
Après avoir modifié ce qui précède, vous devez redémarrer le conteneur pour que les modifications prennent effet.
Les étapes suivantes configureront votre ordinateur Windows 11 pour créer le serveur et les clients à distance.
Installez Visual Studio 2022.
SDK .NET (dernière version).
MSBuild (qui sélectionne automatiquement les compilateurs Roslyn).
NuGet cible et crée des tâches.
Kit de développement logiciel .NET Framework 4.8.
Pour le débogage et le développement, vous aurez besoin de toutes les charges de travail pertinentes.
ASP.NET et développement web
Développement de bureau .NET
Développement multiplateforme .NET Core
Lien : https://visualstudio.microsoft.com/downloads/
Vous devez avoir sélectionné les charges de travail suivantes :
Vous devriez avoir les composants individuels suivants sélectionnés :
Installez Git pour Windows.
Lien : https://git-scm.com/downloads
Installez le dernier nœud LTS :
Lien : https://nodejs.org/
Cloner le dépôt git : git clone https://github.com/immense/Remotely --recurse
Lors du débogage, l'agent utilisera un ID de périphérique prédéfini et se connectera à https://localhost:5001.
Dans un environnement de développement, le serveur attribuera tous les agents de connexion à la première organisation.
Les deux ci-dessus vous permettent de déboguer l'agent et le serveur ensemble et de voir votre appareil dans la liste.
Le premier compte créé sera un administrateur à la fois du serveur et de l'organisation créée pour le compte.
Un administrateur d'organisation a accès à la page Organisation et aux entrées du journal du serveur spécifiques à son organisation. Un administrateur de serveur a accès à la page de configuration du serveur et peut voir les entrées du journal du serveur qui n'appartiennent pas à une organisation.
Dans la section Compte, il y a un onglet pour la marque, qui s'appliquera aux clients d'assistance rapide et au programme d'installation de Windows.
Cependant, les clients devront avoir été créés à partir des sources avec l'URL du serveur codée en dur dans les applications pour pouvoir récupérer les informations de marque.
Le fournisseur de base de données, les chaînes de connexion et le port ASP.NET Core sont configurables via des variables d'environnement dans docker-compose.yml
.
Toutes les autres configurations sont effectuées sur la page Server Config une fois que vous êtes connecté.
AllowApiLogin : s'il faut autoriser la connexion via le contrôleur API. Les jetons d'accès à l'API sont recommandés pour cette approche.
BannedDevices : un tableau d’identifiants, de noms ou d’adresses IP d’appareils à interdire. Lorsqu'ils essaient de se connecter, une commande de désinstallation sera immédiatement renvoyée.
DataRetentionInDays : durée pendant laquelle les journaux et autres données seront conservés sur le serveur. Réglez sur -1 pour conserver indéfiniment (non recommandé).
DBProvider : détermine laquelle des trois chaînes de connexion (en haut) sera utilisée. Le fournisseur de base de données approprié pour le type de base de données est automatiquement chargé dans le code.
EnableWindowsEventLog : s'il faut également ajouter des entrées du journal du serveur au journal des événements Windows.
EnforceAttendedAccess : les clients seront invités à autoriser les tentatives de contrôle à distance sans surveillance.
EnableRemoteControlRecording : s'il faut sauvegarder les enregistrements des sessions de contrôle à distance sur le serveur.
Ils seront enregistrés dans /app/AppData/recordings
.
Leur conservation est régie par DataRetentionInDays
.
ForceClientHTTPS : force les installateurs et les clients de bureau à utiliser le schéma HTTPS, même si les en-têtes transférés sont mal configurés.
KnownProxies : si votre proxy inverse se trouve sur une autre machine et transmet les requêtes au serveur Remotely, vous devrez ajouter l'adresse IP du serveur proxy inverse à ce tableau.
MaxOrganizationCount : par défaut, une organisation peut exister sur le serveur, qui est créée automatiquement lors de l'enregistrement du premier compte. Par la suite, l’auto-inscription sera désactivée.
Définissez-le sur -1 ou augmentez-le jusqu'à un nombre spécifique pour autoriser la multilocation.
RedirectToHttps : indique si ASP.NET Core redirigera tout le trafic de HTTP vers HTTPS. Ceci est indépendant des configurations Caddy, Nginx et IIS qui font de même.
RemoteControlNotifyUsers : s'il faut afficher une notification à l'utilisateur final lorsqu'une session de contrôle à distance sans surveillance démarre.
RemoteControlRequiresAuthentication : indique si la page de contrôle à distance nécessite une authentification pour établir une connexion.
Require2FA : obliger les utilisateurs à configurer 2FA avant de pouvoir utiliser l'application principale.
Smpt- : paramètres SMTP pour les e-mails système générés automatiquement (tels que l'enregistrement et la réinitialisation du mot de passe).
Thème : Le thème de couleur à utiliser pour le site. Les valeurs sont « Clair » ou « Foncé ». Cela peut également être configuré par utilisateur dans Compte - Options.
TrustedCorsOrigins : pour les requêtes API multi-origines via JavaScript. Les sites Web répertoriés dans ce tableau seront autorisés à adresser des requêtes à l'API. Cela n'accorde pas l'authentification, qui est toujours requise sur la plupart des points de terminaison.
UseHsts : indique si ASP.NET Core utilisera HTTP Strict Transport Security.
UseHttpLogging : active la journalisation de toutes les requêtes HTTP. Permet également des entrées de journal supplémentaires dans ClientDownloadsController
concernant le schéma effectif, l'hôte et l'adresse IP distante suite au traitement des en-têtes transférés.
Vous devez définir explicitement un niveau de journalisation pour Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware
pour que cela fonctionne. Voir appsettings.json pour un exemple.
Par défaut, Remotely utilise une base de données SQLite. Lors de la première exécution, il crée un fichier comme spécifié pour la chaîne de connexion SQLite dans appsettings.json.
Vous pouvez modifier la base de données en modifiant DBProvider
dans ApplicationOptions
en SQLServer
ou PostgreSQL
.
Sur les clients, les journaux sont conservés dans %ProgramData%RemotelyLogs
Dans le conteneur du serveur, les journaux seront écrits dans /app/AppData/logs
, qui (par défaut) sera monté sur /var/www/remotely/Logs
sur l'hôte.
Les journaux ASP.NET Core intégrés sont écrits sur la console (stdout). Vous pouvez le rediriger vers un fichier si vous le souhaitez.
Dans IIS, cela peut être fait dans le fichier web.config en définissant stdoutLogEnabled sur true.
Sur les serveurs Windows, les journaux ci-dessus peuvent également être écrits dans le journal des événements Windows.
Ceci est activé dans Server Config en définissant EnableWindowsEventLog sur true.
Vous pouvez configurer les niveaux de journalisation et d'autres paramètres dans appsetttings.json.
Plus d'informations : https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/
Windows : Seule la dernière version de Windows 11 est testée. Windows 7 et 8.1 devraient fonctionner, même si les performances seront réduites sous Windows 7.
Windows 2019/2022 devrait également fonctionner, mais n'est pas testé régulièrement.
Linux : Seule la dernière version LTS d'Ubuntu est testée.
Pour le client « support rapide » d'Ubuntu, vous devez d'abord installer les dépendances suivantes :
libc6-dev
libxtst-dev
xclip
libx11-dev
libxrandr-dev
Idéalement, vous effectueriez le contrôle à distance à partir d’un véritable ordinateur ou ordinateur portable. Cependant, j'ai essayé de rendre la télécommande au moins quelque peu utilisable à partir d'un appareil mobile. Voici les contrôles :
Clic gauche : appui simple
Clic droit : appuyez longuement, puis relâchez
Cliquez et faites glisser : appuyez longuement, puis faites glisser
Il existe une page sur /get-support
où les utilisateurs finaux peuvent demander de l'aide. Lorsque le formulaire est soumis, une alerte apparaît sur la page principale, au-dessus de la grille.
Un raccourci vers cette page est placé dans le dossier Program FilesRemotely
. Vous pouvez le copier où vous le souhaitez. Vous pouvez également le copier automatiquement sur le bureau en utilisant le commutateur -supportshortcut
du programme d'installation.
.NET dispose de deux méthodes de déploiement : dépendant du framework et autonome.
Les déploiements dépendants du framework nécessitent que le runtime .NET soit installé sur les ordinateurs cibles. Il doit s'agir de la même version que celle utilisée pour créer l'application.
Les déploiements autonomes incluent une copie du runtime, vous n'avez donc pas besoin de l'installer sur les ordinateurs cibles. En conséquence, la taille totale du fichier est beaucoup plus grande.
.NET utilise des identifiants d'exécution ciblés lors de la création.
Lien : https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
Quelques touches de raccourci sont disponibles lors de l'utilisation de la console.
/ : Slash vous permettra de basculer entre les shells. Les noms sont configurables dans la page Options.
Haut/Bas : utilisez la flèche haut/bas pour parcourir l'historique des entrées.
Ctrl + Q : Effacez la fenêtre de sortie.
Le port hôte (côté gauche) peut être configuré dans docker-compose.yml
. Le port du conteneur (côté droit) ne doit pas être modifié. Consultez la documentation de composition pour plus de détails.
Remotely dispose d'une API de base, qui peut être consultée sur https://{your_server_url}/swagger
. La plupart des points de terminaison nécessitent une authentification via un jeton d'accès API, qui peut être créé en accédant à Compte - Accès API.
Lorsque vous accédez à l'API à partir du navigateur sur un autre site Web, vous devrez configurer CORS dans les paramètres d'application en ajoutant l'URL d'origine du site Web au tableau TrustedCorsOrigins. Si vous n'êtes pas familier avec le fonctionnement de CORS, je vous recommande de le lire avant de continuer. Par exemple, si je voulais créer un formulaire de connexion sur https://exmaple.com connecté à l'API Remotely, je devrais ajouter "https://example.com" à TrustedCorsOrigins.
Chaque requête adressée à l'API doit avoir un en-tête nommé "X-Api-Key". La valeur doit être l'ID et le secret de la clé API, séparés par deux points (c'est-à-dire [ApiKey]:[ApiSecret]).
Vous trouverez ci-dessous un exemple de requête 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
Vous trouverez ci-dessous des exemples d'utilisation de l'API de connexion basée sur les cookies (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); }) } })
L'API Alerts vous donne la possibilité d'ajouter des fonctionnalités de surveillance et d'alerte aux points de terminaison de votre appareil. Cette fonctionnalité est destinée à ajouter des fonctionnalités de base de type RMM sans trop s'éloigner de l'objectif principal de Remotely.
Des alertes peuvent être configurées pour afficher une notification sur le site Web Remotely, envoyer un e-mail et/ou effectuer une demande API distincte.
Pour utiliser les alertes, vous devez d'abord créer un jeton API (ou plusieurs jetons) que vos appareils pourront utiliser. Créez ensuite une tâche planifiée ou un autre script récurrent pour effectuer le travail. Vous trouverez ci-dessous un exemple d'utilisation de PowerShell pour créer une tâche planifiée qui vérifie l'espace disque selon une planification quotidienne.
$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