Blog de Florent Appointaire

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

    [PowerShell] Compresser et décompresser

    PowerShell logo

    Une nouveauté de PowerShell 5 est le fait de pouvoir compresser et décompresser des fichiers, en PowerShell. Sur mon Windows 10, PowerShell 5 est natif:

    image87

    Si vous tapez la commande Get-Module –ListAvailable, vous pourrez voir qu’un nouveau module a fait son apparition, Microsoft.PowerShell.Archive:

    image88

    Ce nouveau module contient 2 commandes, Compress-Archive et Expand-Archive:

    image89

    Nous allons donc tester ceci en compressant 1 fichier. Je vais utiliser la commande suivante pour compresser un fichier qui se trouve sur mon bureau:

    Compress-Archive -Path C:\Users\flore\Desktop\IP.bat -DestinationPath C:\Users\flore\Desktop\IP.zip -CompressionLevel Fastest

    image90

    Vous avez 3 niveaux de compression disponibles:

    • Fastest
    • NoCompression
    • Optimal

    Pour décompresser un fichier, utilisez la commande suivante:

    Expand-Archive -Path C:\Users\flore\Desktop\IP.zip -DestinationPath C:\Users\flore\Downloads\

    image92

    Vous pouvez utiliser le paramètre –Force pour écraser les fichiers.

    Si vous voulez compresser plusieurs fichiers, il vous suffit de récupérer le contenu de ce dossier et de le comprésser:

    Get-ChildItem -Path C:\Users\flore\Downloads\WS | Compress-Archive -DestinationPath C:\Users\flore\Downloads\WS.zip -CompressionLevel Optimal

    image93

    • 28/10/2015

    [Azure]Implémenter un Hybrid Worker avec Azure Automation

    AzureAutomation

    Avec Azure Automation, il est possible d’exécuter des scripts dans votre Datacenter, directement depuis Azure. Dans cet article, je vais vous expliquer comment mettre en place cette solution, en exécutant un script qui va vérifier l’état d’un service OMS sur une serveur spécifique et le redémarrer si il est arrêté.

    Le principe d’un runbook Hybrid Worker est d’installer un agent directement sur une machine qui est dans votre Datacenter et d’envoyer les actions depuis Azure sur votre machine.

    La première étape pour faire ceci est de créer un compte Operations Management Suite (OMS). Connectez-vous sur https://www.microsoft.com/oms et créez un nouveau Workspace. Donnez un nom, choisissez une région et donnez une adresse email:

    image74

    Si vous avez plusieurs suscriptions liées à votre compte, choisissez la suscription où vous voulez lier votre workspace OMS:

    image310

    Maintenant que OMS est disponible, allez dans Solutions Gallery et choisissez Automation:

    image610

    Cliquez dessus et choisissez Add pour ajouter un compte d’automatisation sur l’interface OMS:

    image91

    Le plugin est maintenant disponible:

    image121

    Cliquez dessus pour le configurer. Choisissez le compte d’automatisation de votre suscription que vous voulez lier à OMS:

    image151

    Après quelques secondes, vous verrez le nombre de runbook et le nombres de jobs du compte d’automatisation:

    image181

    Il faut maintenant installer l’agent OMS sur un serveur dans votre Datacenter (qui doit être connectez à Internet). J’ai choisi un serveur qui exécute SMA pour installer l’agent. Pour télécharger l’agent, dans OMS, cliquez sur Settings et choisissez le type d’agent que vous voulez télécharger. Pour votre information, comme vous avez lié le compte d’automation à ce workspace, l’agent est différent de l’agent initial, qui  supervise seulement votre infrastructure:

    SNAGHTML3fb9cdf

    Lancez l’installation de l’agent:

    image75image76image77

    Choisissez Connect the agent to Microsoft Azure Operational Insights:

    image78

    Renseignez votre workspace ID et la clé que vous avez sur l’interface OMS, dans la partie Settings, où vous avez téléchargé le plugin:

    SNAGHTML3fd9237image79

    L’installation est terminée:

    image80

    Sur le serveur où l’agent est installé, vous pouvez vérifier que la partie Azure Automation a bien été installée, en regardant dans le dossier C:\Program Files\Microsoft Monitoring Agent\Agent\AzureAutomation si le dossier existe:

    image81

    Retournez dans OMS pour vois si le serveur est bien connecté:

    image82

    Nous allons maintenant donnez la possibilité à notre compte d’automatisation de lancer l’Hybrid Runbook. Pour faire ceci, exécutez le script PowerShell suivant sur le serveur où l’agent OMS a été installé:

    cd “C:\Program Files\Microsoft Monitoring Agent\Agent\AzureAutomation\7.2.7037.0\HybridRegistration”
    Import-Module HybridRegistration.psd1

    Add-HybridRunbookWorker –Name SCUGBE -EndPoint “URL -Token “Primary Access Key” –Verbose

    SNAGHTML4008671

    Pour remplir le script PowerShell précédant, vous aurez besoin des informations suivantes:

    SNAGHTML40156154

    Maintenant, vous pouvez exécuter vos Runbook qui ont besoin d’avoir un accès On-Premise, directement depuis Azure Automation. Pour vous montrer comment ça fonctionne, j’ai créé un nouveau runbook nommé Get-HealthService-Status avec 2 Assets, 1 Variable avec des noms de serveurs, séparés pas une “,” et 1 Credential avec un login/mot de passe qui est administrateur local de chaque serveur:

    image83SNAGHTML40624db

    Ci-dessous le code que j’exécute dans mon Runbook Azure PowerShell:

    $Servers = Get-AutomationVariable “ComputerName”
    $Cred = Get-AutomationPSCredential -Name ‘LocalAdmin’

    $Servers = $Servers.split(“,”);

    foreach($Server in $Servers){

    $service = Get-WmiObject -Class Win32_Service -ComputerName $Server -Filter “Name=’HealthService'” -Credential $Cred
    if ($service.state -eq “Stopped”){

    $service.StartService()
    Write-Output “The service HealthService is now running on computer $Server”

    } else {

    Write-Output “The service HealthService is already running on computer $Server”

    }
    }

    image84

    Publiez le et cliquez sur Start. Choisissez d’exécuter le runbook avec un Hybrid Worker et choisissez le groupe:

    image85

    Cliquez sur OK pour lancer l’exécution. Quand le job est terminée, allez dans la partie Output pour voir le résultat:

    image86

    Vous pouvez voir que sur le premier serveur, le service OMS est démarré, alors que sur le second, il a été démarré. C’est très intéressant de pouvoir voir si un service critique est démarré ou non, par exemple, toutes les heures, sans avoir SCOM et le redémarrer en cas de problème. Vous pouvez personnaliser ce script en envoyant un email par exemple si un service a été redémarré Sourire

    • 27/10/2015

    [Azure] Créer votre premier Runbook PowerShell avec Azure Automation

    AzureAutomation

    Je vais aujourd’hui vous montrer comment créer un Runbook sur Azure Automation, avec PowerShell.

    Pour démarrer, j’ai une suscription Azure avec un Azure Active Directory lié:

    SNAGHTMLc2d20

    La première étape va être de créer un compte dans cet Azure AD pour exécuter le Runbook PowerShell sur Azure Automation. Ce compte est un utilisateur standard, mais il a les droits administrateur sur la suscription Azure, où le Runbook est exécuté:

    image60image61SNAGHTMLf7287image62

    Maintenant, déconnecter vous et connectez vous à Azure avec le nouvel utilisateur pour changer son mot de passe. Une fois terminé, naviguez avec votre compte, sur https://portal.azure.com et sélectionnez Automation Accounts:

    image63

    Cliquez sur Add et remplissez chaque champ:

    image64

    Quand le compte est créé, déplacez vous à l’intérieur et cliquez sur Assets. Cliquez ensuite sur Credentials > Add a credential pour ajouter un compte qui exécutera le runbook. Utilisez le nom d’utilisateur et le mot de passe du compte Azure AD que vous avez créé auparavant:

    image65

    Ajoutez ensuite des variables qui seront utilisées dans votre script PowerShell, dans mon cas, le nom des VMs:

    image66

    Créez également des planifications si vous voulez lancer automatiquement des runbooks:

    image67

    Quand vous avez terminé, retournez à la page d’accueil du compte et sélectionnez Runbooks:

    image68

    Créez un nouveau Runbook, avec le nom Connect-AzureSubscription et comme Runbook type, PowerShell. Ce runbook récupèrera les informations de connexion que l’on a créé plus tôt:

    image69

    Utilisez le script suivant, en adaptant le nom de la commande Get-AutomationPSCredential:

    $Cred = Get-AutomationPSCredential -Name ‘SCUGBECred’
    Add-AzureAccount -Credential $Cred

    Select-AzureSubscription -SubscriptionName “Free Trial”

    Cliquez sur Save puis sur Publish:

    image70

    Créez un nouveau runbook, et commez le Get-AzureVM. Collez le script suivant, en l’adaptant avec votre nom de variable:

    .\Connect-AzureSubscription.ps1
    $VMNames = Get-AutomationVariable -Name ‘VMName’
    $VMName = $VMNames.split(“,”);

    foreach($VM in $VMName){

    $serviceName = Get-AzureVM | Where {($_.Name -eq $VM)}
    $service = $serviceName.ServiceName
    $status = $serviceName.PowerState
    Write-Output “The VM $VM with service name $service is $status”

    }

    Sauvegardez. Vous pouvez essayer le script, via le Test pane:

    SNAGHTML6edc9d

    Comme vous pouvez le voir, le test est effectué sur les 2 VM que j’avais renseigné dans ma varibale VMName. Cliquez sur Publish pour publier le runbook pour qu’il puisse être utilisé. Vous pouvez également lié la planification créée précédemment:

    image71

    Après que l’heure de la tâche soit passée, votre script a dû s’exécuter. Allez dans Jobs pour voir si le job est terminé et vous pouvez cliquez sur Output pour avoir le résultat (si vous avez mis des logs ou autre):

    image72image73

    Cette nouvelle fonctionnalité est très intéressante dans le cas de VM de dev. Vous pouvez toutes les arrêter la nuit pour économiser de l’argent.

    • 22/10/2015

    [PowerShell] Exécuter du PowerShell au travers d’un site ASP.NET

    PowerShell logo

    Je vais aujourd’hui vous expliquer comment exécuter un script PowerShell au travers d’un site web, en ASP.NET, avec des paramètres. Dans l’exemple que je vais vous présenter, l’utilisateur aura la possibilité de démarrer une VM qui se trouve sur Azure.

    L’interface finale ressemblera à ceci:

    image29

    Un des prérequis est d’avoir le fichier publishsettings de Azure pour votre suscription. Ouvrez une fenêtre PowerShell et importez le module Azure. Exécutez les commandes suivantes:

    Add-AzureAccount
    Select-AzureSubscription –SubscriptionId d9703db7-XXXXXX-XXXX-X-XXXX-XXXX
    Get-AzurePublishSettingsFile

    SNAGHTML47712f

    Une page web va s’ouvrir et va télécharger le fichier. Nous allons maintenant créer notre code ASP.NET, avec Visual Studio 2015. Créez un nouveau projet dans Visual Studio et choisissez ASP.NET Web Application:

    image30

    Choisissez le Template Empty:

    image31

    Dans la solution, créez un dossier où le script PowerShell sera stocké. Ajoutez à ce dossier le fichier publishsettings que vous avez téléchargé précédemment. Créez un nouveau script PowerShell et ajoutez y le code suivant:

    Param(
    [String]
    $VMName
    )
    Import-Module Azure
    Import-AzurePublishSettingsFile “C:\inetpub\Start-AzureVM\Sources\BizSpark-10-22-2015-credentials.publishsettings”
    $azureVM = Get-AzureVM | Where-Object {$_.Name -eq $VMName}
    Start-AzureVM -Name $azureVM.Name -ServiceName $azureVM.ServiceName

    image32

    Ajoutez ces 2 fichiers à Visual Studio:

    image33

    Créez maintenant une vue Web Form:

    image34

    Collez le code suivant pour ajouter:

    • Une text box
    • Un boutton
    • Un label

    <%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”default.aspx.cs” Inherits=”Start_AzureVM._default” %>

    <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

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

    <tr>
    <td>
    <asp:TextBox ID=”ServerName” runat=”server” TextMode=”SingleLine”></asp:TextBox>
    <asp:Button ID=”ExecuteCode” runat=”server” Text=”Start VM” Width=”200″ OnClick=”ExecuteCode_Click” />
    </td>
    </tr>

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

    Ouvrez maintenant le fichier .cs et collez le code suivant pour:

    • Exécuter le script PowerShell avec le nom de la VM en paramètre
    • Ecrire un message de confirmation

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

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

    }

    protected void ExecuteCode_Click(object sender, EventArgs e)
    {
    var SCRIPT_PATH = @”C:\inetpub\Start-AzureVM\PSScript\Start-AzureVM.ps1″;
    Process _Proc = new Process();
    _Proc.StartInfo.FileName = “Powershell.exe”;
    _Proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    _Proc.StartInfo.Arguments = @”” + SCRIPT_PATH + ” ‘” + ServerName.Text + “‘ “;
    _Proc.Start();

    ConfirmationMessage.Text = “The VM ” + ServerName.Text + ” is starting. Wait few minutes before trying to connect to it.”;
    ServerName.Text = string.Empty;
    }
    }
    }

    Ouvrez le fichier Web.config et changez le paramètre langversion de 6 à 5:

    image35

    Nous pouvons publier notre site web. Je vais déployer une nouvelle VM sur Azure pour fournir l’interface à nos utilisateurs. Cette VM contiendra:

    • IIS
    • Azure PowerShell module
    • Web Deploy 3.5
    • .Net Framework

    Je vais ajouter 2 endpoints de plus sur ma VM pour le HTTP et le Web Deploy:

    image36

    Quand la création est terminée, vous pouvez déployer le module Azure PowerShell et le Web Deploy 3.5 avec le Web Platform Installer:

    image37

    N’oubliez pas d’installer le Framework qui correspond à votre projet, dans mon cas 4.5.2.
    Pour IIS, installez le Web Server avec la feature ASP.NET 4.5:

    image38

    Vérifiez bien que le port 8172 est ouvert dans le firewall local de la machine:

    image39

    Ouvrez la console IIS Manager sur le serveur IIS et allez dans IIS Manager Users. Ajoutez un compte Windows qui a les droits de se connecter au serveur via le web deploy:

    image40

    Dans les paramètres du Web Deploy, cochez la case pour autoriser les connexions à distances, appliquez et démarrez le service:

    image41

    Créez maintenant un nouveau site (Start-AzureVM par exemple). Choisissez ensuite un pool d’application qui a les droits d’exécuter les scripts PowerShell:

    image42image59

    Sur le nouveau site, sélectionnez IIS Manager Permissions et autorisez un nouvel utilisateur:

    image43

    Retournez dans visual studio et cliquez sur Build > Publish Start-AzureVM:

    image44

    Choisissez où vous souhaitez publier votre site web:

    image45

    Choisissez la VM sur lequel le site web va être poussé:

    image46

    Fournissez les informations suivantes:

    • Le nom du serveur Azure et son port public
    • Le site sur lequel le website va être déployé
    • Un compte utilisateur qui a les droits d’utiliser le Web Deploy
    • L’URL pour accéder au site une fois que le wizard sera fermé (optionnel)

    image47

    Acceptez le certificat:

    image48

    Si vous avez l’erreur suivante:

    Could not connect to the remote computer (“iis01flo.cloudapp.net”).
    On the remote computer, make sure that Web Deploy is installed and that the required process (“The Web Management Service”) is started.

    The remote server returned an error: (404) Not Found.

    image49

    Allez dans le panneau de configuration et modifiez le logiciel Microsoft Web Deploy 3.5 et ajoutez toutes les features:

    image50

    Si tout est OK, vous devriez avec ceci:

    image51

    Choisissez ensuite les option que vous souhaitez:

    image52

    Quand vous cliquez sur le boutton Preview vous allez voir ce que VS va envoyer sur le serveur IIS:

    image53

    L’envoi est maintenant terminé:

    image54

    Internet Explorer s’ouvre sur le site que vous venez de déployer:

    image55

    Renseignez le nom d’une VM que vous souhaitez démarrer:

    image56

    Après quelques secondes, vous pouvez voir que la VM est en cours de démarrage:

    image57

    Vous pouvez également vérifier la commande qui a été exécuté dans les logs du serveur IIS:

    image58

    • 14/10/2015

    [Azure] Implémenter le RBAC

    windowsAzureLogo

    Une grande nouveauté de Azure de ces dernières semaines est la disponibilité de Role Based Access Control (RBAC) : http://blogs.technet.com/b/ad/archive/2015/10/12/azure-rbac-is-ga.aspx

    L’avantage de cette solution est le fait de pouvoir attribuer des permissions sans pour autant donner les droits d’administrateurs aux utilisateurs.

    Je vais vous expliquer comment mettre en place cette solution et ainsi, mieux gérer vos droits. Pour commencer, il faut vous connecter sur https://portal.azure.com . RBAC est seulement possible sur cette interface. Une fois connecté, créez 2 groupes de ressources. Un pour stocker les VMs, les VHD associés à ces VMs, etc. et les autres pour stocker les réseaux:

    imageimage1

    Il faut maintenant assigner les bonnes permissions sur les bons groupes de ressources. Sur le groupe SCUGBE_RG_Store, je vais assigner l’utilisateur/groupe au rôle “Virtual Machine Contributor” pour créer les machines virtuelles et au rôle “Storage Account Contributor” pour donner la possibilité de créer un compte de stockage:

    image2image3image4

    Faites la même chose sur le groupe de ressource qui contient le réseau et donner le role Reader:

    image5

    Début - La partie suivante est optionnelle si vous ne souhaitez pas autoriser la connexion depuis l’extérieur de votre réseau.

    Nous allons créer un Network Security Group  pour ouvrir le port 3389 sur ce réseau pour autoriser la connexion RDP. Utilisez le script PowerShell suivant:

    Switch-AzureMode AzureResourceManager
    $rule1 = New-AzureNetworkSecurityRuleConfig -Name rdp-rule -Description “Allow RDP” -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389
    New-AzureNetworkSecurityGroup -ResourceGroupName SCUGBE_RG_Networks -Location “West Europe” -Name “SCUGBE-NSG” -SecurityRules $rule1

    image8

    Quand c’est terminé, vous devez assigner le rôle “Virtual Machine Contributor” à l’utilisateur/groupe pour autoriser l’utilisateur/groupe à enregistrer la carte réseau de la VM à ce réseau:

    image9

    On va maintenant ajouter un réseau spécifique à une personne/groupe et le lier au Network Security Group créé précédemment:

    image10

    On va associer une IP publique au Network Security Group pour donner la possibilité aux utilisateurs de se connecter à distance:

    Switch-AzureMode AzureResourceManager
    New-AzurePublicIpAddress -Name “SCUGBE-IPPublic” -ResourceGroupName SCUGBE_RG_Networks -Location “West Europe” -AllocationMethod Dynamic -DomainNameLabel “scugbe-rbac”

    image11

    Vous devez assigner le rôle “Virtual Machine Contributor” à l’utilisateur/groupe pour autoriser l’utilisateur/groupe à enregistrer l’IP de la VM:

    image12image13

    Fin - La partie suivante est optionnelle si vous ne souhaitez pas autoriser la connexion depuis l’extérieur de votre réseau.

    Avant de refaire un déploiement, nous devons assigner les permissions à un utilisateur/groupe de récupérer un IP dans le bon sous-réseau. Cette étape est seulement disponible en PowerShell. Pour ceci, nous avons besoin de récupérer le paramètre ObjectId:

    Switch-AzureMode AzureResourceManager
    Get-AzureRoleAssignment | FT DisplayName, Type, ObjectId

    image14

    Exécutez le script suivant, en l’adaptant avec vos valeurs:

    New-AzureRoleAssignment -ObjectId 2a83b08f-f189-4697-97e6-3fd5bcb433a3 -RoleDefinitionName “Virtual Machine Contributor” -ResourceName “SCUGBE_VNet_VMs” -ResourceType Microsoft.Network/virtualNetworks/subnets -ParentResource virtualNetworks/SCUGBE_VNet -ResourceGroupName SCUGBE_RG_Networks

    image15

    Il est maintenant temps de refaire un déploiement, avec mes 2 groupes de ressources:

    image16

    Connectez vous avec le compte qui a les droits de déployer une machine virtuelle et déployez une machine en utilisant le Resource Manager:

    image17image18image19image20

    La VM est en cours de déploiement:

    image21image22image23

    Quand la VM est déployée, vous pouvez vous connecter en RDP:

    image24

    Et vous pouvez voir uniquement les objets auxquels vous avez les droits:

    image25

    Si j’essaye de déployer une VM sur un réseau où je n’ai pas les droits, je reçois le message d’erreur suivant:

    image26image27image28

    Pour information, dans les prochaines versions de Azure, vous aurez la possibilité de créer vos propres rôles Sourire