Le Cloud de Romain LOIZEAU

  • [Windows Server 2012] Présentation des Managed Service Account (MSA) et Group Managed Service Account (gMSA)

    Avant Windows Server 2008R2, lorsque nous voulions utiliser un compte de service pour piloter un service, ce dernier, en règle générale était un compte utilisateur du domaine auquel on affectait les paramètres suivants :

    -          Interdiction d’ouvrir une session interactive (Deny Logon Locally)

    -          Un Mot de passe fixe qui n’expire jamais (Password Never Expires)

    -          L’utilisateur ne peut pas changer le mot de passe (User cannot changed password)


    Depuis Windows Server 2008R2, un nouveau type de compte de domaine est apparu, le MSA : Managed Service Account.

    Ce type de compte, hérite de certaines propriétés des classes utilisateurs et ordinateurs et permet donc plus de souplesse au niveau de la gestion des comptes de services.

    Ce MSA est capable de changer son mot de passe tout seul (comme les comptes machines, dont il hérite), au bout d’un certain laps de temps, auprès du contrôleur de domaine, sans aucune intervention d’un administrateur. Il n’est même pas nécessaire de connaitre le mot de passe, ce qui enlève un niveau de complexité administrative où, auparavant, il fallait gérer tous les mots de passes de tous les comptes de services

    Un exemple d'utilisation d'un serveur SQL (SQL Server 1) utilisant un MSA (Managed Service Account 1):

    Ce mécanisme très pratique est en revanche, très limité, par exemple lorsque nous voulions utiliser ce même MSA pour deux services sur deux serveurs différents SQL Server 1 et SQL Server 2 .

    En effet, imaginons que le mot de passe atteint sa date d'expiration et que SQL Server 1 se mette à négocier le nouveau mot de passe avec le contrôleur de domaine, et qu'ils se mettent d’accord pour utiliser le mot de passe Password1.

    SQLServer2 de son côté se rend compte que le mot de passe à expiré et à son tour tente de négocier le changement de mot de passe en proposant Password2. Puisqu’il n’y a pas de mécanisme de synchronisation, le mot de passe est accepté par le contrôleur de domaine.

    SQL Server 1 n’ayant jamais reçu l’information comme quoi le mot de passe a été changé de nouveau, l’authentification du MSA échoue et le service n’est plus fonctionnel.

    Cette limitation pouvait se contourner et pour que nos deux serveurs SQL puissent bénéficier de la souplesse de gestion des MSA, il fallait créer un compte par service :

    Bien que les mot de passes des MSA ne soient plus gérés par l'admnistrateur, il fallait cependant gérer un MSA par service... 

    C'est pourquoi Windows Server 2012 introduit les Group Managed Service Account (gMSA).

    Le fonctionnement des gMSA est très similaire à celui des MSA à l’exception que ceux-ci peuvent s’affecter à des groupes de sécurités Active Directory.

    Ce groupe permet de définir a quels comptes d’ordinateurs le gMSA peut être attribué. Arrivé à expiration, le nouveau mot de passe sera publié à tous les membres du groupe, permettant à toutes les machines membres de se synchroniser :

    Pour finir, ces comptes ont eux aussi leurs limitations car il faut que le service soit compatible avec les MSA/gMSA (ex: SQL Server 2012, IIS, etc)...

    Edit: Petite précision, les gMSA ne fonctionnent que si le système hôte du service est Windows Server 2012..

    • 21/7/2013
  • [MDT 2012 Update 1] Ma Séquence de tâche s'arrête à l'étape "Install Roles and Features"

    J'ai constaté que la fonction "Install Roles and Features" se déroule de façon aléatoire lors d'un déploiement avec MDT 2012 Update 1.

    En effet, pour déployer Windows 2008R2 SP1, je me servais de cette étape pour installer les Features suivantes:

    •  SNMP Services
    •  Windows Powershell Integrated Scripting Environement (ISE)
    •  GPMC
    •  .NET Framework 3.5.1

    J'ai remarqué que sur une même machine, dans des circonstances tout à fait similaire, ma séquence de tâche pouvait se compléter sans problème, ou parfois disparaître tout simplement  et provoquer un arrêt du déroulement de la séquence de tâches.

    En analysant les logs, et plus précisement smsts.log, l'erreur obtenue était la suivante: "Incorrect Function (Error: 00000001; Source: Windows). Malheureusement, cette erreur est une erreur générique...

    Si vous vous trouver dans la même situation, je vous conseille d'utiliser une tâche de type "Run Command Line" et d’exécuter la ligne suivante:

    PowerShell.exe -Command "& {Import-Module ServerManager; Add-WindowsFeature <Services> }"

    Cette ligne powershell se charge d'importer le module ServerManager et d'installer les features passées en argument à la cmdlet Add-WindowsFeature (sous Windows 2012, un alias de cette commande est Install-WindowsFeature))

    Pour identifier le nom des features à passer en argument, vous pouvez utiliser la cmdlet suivante, après avoir importé le module ServerManager ( avec la commande Import-Module ServerManager ) : 

    > Get-WindowsFeature

    Il suffit ensuite d'identifier dans la colonne Name le nom de la feature souhaitée, puis de la passer en argument à notre cmdlet Add-WindowsFeature.

    Pour installer les features citées au début de ce billet, la commande complète à implémenter dans la TS devient la suivante :

    PowerShell.exe -Command "& {Import-Module ServerManager; Add-WindowsFeature SNMP-Services,Powershell-ISE,NET-Framework,GPMC }"


    Une fois la tâche "Install Roles and Features" remplacée par cette commande, je n'ai plus de crash aléatoire lors de l'installation de mes features et 100% des déploiements sont réussis!

    • 18/6/2013
  • [Powershell] Exporter une propriété calculée

    Voici un petit billet "pense bête" pour les amateurs de Powershell. Rien d'extraordinaire ici, nous allons juste voir comment inclure une propriété calculée dans un export-csv.

    Pour expliquer ce qu'est une propriété calculée et comment l'utiliser, je vais me servir d'un exemple tout simple:

    Exemple: Nous souhaitons exporter la date de dernière connexion de plusieurs utilisateurs dans l'Active Directory.

    Dans un premier temps, nous allons voir comment retourner la dernière date de connexion pour un utilisateur.

    Pour cela nous utilisons le cmdlet "Get-ADUser" en spécifiant la propriété "LastLogon" ce qui nous donne (attention à ne pas oublier d'importer le module Active Directory) :

    Get-ADUser -Identity <user_identity> -Properties "LastLogon"

    Le souci ici est que la propriété "LastLogon" retourne un timestamp calculé à partir du 1er Janvier 1600. Pour que la donnée soit exploitable, il faut la convertir en type "Date" et en ajoutant 1600 années.

    Pour cela, créons une fonction "Convert-ADDate", qui prendra en paramètre le timestamp retourné par la propriété "LastLogon" et retournera la date correcte calculée:

    Function Convert-ADDate ($d){ 

    $adDate = Get-Date -Date $d 

    return $adDate.AddYears(1600) 

    }

    Maintenant nous allons utiliser cette fonction pour calculer la date calculée. Ceci donnerait:

    $user = Get-ADUser -Identity "loizeaur" -Properties "LastLogon"

    $lastLogon = Convert-ADDate($user.LastLogon)

    Comment inclure ce calcul dans un script afin d'identifier les dates de connexions d'une série d'utilisateurs?

    Rien de plus simple, nous allons utiliser les propriétés calculées de Powershell dans l'exemple de code très simple qui suit, où nous allons récupérer le nom de l'utilisateur, sa date de dernière connexion ainsi que son adresse email:

    Import-CSV "users.csv" | foreach $_ { 

    Get-ADUser -Identity $_.userName -Properties "lastLogon","mail"

    } | select-object Name,@{Name="Last Logon Date";Expression={Convert-ADDate(lastLogon)}}, mail | Export-CSV "'lastLogon.csv"

    (Petite précision, notre fichier CSV en entrée "users.csv" contient la liste des utilisateurs - avec une propriété identifiable unique, type samAccountName ou DN - avec pour entête userName)


    La syntaxe d'une propriété calculée est la suivante :

    @{Name=<nom_de_la_propriété>;Expression={<expression_de_la_propriété}}

    Dans l'exemple ci-dessus nous utilisons @{Name="Last Logon Date";Expression={Convert-ADDate(lastLogon)}} qui nous permet de retourner une valeur nommée "Last Logon Date" et qui aura pour valeur la date "correcte" de dernière connexion calculée à partir de la fonction Convert-ADDate.

    Voilà, rien de bien méchant! Cette technique est très efficace car elle permet d'avoir très rapidement des données exploitables en très peu de lignes!
    • 16/1/2013
  • [APP-V] Séquencer une application avec Application Virtualization Sequencer 5.0

    Microsoft a publié hier sa nouvelle version du pack MDOP 2012 (Microsoft Desktop Optimization Pack) embarquant, parmis d'autres outils, la version 5.0 de App-V (Application Virtualization). 

    Nous allons voir dans ce billet comment packager des applications avec cette nouvelle version du séquenceur. 

    Préparer le séquenceur 

    Définition 

    Le séquenceur est la machine de référence, à partir de laquelle les packages seront créés. Pour se faire, le séquenceur va analyser toutes les modifications apportées au système pendant l'installation d'une application afin de les insérer dans le package .appv (nouvelle extension de la version 5.0, précédemment .sft). Les modifications liées au système de fichiers et au registre seront donc "montées" dans un environnement virtuel par le client App-V, se superposant ainsi au système de fichier dit "physique" du système client. 

    Afin d'obtenir des packages "propres" et sans surplus, il est fortement conseiller de les créer sur une machine fraichement installée. 

    Pour cette raison, il est fortement conseillé d'installer le séquenceur APP-V 5.0 sur une VM et de créer un snapshot dès que le système est prêt à packager sa première application.  

    Prérequis 

    Les pré-requis pour faire fonctionner le séquenceur sont les suivants: 

    Bien choisir l'OS du "socle" 

    Si les applications packagées sont amenées à être utilisées sur plusieurs versions de Windows, il convient de bien choisir laquelle servira de référence pour le séquenceur.   

    Par exemple, nous souhaitons séquencer l'application Adobe Reader XI, pour ensuite la déployer sous forme de package à tous les clients Windows 7 32Bit/64Bit et Windows 8 64 Bit.  

    Sur quel système est-il préférable de séquencer l'application?  

    La réponse est en réalité assez simple, pour des raisons de "meilleure" compatibilité, il est préférable d'utiliser le système le plus ancien. 

    Dans le cas ou plusieurs architectures différentes sont utilisées, nous avons la possibilité de packager l'application en 32 bit et de la déployer sur des systèmes 32bit / 64bit, ou bien de créer deux packages différents, chacun adapté à l'architecture correspondante. 

    Qu'en est il si mon application sera déployée sur des serveurs Windows 2008 R2 / Windows 2012, puis servie aux clients via RDP/ RemoteApp ? 

    Dans un environnement où les applications virtuelles sont toutes déployées via RDP depuis des serveurs Windows  Server 2008 R2 ou Windows Server 2012 (pour rappel, ces versions de Windows sont disponibles en 64bit uniquement, Windows Server 2003 n'étant plus supporté), l'architecture du poste client n'est pas prise en compte.  

    Note: APP-V Sequencer 5.0 ne supporte que Windows 7 et Windows 8. Il n'est plus possible de packager des applications pour Windows XP et Windows Vista (dû au fait qu'APPV 5.0 est très fortement basé sur Powershell 3.0) 

    Suspendre les services et fermer les applications 

    Il est conseillé d'arrêter voire désactiver certains services avant de procéder au packaging de l'application. Cette étape est importante car elle permet d'éviter que des services intrusifs opèrent pendant que le séquenceur scanne la machine pour identifier les changements effectués par l'installation de l'application.  

    Pour faire simple, nous ne voudrions pas que Windows Update effectue une mise à jour pendant l'installation de notre application. Les changements effectués par cette mise à jour serait par la suite intégrée au package virtuel et pourrait provoquer un dysfonctionnement de l'application en question. 

    Les services que l'on peut désactiver sont les suivants: 

    Service 

    Windows Update 

    Windows Defender 

    Service d'indexation 

    Créer un snapshot 

    Une fois toute les applications fermées et services désactivés, je vous invite à créer un snapshot de la machine virtuelle pour pouvoir revenir rapidement à l'état initial et non altéré de notre séquenceur. 

    Packager avec App-V 5.0: 

    Séquencer une application avec APP-V 5.0 est à très peu de choses près, le même scénario que l'on connaît avec la précédente version 4.6 SP2. 

    Plus besoin de lecteur virtuel! 

    La principale différence réside dans le fait qu'il n'y a plus de lecteur virtuel Q: imposé dans la version 4.6 (et antérieure). 

    Cette contrainte permet de pallier certains problèmes que l'on pouvait rencontrer avec des applications "Legacy" qui ne pouvait pas du tout s'installer en dehors du lecteur C:. 

    Il faut tout de même préciser que lors du packaging de l'application, il est requis de spécifier un dossier "racine" dans lequel l'application sera installée. 

    Séquencer Adobe Reader XI 

    Dans la section suivante, nous allons suivre l'assistant du séquenceur pour packager l'application Adobe Reader XI.  

    1. Copier les sources d'Adobe Reader XI sur le séquenceur 
    2. Lancer l'application "Microsoft Application Virtualization Sequencer"
    3. A l'ouverture de l'assistant, nous allons choisir de créer un nouveau package. Pour cela, cliquez sur "Create A New Virtual Package Application".
    4. L'écran suivant nous invite à choisir la méthode de packaging pour l'application. Nous avons le choix entre créer un package de toute pièce (Create Package) ou d'utiliser un accélérateur de package (une sorte de recette fournie par l'éditeur de l'application ou la communauté qui l'entoure). Dans notre cas, nous choisirons "Create a Package (Default)".
    5. Dans le cas où des applications et/ou services non nécessaires (Windows Update, Windows Defender) se trouvent en tâche de fond, l'écran suivant vous en informera et vous invitera a les fermer avant de continuer. Toutefois, il est possible de passer outre cette étape en cliquant sur "Next", bien que cela ne soit pas conseillé. 
    6. Une fois les services désactivés, et les reboots nécessaires effectués, l'écran précédent affichera un message d'information indiquant que le séquenceur est prêt à packager. 
    7. Le séquenceur vous invitera à choisir le type d'application que nous souhaitons packager. Nous avons ici le choix entre "Standard Application" comme son nom l'indique pour packager une application standard, "Add-on or Plug-in" pour packager une extension d'application, par exemple un Plugin pour Excel, ou encore "Middleware" pour packager un framework ou autre application impliquant une dépendance pour d'autre application. Ici nous choisirons "Standard Application" avant de cliquer sur le bouton "Next". 
    8. Nous serons ensuite amené à choisir l'exécutable que le séquenceur se chargera de démarrer pour installer l'application, ou bien de choisir "Perform a custom Installation" pour lancer manuellement les exécutables d'installation, ou autres scripts, parfois nécessaires. Dans le cas d'Adobe Reader XI, nous cliquons sur Browse pour aller sélectionner notre installer au format MSI.
    9. L'écran suivant nous invitera à indiquer un nom pour le package ainsi que le repertoire principal où l'application sera installée. Dans le champ nom nous saisirons "Adobe Reader XI
    10. Ensuite nous spécifierions le dossier dans lequel Adobe Reader XI sera installé. Notez qu'il est possible de choisir un répertoire parent, mais qu'il est strictement impossible de choisir la racine du lecteur C:
    11. L'écran suivant démarrera l'installation de l'application. Cliquez sur Exécuter lorsque l'UAC vous invitera à le faire. 
    12. Cliquons sur "Change Destination Folder" pour s'assurer que le répertoire de destination concorde bien avec le chemin spécifié à l'étape 17-18.
    13. Sélectionnez le répertoire indiqué précédemment à l'étape 17-18 et validez 
    14. L'étape suivante dans le processus d'installation d'Adobe Reader XI vous invitera à choisir la méthode de mise à jour que vous souhaitez configurer pour l'application. Dans le cas du packaging de notre application il est fortement recommandé de désactiver les mises à jour pour garder l'intégrité de notre package. Il est préférable de distribuer la mise à jour sous la forme d'un package différentiel ou bien sous la forme d'un tout nouveau package. Par conséquent, nous choisirons "Manually check for install and updates
    15. Une fois validée, l'installation commence. 
    16. Lorsque l'installation est terminée, fermez l'assistant d'installation. 
    17. De retour sur la fenêtre du séquenceur, il sera possible de cliquez sur "Run..." pour lancer d'autres exécutables ou scripts pour configurer notre applications ou intégrer des élément supplémentaires à notre package. Une fois tous les éléments installés, nous cocherons la case "I am finished installing" pour pouvoir ensuite cliquer sur le bouton "Next" et passer à l'écran suivant. 
    18. Le séquenceur collecte les changements apportés au système 
    19. Une fois la collecte des informations de changement réalisée, le séquenceur vous présentera la liste des exécutables détectés pendant l'installation. Cette étape est importante car le séquenceur vous permettra d'exécuter chaque application pour les configurer et sauvegarder ces paramètres dans le package. Sélectionnons "Adobe Reader XI" et cliquons sur "Run Selected". 
    20. Par exemple, afin d'éviter que le Disclaimer se présente au premier lancement du package sur les clients, nous pouvons cliquez sur "Accept" pour que le séquenceur sauvegarde ce changement et l'inclus dans la configuration virtuelle de l'application. Cette étape peut aussi servir à désactiver les mises à jour type "self-update" de certaines applications lorsque l'installeur ne propose pas l'option. 
    21. Une fois le disclaimer accepté, nous pouvons fermer l'application pour retourner sur l'écran du séquenceur
    22. Une fois les applications configurées, cliquez sur Next pour arriver sur l'écran du rapport d'installation. Ici, vous pourrez identifier les différentes alertes et points d'attention soulevés par le séquenceur. Dans notre cas, certains fichiers ont été ignorés par le séquenceur. En double cliquant sur l'incident, il est possible d'obtenir plus d'informations 
    23. L'écran suivant nous invitera à choisir si nous souhaitons personnaliser l'application, ou bien si nous voulons terminer et sauvegarder notre package. Sélectionnons "Customize" et cliquons sur "Next"
    24. Le premier écran de personnalisation nous invite à exécuter l'application dans son environnement virtuel pour la première fois. Cette étape est importante dans le cas où l'application est destinées à être déployée sur les clients en streaming puisque le séquenceur analysera les blocs d'instructions nécessaires au premier lancement de l'application afin de les déployer en premier vers les clients. Les blocs suivants seront téléchargés en tâches de fond.
    25. Une fois l'application lancée, ouvrez un fichier PDF puis fermons l'application.De retour sur l'écran du séquenceur,  cliquons sur Next 
    26. L'écran suivant nous invite à sélectionner les OS sur lesquels l'application sera autorisée à fonctionner.
    27. Une fois les systèmes choisis, nous pouvons sauvegarder le package en sélectionnant l'emplacement de sauvegarde et en cliquant sur "Create
    28. Le séquenceur affichera un résumé des évènements et erreurs rencontrés lors du packaging de l'application. 
    29. Pour terminer, ouvre le répertoire de destination, et sauvegardons le package avant d'effectuer un retour arrière en restaurant notre Snapshot. 

    Principales nouveautés des packages APPV 5.0 

     

    • Le fichier binaire .SFT se transforme en .APPV 

    • Le fichier MSI est automatiquement généré (il fallait choisir l'option dans les précédentes versions) 

    • Par défaut les packages sont automatiquement compressés 

    • Le fichier manifest.xml a été divisé en deux fichiers: 

      •  *_DeploymentConfig.xml pour tout ce qui concerne les options de déploiement et les informations systèmes du package (le type d'OS supporté) 

      • *_UserConfig.xml comprenant la configuration utilisateur, décrivant la façon dont l'application se comportera sur le client 

    • Le fichier report.xml résume au format xml les différents rapports affichées par le séquenceur 

    • Disparition du fichier OSD 

    • Disparition du dossier regroupant les icones 

    • Disparition de la fenêtre d'association de fichiers dans le séquenceur. 

     

    • 2/11/2012
  • [MDT 2012 Update 1] Utiliser différents paramètres en fonction de la séquence de tâches

    Il semblerait que cette "fonctionnalité" basée sur la variable TaskSequenceID ne fonctionne plus par défaut avec MDT2012 U1.

    Pour rappel, elle permet de créer des sous-sections dans le fichier de configuration "CustomSettings.ini" permettant de configurer différents paramètres en fonction de la séquence de tâche choisie.

    Il est possible de la restaurer en deux étapes:

    1 - Tout d'abord en éditant le script DeployWiz_SelectTS.vbs avec un simple éditeur de texte;

    a. Rechercher "Dim sTemplate" et ajouter les deux lignes suivantes:

    Dim sCmd
    Set Oshell = createObject("Wscript.shell")

    b. Puis, juste avant la fin de la fonction, insérer les lignes suivantes:

    sCmd = "wscript.exe """ & oUtility.ScriptDir & "\ZTIGather.wsf"""

    oItem = oSHell.Run(sCmd, , true)

    2 - Puis en éditant la TS associée:

    a. Dans la section "Initialization", choisir la tâche "Gather Local Only"

    b. Sélectionnez Gather local data and process rules

    c. Spécifiez le fichier "customsettings.ini" dans la textbox associée

    Source: http://social.technet.microsoft.com/Forums/en-US/mdt/thread/e17a1952-d1f7-41ef-8231-0d6fcc41882e/

    • 14/10/2012
  • [APP-V] APP-V v5.0 Beta 2 Client - Message d'erreur "ASIE" lors de l'installation

    Si comme moi vous avez installé par curiosité la Beta 2 d'App-V v5.0, vous avez peut être rencontré l'erreur : "Failure Windows Error message: Asie" lors de l'installation du client (sur Windows 8 RTM dans mon cas).
    En inspectant les logs, nommés appv_client_*.log situés dans C:\Users\<user>\AppData\Local\Temp, nous pouvons nous apercevoir qu'il s'agit d'une erreur provoquée par une version non reconnue de Visual C++ 2010 Redistribuable x64 par le client

    Extrait du fichier de log:

    [...]
    [133C:0E1C][2012-10-14T14:20:41]: Applying execute package: VC10X64, action: Install, path: C:\ProgramData\Package Cache\B330B760A8F16D5A31C2DC815627F5EB40861008\vcredist_x64.exe, arguments: '"C:\ProgramData\Package Cache\B330B760A8F16D5A31C2DC815627F5EB40861008\vcredist_x64.exe" /q'
    [133C:0E1C][2012-10-14T14:20:43]: Error 0x800713ec: Process returned error: 0x13ec
    [133C:0E1C][2012-10-14T14:20:43]: Error 0x800713ec: Failed to execute EXE package.
    [0338:1074][2012-10-14T14:20:43]: Error 0x800713ec: Failed to configure per-machine EXE package.
    [0338:1074][2012-10-14T14:20:43]: Error 0x800713ec: Failed to execute EXE package.
    [133C:0E1C][2012-10-14T14:20:43]: Removing cached package: VC10X64, from path: C:\ProgramData\Package Cache\B330B760A8F16D5A31C2DC815627F5EB40861008\
    [133C:0E1C][2012-10-14T14:20:43]: Removing cached package: VC8X86, from path: C:\ProgramData\Package Cache\B8FAB0BB7F62A24DDFE77B19CD9A1451ABD7B847\
    [133C:0E1C][2012-10-14T14:20:43]: Removing bundle dependency provider: {e4603291-c2e6-40f2-acd3-eb7ab100d1bb}
    [133C:0E1C][2012-10-14T14:20:43]: Removing cached bundle: {e4603291-c2e6-40f2-acd3-eb7ab100d1bb}, from path: C:\ProgramData\Package Cache\{e4603291-c2e6-40f2-acd3-eb7ab100d1bb}\
    [0338:1074][2012-10-14T14:20:43]: AppvUX: Apply phase ended with failure.
    Failure HRESULT: -2147019796
    Failure Windows Error message: Asie
    [...]


    Ce problème est facilement réparable en désinstallant toutes les versions de Visual C++ 2010 Redistribuable x64 sur le poste. L'installation se déroule sans souci par la suite.

    • 14/10/2012