Sylver SCHORGEN Blog's

Articles, astuces et news sur les technologies Microsoft et plus particulièrement tournant autour de Powershell
  • [Powershell] Copier la sortie Powershell vers le presse-papiers

     Voici une petite astuce Powershell que j'ai lu ce matin sur le blog "Hey, Scripting Guy!" (qui est un super blog rempli d'articles et d'astuces Powershell de très grande qualité).

    À l'aide de l'utilitaire "clip.exe", il est possible de récupérer la sortie Powershell pour l'envoyer facilement vers le presse-papier (en utilisant le pipe pour rediriger la sortie vers l'outils clip.exe)

    Vous trouverez un exemple dans l'article "PowerTip: Copy Information to the Clipboard with PowerShell".

  • [Powershell] Sauvegarder et restaurer vos GPO

    Le module "GroupPolicy" nous permet de facilement sauvegarder et restaurer toutes nos GPO.

    Sauvegarder vos GPO

    Afin de pouvoir sauvegarder vos GPO, la cmdlet Backup-GPO est disponible. Elle permet de sauvegarder toutes les GPO ou une GPO en particulier en fournissant son nom ou son GUID. Lorsque l'on sauvegarde nos GPO, il faut également fournir le chemin ou l'on veut les sauvegarder (chemin local ou partage réseau). Nous pouvons également indiquer le nom de domaine et le nom du serveur en paramètres. Pour plus d'info sur les paramètres vous pouvez consulter la documentation Technet.

    Sauvegarder toutes les GPO du domaine : Backup-GPO -All -Domain 'mondomaine.local' -Path '\\srv-backup\gpo'

    Sauvegarder une seule GPO : Backup-GPO -Name 'Win81BootToDesktop' -Domain 'mondomaine.local'  -Path '\\srv-backup\gpo'

    Les 2 commandes ci-dessus permettent de faire une sauvegarde ponctuelle des GPO. Afin de les sauvegarder régulièrement, voici un petit script que vous pouvez lancer, par exemple, toutes les semaines (à l'aide d'une tâche planifiée) :

    Import-Module GroupPolicy

    $domain = 'mondomaine.local'

    $backupPath = '\\srv-backup\gpo\'

    $formatedDate= Get-Date -Format Get-Date -Format dd.MM.yyyy_HH.mm.ss

    $folder = $backupPath + 'backup_' + $formatedDate

    New-Item -ItemType Directory -Path $folder

    Backup-GPO -All -Domain $domain -Path $folder

    Il vous faut juste modifier ces 2 variables :

    • $domain : Correspond à votre domaine
    • $backupPath : Correspond à votre dossier de sauvegarde racine (n'oubliez pas le '\' à la fin de cette chaîne de caractère)

    Le script créera dans un premier temps un dossier avec la date et l'heure du lancement de la sauvegarde ("backup_29.29.2014_06.29.36" par exemple) puis sauvegardera, dans un second temps, toutes vos GPO à l'intérieur de ce dossier. Au niveau de la console, vous devriez avoir le retour de toutes les GPO sauvegardées. Le script est fourni en pièce jointe à cet article.

    Restaurer vos GPO

    Vous pouvez restaurer vos GPO à l'aide des cmdlets ci-dessous :

    Restaurer toutes les GPORestore-GPO -All -Domain 'mondomaine.local' -Path '\\srv-backup\gpo'

    Restaurer une seule GPO : Restore-GPO -Name 'Win81BootToDesktop' -Domain 'mondomaine.local' -Path '\\srv-backup\gpo'

    Pour plus d'information sur la cmdlet Restore-GPO, rendez-vous sur le site Technet.

  • [Astuce] Powershell Command Builder pour SharePoint

    J'ai découvert ce site il y a plusieurs mois en lisant des articles Technet mais ne l'avez jamais partagé jusqu'ici par oubli.

    Le site de microsoft nommé Windows Powershell for SharePoint Command Builder vous permet  de créer votre cmdlet Powershell en "clic clic". Il existe également quelques actions prédéfinies comme "créer un site", "supprimer un site", "supprimer une content database", ... Vous pouvez également sélectionner votre version de SharePoint (Online, Server 2013, Foundation 2013, Server 2010, Foundation 2010).

    Si vous ne connaissez pas ou connaissez peu les cmdlets SharePoint, cela peut être un bon moyen de les apprivoiser :)

  • [Powershell] Créer une nouvelle collection de sites sur SharePoint Online

    Avec Office365, Microsoft a également distribué plusieurs cmdlets permettant d'intéragir avec les produits "Online". Nous parlerons ici spécifiquement de SharePoint Online et de comment créer une nouvelle collection de sites directement depuis Powershell.

    Installer le shell de gestion pour SharePoint Online

    1. Installer le Windows Management Framework
    2. Installer le SharePoint Online Management Shell

    Connexion au service SharePoint Online

    Afin de vous connecter au service SharePoint Online, il faut utiliser la cmdlet Connect-SPOService depuis le SharePoint Online Management Shell tel que ci-dessous. 

    Une fois cette cmdlet exécutée, une nouvelle fenêtre s'affichera afin que vous entriez le mot de passe du compte utilisateur.

    Création de la nouvelle collection de sites

    Le script fourni est très simple et va effectué les tâches ci dessous :

    • Vérifier que la collection de sites que vous essayez de créer n'existe pas
    • Créer la collection de sites

    Concernant ce script, les variables à modifier sont les suivantes :

    • $siteTitle : Correpond au titre du site
    • $siteUrl : Correspond a l'url du site
    • $siteOwner : Login de l'owner du site. Cette variable est du type login@domain.fr ou login@quelquechose.onmicrosoft.com
    • $siteQuota : Correpond au quota en Mb
    • $siteTemplate : Correspond au template du site

    Astuce : Pour lister tous les templates de sites disponibles pour SharePoint Online vous pouvez utiliser la cmdlet 

    $siteTitle = 'Demo SPO'
    $siteUrl = 'https://your_site_url'
    $siteOwner = 'your@login.fr'
    $siteQuota = 500
    $siteTemplate = 'STS#0'

    function CheckAndCreateNewSPOSiteCollection {

    try {

    $siteCollection = Get-SPOSite -Identity $siteUrl

    if($siteCollection -ne $null) {

    Write-Error -Message "La collection de site que vous essayez de créer existe déjà !" -Category ResourceExists

    }

    }

    catch {

    New-SPOSite -Url $siteUrl -Title $siteTitle -Owner $siteOwner -Template $siteTemplate -StorageQuota $siteQuota

    Write-Host "Le site $siteTile a été créé avec succès à l'adresse $siteUrl" -ForegroundColor Green

    }

    }

    CheckAndCreateNewSPOSiteCollection

    Attention : L'exécution de cette fonction peut prendre quelques minutes.

    Voilà pour cette petite démo permettant de créer une collection de site sur SharePoint Online directement depuis Powershell. Le script pourrait bien entendu être amélioré afin de gérer d'autres erreurs possibles notamment. Je vous laisse le soin de l'adapter en fonction de vos besoins :)

    Vous pouvez trouver la liste des cmdlets pour SharePoint Online sur le site de Microsoft.

    La script est fourni en pièce jointe à cet article.

  • [Windows 8.1] Démarrer directement sur le bureau

    Avec Windows 8.1, plusieurs nouveautés sont apparues dont la possibilité de démarrer directement sur le bureau et non sur le menu démarrer. Cet article vous montrera comment configurer ce paramètre directement depuis votre poste Windows 8.1 et comment le faire en utilisant les Group Policy Preferences pour le déployer sur votre parc de machines depuis Windows Server 2012R2.

    Directement depuis votre PC

    Si vous possédez un ordinateur avec Windows 8.1 d'installer et que vous voulez démarrer directement sur le menu démarrer, il suffit d'aller dans les propriétés de la barre des tâches > sélectionner l'onglet navigation > cocher le paramètre "When I sign in or close all apps on a screen, go to the desktop instead of Start" (en français : "Accéder au Bureau au lieu de l'accueil, lorsque je me connecte ou que je ferme toutes les applications à l'écran").

    Vous pouvez également directement le faire en Powershell. Il faut pour cela modifier la clé registre "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\StartPage\" est passer la valeur "OpenAtLogon" à comme ci-dessous :

    En utilisant les Group Policy Preferences

    Si vous avez une flotte de poste sous Windows 8.1 et que vous voulez qu'à chaque démarrage tout le monde arrive sur le bureau directement, vous pouvez utiliser une GPP (Group Policy Preferences) allant modifier la clé registre indiquée ci-dessus que vous appliquez au niveau utilisateur avec les paramètres suivants :

    • Action : Update
    • Hive : HKEY_CURRENT_USER
    • Key Path : Software\Microsoft\Windows\CurrentVersion\Explorer\StartPage
    • Value name : OpenAtLogon
    • Value type : REG_DWORD
    • Value data : 0
    • Base : Decimal

    Nous voulons cibler ici uniquement les machines Windows 8.1. Pour ce faire, dirigeons nous vers l'onglet "Common" de la même fenêtre. Nous allons cocher la propriété "Item-level targeting" qui va nous permettre de cibler le système d'exploitation.

    En cliquant sur le bouton "Targeting ...", une nouvelle interface apparaît au niveau de laquelle nous allons créer un nouvel élément nous permettant de cibler le système d'exploitation Windows 8.1.

    Une fois la cible validée et la GPO appliquée, toutes les machines Windows 8.1 de votre domaine démarreront directement sur le bureau.

  • [Powershell] Modifier une chaîne de caractères dans plusieurs fichiers

    Lorsque l'on doit modifier la même chaîne de caractères dans 3 ou 4 fichiers différents situés dans le même dossier, cela peut facilement et rapidement se faire manuellement. Imaginez maintenant que vous deviez modifier cette même chaîne dans une 50aine ou une 100aine de fichiers. Cela devient tout de suite plus contraignant et plus long.

    Afin de faciliter cette tâche, j'ai réalisé un petit script assez simple au niveau duquel vous n'avez que 3 variables à modifier :

    • $folder : Dossier contenant les fichiers au niveau desquels vous voulez effectuer des modifications
    • $stringToReplace : Correspond à la chaîne de caractères à remplacer
    • $replacementString : Correspond à la chaîne de caractères de remplacement

    Ce script peut être utilisé, par exemple, afin de modifier la même valeur située dans plusieurs fichiers de configuration différents. Vous le trouverez en pièce jointe à cet article

  • [Powershell] Un script de configuration basique de serveurs

    Voici un script Powershell permettant d'effectuer certaines actions basiques que nous réalisons souvent après l'installation de Windows Server, à savoir :

    • Changer le nom du serveur
    • Modifier les configuration réseau du serveur (adresse IP, serveurs DNS, passerelle par défaut)
    • Désactiver la sécurité renforcée pour Internet Explorer
    • Désactiver l'ouverture automatique du gestionnaire de serveur au démarrage de la machine

    Les seuls éléments à modifier sont les variables situés en haut du script :

    • $serverIp : L'ip que vous voulez affecter à votre serveur
    • $serverMask : Le masque de sous-réseaux
    • $serverInterfaceAlias : Le nom de l'interface réseau au niveau de laquelle vous voulez effectuer la configuration (visible dans les connexions réseaux)
    • $serverDefaultGateway : L'ip de votre passerelle par défaut
    • $serverDnsServers : Votre ou vos serveurs DNS. Ils doivent être séparés par une virgule
    • $serverName : Le nom que vous voulez donner à votre serveur
    • $desactivateIeEsc : Booléen permettant d'indiquer si vous voulez ou non désactiver la sécurité renforcée pour IE
    • $ieEscUsers : Variable permettant de spécifier pour quel type d'utilisateur vous voulez désactiver la sécurité renforcée pour IE (utilisateurs ou administrateurs). Les valeurs possibles sont @("admins"), @("users") ou @("admins", "users"). Cette variable ne sera prise en compte que si $desactivateIeEsc = $true
    • $doNotOpenServerManagerAtLogon : Booléen permettant d'indiquer si vous voulez que le gestionnaire de serveur s'ouvre ou non au démarrage de la machine
    Une fois toutes ses variables renseignées, vous pouvez exécuter le script.

    Attention : A la fin de l'exécution du script, le serveur redémarrera. 

    Le script est fourni en pièce jointe à cet article.

  • [Powershell] Les bases sur les expressions régulières

    Pour mon premier article sur ce blog je vais essayer de vous exposer les bases des expressions régulières (regex) afin que vous puissiez vous-même les écrire dans vos scripts Smile

    Que cela soit en Powershell ou d'en d'autres langages, beaucoup (trop) de personnes (dont j'ai fait partie pendant quelques temps) font des "copier/coller" de bouts de codes trouvés sur internet et les modifient un peu pour les adapter à leurs besoins sans réellement comprendre les regex en elles mêmes.

    Le but de cet article est donc de vous expliquez les bases afin que vous puissiez comprendre les regex et que vous puissiez les réaliser par vous-même. On essaye souvent de faire sans mais les regex s'avèrent être d'une grande utilité dans beaucoup de scripts pour effectuer, notamment, des actions de validation (adresse mail, URL, chemin UNC, nom, ...).

    Si je vous montre cette chaîne de caractères "sschorgen@microsofttouch.fr", vous allez tout de suite l'identifier comme étant une adresse e-mail. Votre ordinateur, quant à lui, va être incapable, de lui même, de faire la différence entre "sschorgen@microsofttouch.fr" et "http://www.microsofttouch.fr". Pour lui, les 2 correspondent à des chaînes de caractères. Il va donc falloir lui indiquer comment reconnaître que la 1ère est une adresse e-mail et la 2ème une URL. Pour ce faire, nous allons utiliser des regex.

    L'opérateur de comparaison match

    "-match" est l'opérateur que l'on va utiliser lorsque l'on voudra évaluer une chaîne de caractères à une regex.

    Exemple:  "ma_chaine_de_caracteres" -match "ma_regex"

    Cet opérateur retournera True si la chaîne de caractère source match la regex et retournera False dans le cas contraire.

    Par défaut, l'opérateur -match n'est pas sensible à la casse. Ainsi, dans le premier exemple ci-dessus "Touch" ou "touch" aurait retourné True. Si vous voulez que la casse soit prise en compte, il suffit d'utiliser l'opérateur "-cmatch" ('c' comme 'case sensitive'). 

    Répétition et généricité

    Dans les exemples ci-dessus, on cherche tout simplement à matcher une partie du mot. Les regex sont plutôt utilisées pour vérifier la structure de la chaîne de caractères. Pour ce faire, nous pouvons utiliser des caractères dit "génériques". Il en existe 2 :

    • '?' : correspond à 0 ou 1 fois n'importe quel caractère
    • '.' : correspond à 1 fois n'importe quel caractère

    Par exemple on pourrait vérifier que notre chaîne commence par la lettre 'M', puis 0 ou 1 lettre (n'importe laquelle), puis "crosoftTouch"

    Il est également souvent nécessaire de vérifier si un ou plusieurs caractères se répètent. Il existe pour cela 2 caractères dit de "répétitions" :

    • '*' : Permet de vérifier si le ou les caractères spécifiés avant le * se répètent 0 ou plusieurs fois
    • '+' : Permet de vérifier si le ou les caractères spécifiés avant le + se répètent 1 ou plusieurs fois

    Ainsi, si on voulait vérifier que dans "MicroMicrosoftTouch", la chaîne de caractère "Micro" se répètent une fois ou plus sans être sensible à la casse, on ferait ceci :

    Groupe de caractères

    Imaginons que l'on sache que notre mot commence par "Microsoftto", se termine par "ch" et que l'on veuille vérifier si la lettre entre "Microsoftto" et "ch" est soit un 'o', soit ou un 'i', soit un 'u'. Nous n'allons pas utiliser le '.' car ce dernier correspond à n'importe quel caractère. Nous allons alors utiliser ce que l'on appelle un groupe de caractères comme ci-dessous :

    Le groupe de caractères est donc un ensemble de lettres ou de chiffres à l'intérieur de [ ]. Il est, bien entendu possible de combiner les groupes de caractères avec les caractères de répétitions et les caractères génériques. 

    Si on veut vérifier la présence d'un caractère allant, par exemple, de A à H, dans une chaîne, on peut le faire comme ceci [A-H] au lieu d'écrire tous les caractères de la sorte [ABCDEFGH]. Cela fonctionne exactement de la même façon pour les chiffres et il est même possible de combiner chiffres et lettres [A-H0-7] si on s'attend à ce qu'il y ait soit une lettre soit un chiffre à cet emplacement.

    Au niveau des 2 premiers exemples ci dessus, nous testons si, après le 1er caractère 'o', il y a un caractère étant entre 'o' et 'u' dans l'alphabet. Au niveau du dernier exemple, nous testons si, après le caractère 'M', il y a soit un "i", soit un '1'.

    Il existe également plusieurs caractères spéciaux qui correspondent à des groupes de caractères plus larges dont :

    • '\s' : correspond à 1 ou plusieurs espace (peut importe que cela soit équivalent à un espace ou une tabulation
    • '\S' : correspond à 0 espaces
    • '\w' : correspond à 1 ou plusieurs chiffres ou lettres
    • '\W' : correspond à 0 chiffre ou lettre
    • '\d' : correspond à 1 ou plusieurs chiffres
    • '\D' : correspond à 0 chiffre

    Le début et la fin d'une chaîne

    Par exemple, Dans le cadre d'un nom propre, d'un nom de famille ou d'un prénom, on peut être amener à vouloir vérifier si le contenu de la variable contenant cette chaîne de caractères commence bien par une majuscule et termine bien par un minuscule. Le caractère '^' nous permet d'indiquer le début d'une chaîne de caractères alors que le '$' nous sera utile afin d'en spécifier la fin.  Ainsi, si je veux vérifier que "MicrosoftTouch" commence par une majuscule et termine par une minuscule, je ferai ceci :

    Attention : Le caractère '^' situé en plein milieu d'une regex correspond à la négation - cela signifie donc "ne contient pas"

    Echapper des caractères

    Avec tous les caractères spéciaux que nous avons vu jusqu'ici, vous vous demandez peut-être comment faire s'il on veut vérifier que notre chaîne de caractères dispose d'un '*' ou d'un '+' ou encore d'un '?'. Et bien il suffit d'échapper ce caractère avec '\'.

    Exemple final

    Afin de conclure cet article voici un petit exemple permettant de vérifier que le nom et le prénom commence bien par une majuscule, ainsi que de vérifier que l'adresse mail de l'utilisateur est valide et se termine bien par @microsofttouch.fr. Si le nom ou le prénom n'est pas valide on le corrige. Si le mail n'est pas valide on affiche un message au niveau de la console.

    function demoRegex() {
    $prenom = 'Sylver'
    $nom = 'schorgen'
    $mail = 'sschorgen@microsofttouch.fr'
    $matchNoms = '^[A-Z].[A-Za-z]+$'
    $matchMail = '^[a-z]+\.*\-*[a-z]*@microsofttouch.fr$'
    if(!($prenom -cmatch '^[A-Z].[A-Za-z]+$')) {
         $prenom = (Get-Culture).TextInfo.ToTitleCase($prenom)
         Write-Host "Le prénom a été corrigé"
    }
    if(!($nom -cmatch '^[A-Z].[A-Za-z]+$')) {
         $nom = (Get-Culture).TextInfo.ToTitleCase($nom)
         Write-Host "Le nom a été corrigé"
    }
    if(!($mail -match '^[a-z]+\.*\-*[a-z]*@microsofttouch.fr$')) {
         Write-Host "L'adresse mail n'est pas valide"
         Write-Host "L'adresse mail doit-être du type dutexte@microsofttouch.fr"
    }

    La fonction est également fourni en pièce jointe à cet article.