[.NET] Se connecter en remote shell sur Windows Serveur avec WinRM et .NET

Windows Remote Management permet d’ouvrir à distance un shell sur Windows Server 2008 (WinRM existe depuis Windows Vista et Windows Server 2003 R2). Concrétement, il est possible d’exécuter des lignes de commandes sur un serveur à distance.

 

Pour des raisons évidentes de sécurité, certains pré-requis sont nécessaires. Si l’ordinateur client n’est pas sur le même domaine que le serveur, ou si l’authentification ne se fait pas par Kerberos alors les transmissions doivent être chiffrées. Concernant la ligne de commande, les droits sont respéctés. Un utilisateur qui ne présente pas les droits suffisants pour exécuter une commande sur le serveur se verra refuser l’exécution de la dite commande à distance.

 

Petite limitation, un utilisateur ne peut pas ouvrir plus de 5 "runspaces" à la fois.

Par défaut, sur Windows Serveur 2008 R2, WinRM n’est pas activée. Pour l’activer, ouvrez une invite de commande en tant qu’administrateur
et tapez la ligne suivante :

 

winrm quickconfig

 
C:\Windows\system32>winrm quickconfig
WinRM already is set up to receive requests on this machine.
WinRM already is set up for remote management on this machine.

 

Le serveur est maintenant prêt pour recevoir les requêtes des clients. Dans cet article, pour simplifier le processus, l’ordinateur client fait partie du même domaine que le serveur afin d’éviter le cryptage des transmissions.

 

Pour tester le code ci-dessous, les pré-requis sont :
– un windows serveur 2008 avec un domaine Active Directory
– un client sous windows
– un compte administrateur sur le domaine

 

Comme énoncé précédemment, pour éxécuter certaines commandes il faut être connecté avec un utilisateur ayant des droits spéciaux. Si vous êtes connecté à votre ordinteur client avec ce type d’utilisateur, il ne sera pas necessaire de passer à la connexion des informations d’authentification (login/mot de passe). En revanche, si vous êtes connecté avec un utilisateur basique, il faudra les spécifier au constructeur de la connexion.

 

L’utilisation de Windows Remote Shell en .NET se repose sur l’espace de noms System.Management.Automation.Runspaces. Pour ajouter ce namespace, ouvrez le fichier .csproj de votre projet avec un éditeur de texte (par exemple Notepad++) et cherchez le bloc de lignes contenant les références.

Par exemple :

 

<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />

 

Ajoutez en dessous la ligne :

 

<Reference Include="System.Management.Automation" />

 

Il est maintenant possible d’importer le namespace dans le fichier .cs :

 

using System.Management.Automation.Runspaces;

 

Tout est maintenant prêt pour commencer à développer.

La 1re étape consiste à construire un objet PSCredential pour nous identifier sur le serveur. Si cette étape est omise, le compte utilisateur qui exécute l’application sera utilisé. Le constructeur de PSCredential prend en paramètres une chaine de caractères représentant le nom d’utilisateur et un objet de type System.Security.SecureString qui stocke le mot de passe :

 

SecureString pwd = new SecureString();

foreach (char c in "P@ssw0rd".ToCharArray())
{
    pwd.AppendChar(c);
}

PSCredential cred = new PSCredential("Aymeric", pwd);

 

La 2ème étape établit la connexion vers le serveur. WSMANConnectionInfo prend en paramètre un booléen pour l’utilisation ou non du SSL, le nom du serveur, le port (5985 par défaut ou 5986 pour le SSL), le nom de l’application, un schéma et enfin les paramètres d’identification créés auparavant (null si l’on souhaite utiliser le compte actuellement connecté au poste client).

 

WSManConnectionInfo rri = 
    new WSManConnectionInfo(false,
        "serveur.aymeric.lan",
        5985,
        "/wsman",
        "http://schemas.microsoft.com/powershell/Microsoft.PowerShell",
        cred);

 

Une fois la connexion créée, on peut construire un RunSpace qui nous permettra d’exécuter les commandes à distance :

 

Runspace myRunSpace = RunspaceFactory.CreateRunspace(rri);
myRunSpace.Open();

 

Pour terminer, la classe Pipeline permet d’envoyer des commandes au serveur. Dans l’exemple ci-dessous, la commande ipconfig est envoyée au serveur. Le résultat de la commande est affiché dans la console du client :

 

Pipeline p = myRunSpace.CreatePipeline("ipconfig");

foreach (PSObject i in p.Invoke())
{
    Console.WriteLine(i.ToString());
}

 

Le projet utilisé dans l’article est disponible ici.

[W2K8] Installer un serveur IIS 7.5 sous Windows Server 2008 R2

il est bien de savoir développer en .NET, mais quelques notions d’administration de serveur web peuvent servir. Voici donc le premier article d’une série qui traitera de l’installation d’un serveur IIS, installation de SQL Server, etc… Les informations que vous trouverez dans ces articles ont surement déjà été publiées ailleurs sur le web ou sur les documentations officielles de Microsoft, mais mon but est ici d’apprendre.

Cette série d’articles se base sur un Windows Server 2008 R2 Datacenter, il se peut donc que certaines petites choses diffèrent si vous utilisez une version Web, Standard ou Enterprise.

Commençons donc cet article par l’installation du serveur IIS 7.5 en lui même. La démonstration faite ci-dessous part d’un Windows Server 2008 R2 Datacenter fraichement installé, avec pour simple modification l’activation des mises à jour automatiques via Windows Update.

– Accéder au Server Manager (ServerManager.msc)

 

ServerManager

 

