Blog de Florent Appointaire

Blog sur les technologies Microsoft (Windows Server, System Center, Azure, Windows Azure Pack/Azure Stack, etc;)
    • 27/11/2015

    [Azure] Active Directory Domain Services

    azure-active-directory

    Une nouveauté de Azure est la possibilité de pouvoir utiliser Azure Active Directory comme Domain Services. C’est à dire, que vos Domain Controller seront hébergés et gérés directement par Microsoft.

    Azure AD DS est encore en Preview et est disponible (à l’heure de l’écriture de ce poste) dans une grosse partie des régions:  https://azure.microsoft.com/en-us/regions/

    J’ai utilisé le domaine onmicrosoft.com mais vous pouvez utiliser un domaine personalisé, et vérifé. J’ai créé un groupe nommé AAD DC Administrators (le nom est très important) pour les administrateurs du domaine et ajouté des utilisateurs dedans. Maintenant, pour créer votre Azure AD, allez dans Configure > Domain Services et cliquez sur Yes. Choisissez votre nom de domaine pour votre AD ainsi que le réseau auquel les AD vont se connecter (Azure en créait 2):

    SNAGHTML4f95052

    Après une trentaine de minute, vous pourrez apercevoir une première IP, la suivante arrivera un peu plus tard:

    SNAGHTML843b0c2

    Récupérez les et allez dans votre réseau virtuel,  Configure. Ici, renseignez vos 2 IPs adresses, qui serviront de DNS:

    SNAGHTML845efb6

    Si vous souhaitez administrer ceci en GUI, c’est tout à fait possible. Déployez une VM qui sera jointe au domaine Azure et installez les features Group Policy Management ainsi que AD DS Tools.

    En lançant la console Active Directory Domain Services, vous pouvez vous apercevoir que vous pouvez gérer (avec des limitations) les ordinateurs et les groupes/utilisateurs (impossible de créer des objets ici, vous devez passer par la console Azure):

    SNAGHTML84d055fSNAGHTML84d20b7

    Si vous lancez la console Group Policy Management, vous pourrez créez, supprimer, modifier les GPO de votre domaine.

    Cette nouveauté est quand même très utile dans le cas d’une nouvelle entreprise qui n’aurait pas les moyens de se payer des serveurs au début, et tout ce que ça entraine, sans pour autant ne pas avoir d’Active Directory, pour Office 365 par exemple. Concernant les tarifs, vous devez compter dans les 32€/mois pour moins de 5000 objets (Comptes, Groupes & Ordinateurs): https://azure.microsoft.com/en-us/pricing/details/active-directory-ds/

    • 22/11/2015

    [SCOM 2016 TP4] Superviser un Nano Server

    Microsoft a rendu disponible la dernière version du Nano Server, la Technical Preview 4. Cette TP4 a également été rendu disponible pour System Center et donc, SCOM. Dans cette dernière version de SCOM, il y a maintenant la possibilité de superviser un Nano Server.

    Je vais donc vous expliquer comment mettre en place cette solution de supervision, en m’aidant de ce poste.

    En utilisant ce nouvel agent, vous aurez la possibilité de superviser uniquement la partie Failover Cluster ainsi que le Windows Server. Le reste ne fonctionne pas encore et arrivera surement dans les prochaines versions.

    Le seul paquet indispensable pour pouvoir faire tourner l’agent sur un Nano Server est Microsoft-OneCore-ReverseForwarders-Package.cab.

    Une fois que le Nano Server fonctionne, il vous faut copier les sources de cet agent (qui se trouvent à la racine de l’ISO SCOM TP4), sur un serveur, dans mon cas, C:\Temp\NanoAgent\. Ouvrez ensuite une console PowerShell et déplacez vous dans le fichier où se trouve les sources, jusqu’au script InstallNanoServerScomAgentOnline.ps1:

    image45

    Pour installer l’agent, vous devez maintenant utiliser la commande suivante:

    .\InstallNanoServerScomAgentOnline.ps1 -ManagementServer <<Management Server Name FQDN>> -ManagementGroupName <<Management Group Name>> -NanoServerFQDN <<Nano server FQDN on which the agent will be installed>> -BinaryFolder <<Nano Server bits location (\NanoAgent\NanoServer)>>

    Ce qui pour moi, donne ceci:

    .\InstallNanoServerScomAgentOnline.ps1 -ManagementServer DEVO-OM02.devoteam.lab -ManagementGroupName DEVOTP4 -NanoServerFQDN NANOIIS01.devoteam.lab -BinaryFolder C:\Temp\NanoAgent

    image46

    Maintenant, connectez vous au Nano Server:

    Enter-PSSession -ComputerName nanoiis01.devoteam.lab

    image47

    L’agent SCOM est normalement arrêté:

    Get-Service –Name HealthService

    image48

    Pour le démarrer, utilisez les commandes suivantes:

    Start-Service –Name HealthService

    Get-Service –Name HealthService

    image49

    Maintenant que le service est démarré, il faut l’accepter dans SCOM (sauf si vous approuvez automatiquement les agents qui essayent de se connecter). Aller dans Administration > Device Management > Pending Management:

    image50

    Une fois accepté, après quelques minutes, on peut voir que le status du serveur est “UP”:

    image52image53

    Si j’éteins le Nano Server, les alertes remontent:

    image54

    Bon courage Sourire

    • 6/11/2015

    [SCVMM 2016 TP3] Convertir un standard switch en logical switch

    scvmm_logo

    Pendant la migration de mon lab vers Windows Server 2016 TP3 et System Center 2016 TP3, j’ai découvert une nouvelle fonctionnalité dans SCVMM qui permet de convertir un standard switch en logical switch. Cette feature est très intéressante parce que si vous souhaitez faire ceci de façon manuelle, vous devez changer le switch utiliser par chaque VM manuellement, etc.

    La première étape est d’avoir vos logical network prêt:

    image34 (1)

    Récupérez ensuite le nom et la bande passante de votre standard switch. Vous devez utiliser le même nom pour votre logical switch ainsi que le même minimum pour la bande passante:

    image35

    Nous pouvons maintenant créer le nouveau logical switch, qui sera utilisé pour la conversion. Donnez le nom même nom que le standard switch et choisissez si ce sera un teaming ou non:

    image36

    Choisissez ensuite la bande passante que vous avez récupéré sur le standard switch:

    image37

    Dans la partie Extensions, vous pouvez garder les valeurs par défaut. Dans la partie Virtual Port, vous pouvez adapter ou garder par défaut:

    image38

    Pour la partie Uplinks, vous pouvez créer un nouvel uplink ou en utiliser un existant. Je vais en créer un nouveau dans mon cas. Une nouveauté aussi est la possibilité de pouvoir pré-créer les network adapter virtuels:

    image39

    Validez la création du logical switch:

    image40

    Quand la création est terminée, allez dans la configuration de votre Hyper-V. Dans la partie Hardware, vérifiez que tous les réseaux qui sont dans le logical switch sont cochés:

    image41

    Validez et revenez sur votre Hyper-V. Dans la partie Virtual Switches, vous pouvez maintenant sélectionner Convert to Logical Switch:

    image42

    Une nouvelle fenêtre s’ouvre pour vous demander le logical switch qui va être utilisé, ainsi que sont uplink:

    image43

    Après quelques secondes, votre standard switch est converti en logical switch:

    image44

    Vous devez donc répéter cette option sur tous les switches de tous vos Hyper-V qui se trouvent sur le même cluster Sourire

    • 3/11/2015

    [Azure] Récupérer les logs d’un site web

    microsift-azure

    La semaine dernière, j’ai essayé de déployer un site web sur la plateforme Azure Websites. Le déploiement c’est bien déroulé, mais quand je suis arrivé sur la page web, je me suis retrouvé avec l’erreur suivante:

    image26

    Pour trouver où se situe le problème, j’ai besoin de récupérer les logs du serveur IIS. Grace à cet article MSDN, j’ai pu trouver comment récupérer les logs via FTP. Je vais vous expliquer comment faire ceci.

    Pour commencer, connectez-vous sur https://portal.azure.com et naviguez dans votre application web:

    SNAGHTML1e8214ad

    Allez dans Deployment credentials et choisissez un nom d’utilisateur unique. Cliquez sur Save:

    image27

    Maintenant, déplacez vous dans la partie Diagnostics logs. Dans cette partie, vous avez les informations pour connecter votre client FTP à ce site. Vous pouvez également choisir les logs que vous souhaitez activer/désactiver:

    image28

    Ouvrez votre client FTP (Filezilla pour moi) et fournissez les informations que vous avez récupéré précédemment. N’oubliez pas de renseigner le nom du site devant votre utilisateur:

    image29

    Une fois connecté, vous avez accès à ces 3 dossiers:

    image30

    Si vous allez dans le dossier site > root, vous verrez votre déploiement IIS:

    image31

    Comme je recherche les logs, je me déplace dans le dossier LogFiles à la racine du site. Ici se trouve un fichier eventlog.xml. Ce fichier contient les logs extraient du journal d’évènement du server où est exécuté le site web. Ouvrez-le:

    image32 

    J’ai parcouru chaque balise <data> jusqu’à trouver l’évènement suivant:

    <Event><System><Provider Name=”ASP.NET 4.0.30319.0″/><EventID>1310</EventID><Level>2</Level><Task>0</Task><Keywords>Keywords</Keywords><TimeCreated SystemTime=”2015-10-30T11:31:22Z”/><EventRecordID>200681015</EventRecordID><Channel>Application</Channel><Computer>RD000D3A22D7A5</Computer><Security/></System><EventData><Data>3007</Data><Data>A compilation error has occurred.</Data><Data>10/30/2015 11:31:22 AM</Data><Data>10/30/2015 11:31:22 AM</Data><Data>8f0c8ce90d1e452dbe8957048d3c26f8</Data><Data>8</Data><Data>1</Data><Data>0</Data><Data>/LM/W3SVC/367992338/ROOT-3-130906782805054017</Data><Data>Full</Data><Data>/</Data><Data>D:\home\site\wwwroot\</Data><Data>RD000D3A22D7A5</Data><Data></Data><Data>7728</Data><Data>w3wp.exe</Data><Data>IIS APPPOOL\scugbe</Data><Data>HttpCompileException</Data><Data>(0): error CS1617: Invalid option ‘6’ for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default

    at System.Web.Compilation.AssemblyBuilder.Compile()
    at System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
    at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
    at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
    at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate)
    at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound)
    at System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp)
    at System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)
    at System.Web.UI.PageHandlerFactory.GetHandler(HttpContext context, String requestType, String virtualPath, String path)
    at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)

    </Data>

    Le problème ici est clairement mon paramètre /langversion dans mon fichier Web.config. Il a une valeur de 6, qui n’est pas valide avec ce type de déploiement.

    Le paramètre doit clairement avoir une des valeurs suivantes : ISO-1, ISO-2, 3, 4, 5 or Default. J’ai donc modifié dans mon Web.config la valeur à 5 et j’ai redéployé mon site web. Après avoir rafraichi la page, je n’ai plus eu d’erreur:

    image33

    Cette fonctionnalité est très utile pour débugger un programme ou une application web Sourire

    • 2/11/2015

    [Azure] Exécuter un runbook Azure Automation depuis un site web ASP.NET

    image_thumb_73620556

    Après mon premier article sur comment exécuter un script PowerShell depuis un site web ASP.NET, je vais vous expliquer comment exécuter un runbook qui se trouve sur Azure Automation au travers d’un site web ASP.NET, stocké sur une WebApp Azure.

    Pour implémenter ceci, j’ai utilisé la fonctionnalité WebHook de Azure Automation. J’ai utilisé cet article pour comprendre son fonctionnement.

    Dans mon exemple, le site web donnera la possibilité à un employé de démarrer/arrêter une VM Azure. Suivez au début cet article pour avoir le runbook Connect-AzureSubscription.ps1 fonctionnel.

    Pour démarrer, créez 2 nouveaux runbooks dans Azure Automation. Je vais les appeler Start-AzureVM et Stop-AzureVM. Ils contiendront les scripts suivants:

    Start-AzureVM:

    param (
    [object]$WebhookData
    )

    if ($WebhookData -ne $null) {

    $azureVMName = $WebhookData.RequestBody

    .\Connect-AzureSubscription.ps1

    $azureVM = Get-AzureVM | Where-Object {$_.Name -eq $azureVMName}
    Start-AzureVM -Name $azureVM.Name -ServiceName $azureVM.ServiceName
    Write-Output “The VM $azureVMName is now started”

    } else {

    Write-Error “Runbook mean to be started only from webhook.”

    }

    Stop-AzureVM:

    param (
    [object]$WebhookData
    )

    if ($WebhookData -ne $null) {

    $azureVMName = $WebhookData.RequestBody

    .\Connect-AzureSubscription.ps1

    $azureVM = Get-AzureVM | Where-Object {$_.Name -eq $azureVMName}
    Stop-AzureVM -Name $azureVM.Name -ServiceName $azureVM.ServiceName -Force
    Write-Output “The VM $azureVMName is now stopped”

    } else {

    Write-Error “Runbook mean to be started only from webhook.”

    }

    Quand cette étape est terminée, allez dans le runbook Start-AzureVM et clicquez sur WebHook. Donnez un nom, choisissez si vous voulez l’activer ou non, choisissez une date d’expiration pour ce webhook et copier l’URL dans un endroit sécurisé. Ceci est très important, parce que après avoir cliqué sur OK, ce lien ne sera plus disponible:

    image

    Dans la partie Parameters, cliquez sur OK:

    image1

    Cliquez sur Create pour créer votre Webhook:

    image2

    Répétez cette manipulation pour le runbook Stop-AzureVM.

    Il est maintenant temps de créer la page web ASP.NET qui permettra de démarrer/arrêter la VM Azure. Dans Visual Studio, créez une nouvelle Web App ASP.NET avec un modèle vide. Quand la création est terminée, ajoutez une page de type Web Form, qui se nommera Default.aspx. Collez le code suivant:

    <%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”StartStop_AzureVM.Default” %>

    <!DOCTYPE html>

    <html xmlns=”http://www.w3.org/1999/xhtml”>
    <head runat=”server”>
    <title>Start/Stop an Azure VM</title>
    </head>
    <body>
    <form id=”form1″ runat=”server”>
    <div>
    <img src=”Sources/SCUGBE.png” alt=”SCUGBE”/>
    </div>
    <div>
    <table>
    <tr><td><h1>Start/Stop an Azure VM</h1></td></tr>
    <tr><td><h3>Provide the name of the VM that you want to start or stop</h3></td></tr>

    <tr>
    <td>
    <asp:TextBox ID=”ServerName” runat=”server” TextMode=”SingleLine”></asp:TextBox>
    <asp:Button ID=”Start_VM” runat=”server” Text=”Start VM” Width=”200″ OnClick=”StartVM_Click” />
    <asp:Button ID=”Stop_VM” runat=”server” Text=”Stop VM” Width=”200″ OnClick=”StopVM_Click” />
    </td>
    </tr>

    <tr>
    <td>
    <asp:Label ID=”ConfirmationMessage” runat=”server”></asp:Label>
    </td>
    </tr>
    </table>
    </div>
    </form>
    </body>
    </html>

    Cette page vous donnera 2 boutons avec un champ à remplir. Ajoutez les références suivantes dans votre projet pour exécuter le code:

    • System
    • System.Data
    • System.Drawing
    • System.Web
    • System.Xml

    image3

    Ouvrez le fichier Default.aspx.cs et collez le code suivant:

    using System;
    using System.IO;
    using System.Net;
    using System.Text;

    namespace StartStop_AzureVM
    {
    public partial class Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void StartVM_Click(object sender, EventArgs e)
    {
    StartStop(“https://s2events.azure-automation.net/webhooks?token=”);
    ConfirmationMessage.Text = “The VM ” + ServerName.Text + ” is starting. Wait few minutes before trying to connect to it.”;
    ServerName.Text = string.Empty;
    }

    protected void StopVM_Click(object sender, EventArgs e)
    {
    StartStop(“https://s2events.azure-automation.net/webhooks?token=”);
    ConfirmationMessage.Text = “The VM ” + ServerName.Text + ” is stopping.”;
    ServerName.Text = string.Empty;
    }

    private void StartStop(string webHookUri)
    {
    var http = (HttpWebRequest)WebRequest.Create(new Uri(webHookUri));
    http.Accept = “application/json”;
    http.ContentType = “application/json”;
    http.Method = “POST”;

    string parsedContent = ServerName.Text;
    ASCIIEncoding encoding = new ASCIIEncoding();
    Byte[] bytes = encoding.GetBytes(parsedContent);

    Stream newStream = http.GetRequestStream();
    newStream.Write(bytes, 0, bytes.Length);
    newStream.Close();

    var response = http.GetResponse();

    var stream = response.GetResponseStream();
    var sr = new StreamReader(stream);
    }
    }
    }

    Dans l’appel StartVM_click et StopVM_click, remplacez les valeurs que vous avez copié durant la création du webhook. Suivant sur quel bouton vous allez cliquer, vous allez appeler la fonction correspondante, avec la bonne URL du webhook, et donc vous contacterez le bon runbook.

    Ouvrez le fichier  Web.config pour modifier la cause de l’erreur sur Azure WebSite. Modifiez compilerOptions=”/langversion:6 by compilerOptions=”/langversion:5. Ceci correspond à la version de compilation du Framework:

    image4

    Vous pouvez compiler le projet. Vous devriez avoir ceci:

    image5

    Notre site web est maintenant prêt. Nous allons créer un nouveau site sur Azure, basé sur un plan gratuit. Sur https://portal.azure.com ouvrez Web Apps et cliquez sur Add. Choisissez un nom pour votre site et, sur App Server Platofrm, créez un nouvel App Service. J’utiliserai le prix gratuit:

    image6

    Je peux maintenant me rendre sur ma nouvelle URL:

    image7

    Il est temps de publier mon site web sur la Web App Azure, via Visual Studio. Dans Visual Studio, cliquez sur Build > Publish …:

    image8

    Choisissez Microsoft Azure Web Apps:

    image9

    Connectez vous avec votre utilisateur Azure où est la nouvelle Web App. Choisissez la Web App où déployer le site web. Comme je suis dans une version gratuite, je ne peux pas utiliser les slot de déploiement (prod/dev par exemple. Cette fonctionnalité est seulement disponible à partir du plan standard):

    image10

    Vous pouvez valider la connexion:

    image11image12image13

    Mon site est maintenant déployé sur la nouvelle Web App:

    image14

    Si j’essaie de démarrer une VM, je vais avoir ceci:

    image15

    Le tâche d’automatisation est directement démarrée:

    image16

    Si vous allez dans la partie Input, vous pourrez voir quel Runbook a été appelé ainsi que le paramètre qu’il a reçu:

    image17

    La tâche est terminée et la VM est en cours de démarrage:

    image18image19

    Et si j’arrête une VM:

    image20image21image22SNAGHTML1e52b50d

    Parce que le site est public, je vais activer l’authentification Azure. Sur la Web App, dans  Authentication / Authorization, choisissez ON et sélectionnez  une nouvelle application. Cliquez sur Save:

    SNAGHTMLf24e896

    Rendez-vous sur votre site web. Vous allez être redirigé vers une page d’authentification:

    image23

    Je vais me connecter avec un compte qui n’est pas dans le répertoire de Azure AD. J’ai le message d’erreur suivant:

    image24

    Je vais me déconnecter et me reconnecter avec un compte qui est dans l’Azure AD. La page web s’affiche correctement:

    image25