– Cliquer sur "Add Roles"

– Cocher la case "Web Server (IIS)"

 

install1

 

– A l’étape 4 (Role Services), il est proposé de personnaliser l’installation de IIS 7.5 en ajoutant ou retirant des fonctionnalités, par exemple installation du framework .NET, d’un FTP, etc…

Voici les catégories proposées (attention ici la démonstration est faite sur un Windows Server 2008 R2 Datacenter, certains services ne seront donc pas disponibles sur les versions web, enterprise, etc…)

 

Common HTTP Features

  • Static Content permet au serveur web d’afficher des pages HTML simples (installé de base).
  • Default Document autorise la configuration du fichier appelé par défaut lorsque l’on ne précise que l’url du site. par exemple https://www.aymericlagier.com (installé de base).
  • Directory Browsing liste les dossiers situés sur le serveur web si l’utilisateur n’a pas précisé de fichier précis (installé de base).
  • HTTP Errors configure des pages d’erreurs personnalisées (erreurs 404, 401, etc…) (installé de base).
  • HTTP Redirection permet comme son nom l’indique la redirection des utilisateurs (changement de nom de domaine, SSL obligatoire, etc…).
  • WebDav Publishing (Web Distributed Authoring and Versioning) autorise la publication de fichiers via le protocole HTTP.
  •  

Application Developpement

  • ASP.NET est le module nécessaire pour utiliser des pages en ASP.NET.
  • .NET Extensibility autorise les développeurs à étendre les fonctionnalités du serveur web afin de proposer de nouveaux services.
  • ASP (Active Server Page) permet l’utilisation de pages en ASP (attention l’ASP n’est pas de l’ASP.NET).
  • CGI (Common Gateway Interface) accepte l’utilisation de scripts CGI pour passer des informations à un programme externe.
  • ISAPI Extensions (Internet Server Application Programming Interface) est le module permettant d’utiliser les extensions ISAPI. L’avantage de ces extensions est leur rapidité, au détriment de leur intégrité.
  • ISAPI Filters permet l’utilisation des filtres ISAPI afin d’étendre ou changer les fonctionnalités proposées par IIS.
  • Server-Side Includes est un langage de scripting facilitant l’insertion de scripts sur plusieurs pages d’un site web automatiquement.
  •  

Health and Diagnostics

  • HTTP Logging permet de logguer certaines informations concernant les événements (transactions HTTP) qui se déroulent sur le serveur (installé de base).
  • Logging Tools est le service autorisant la gestion et l’automatisation des logs sur le serveur web.
  • Request Monitor est un outils utilisé pour analyser les requêtes HTTP (installé de base).
  • Tracing permet de débugger des applications web.
  • Custom Logging est utile pour créer son propre module de log.
  • ODBC Logging supporte le logging entre le serveur web et une base de données compatible avec ODBC.
  •  

Security Features

  • Basic Authentication offre une méthode d’authentification utilisant un algorithme de cryptage faible.
  • Windows Authentication permet l’authentification via un compte Windows (utile pour les intranets).
  • Digest Authentication est un système d’authentification utilisant les hashs.
  • Client Certificate Mapping Authentication permet d’utiliser des certificats pour authentifier les utilisateurs (fournis par Active Directory).
  • IIS Client Certificate Mapping Authentication permet d’utiliser des certificats pour authentifier les utilisateurs (fournis par IIS).
  • URL Authorization ajoute des règles pour autoriser ou refuser certains contenus à un utilisateur ou un groupe.
  • Request Filtering filtre les requêtes envoyées au serveur pour déceler des attaques connues (installé de base).
  • IP Security permet d’autoriser ou interdire du contenu venant d’une source précise.
  •  

Performance

  • Static Content Compression compresse le contenu statique pour préserver la bande passante (installé de base).
  • Dynamic Content Compression compresse le contenu dynamique pour préserver la bande passante (installé de base).
  •  

Management tools

  • IIS Management Console permet de gérer le serveur IIS (iismgr dans Start -> Run). Ci-dessous un aperçu de cette console (installé de base).
  •  

iismgr

  •  
  • IIS Management Scripts and Tools permet de gérer IIS via des scripts.
  • Management Service autorise la gestion de IIS à distance
  • IIS 6.0 Management Compatibility permet de gérer IIS 7.5 avec des scripts IIS 6.0.
  • IIS Metabase Compatibility permet d’utiliser des scripts écrits pour des anciennes versions de IIS afin de gérer la metabase.
  • IIS 6 WMI Compatibility propose des outils de scripting pour gérer et automatiser les tâches pour IIS 7.5.
  • IIS 6 Scripting Tools permet d’utiliser les scripts de IIS 6.0 pour gérer IIS 7.5.
  • IIS 6 Management Console autorise la gestion à distance de serveur IIS 6.0.
  •  

FTP Server

  • FTP Server installe un serveur FTP sur le serveur.
  • FTP Service permet au FTP de publier des fichiers sur le serveur web.
  • FTP Extensibility active le support des providers personnalisés et des utilisateurs ASP.NET.
  •  

IIS Hostable Web Core est un système permettant d’embarquer directement les services IIS dans une application tierce.

 

install2

 

Pour installer .NET, il vous sera demandé d’installer d’autres modules. Acceptez simplement la proposition.

 

install3

 

– Une fois le serveur web installé, il est accessible sur http://locahost. Par défaut la racine du site se trouve dans C:\inetpub\wwwroot\. Essayer par exemple de créer une page HTML nommée test.html et de la placer dans ce répertoire. Elle sera accessible via l’adresse http://locahost/test.html.

 

install4