[PowerShell] Découverte et personnalisation de PowerShell ISE

Bonjour à tous,

Apparu depuis maintenant quelques années, PowerShell est aujourd'hui incontournable. Pour ceux qui le découvrent, c'est un environnement d'exécution de tâches conçu spécialement pour l'administration des systèmes. Il repose entièrement sur .NET Framework et reprend les fondamentaux de la programmation orientée objet. Il permet aux administrateurs de contrôler et d'automatiser l'administration des systèmes d'exploitation Windows mais aussi de nombreux autres produits comme VMware, SCCM, Exchange, Azure, etc... Bref vous l'aurez compris, il vous sera de plus en plus compliqué de gérer vos environnements tout en ignorant ce composant !

Vous pouvez aborder PowerShell de 2 manières différentes :

  • En lançant la console PowerShell puis en exécutant des commandes comme par exemple dresser la liste de tous les processus actuellement en cours d'exécution (get-process). Après avoir récupéré cette liste vous pouvez stopper certains de ces processus à l'aide de la cmdlet Stop-Process. Dans ce mode de fonctionnement les commandes s'exécutent à votre grés. Aucune préparation n'est nécessaire. On travaille ici à la volée et le travail n'est pas réutilisable
  • En créant un script PowerShell qui prendra en charge l'exécution de nombreuses commandes que vous aurez reliées entre-elles à l'aide d'outils d'algorithmique tels que des conditions, des boucles, des filtres, etc. Ce scénario est particulièrement adapté lorsque vous devez exécuter la même procédure à de nombreuses reprises. L'idée est de décrire la marche à suivre dans ce script puis d'exécuter ce script chaque fois que ce "processus" doit être exécuté.

La rédaction d'un script PowerShell peut être réalisée avec un outil aussi simple que Notepad.exe. Cependant vous conviendrez que ce n'est pas l'outil le plus efficace car il ne permet par exemple pas de débugger ce script ou de bénéficier de coloration syntaxique bienvenue dans tout environnement de développement.

Dès la sortie de PowerShell Microsoft a intégré à Windows un éditeur de script : PowerShell ISE (Integrated Scripting Environment). Cet environnement vous permet de rédiger des scripts PowerShell tout en bénéficiant de nombreuses fonctionnalités :

  • IntelliSense qui vous proposera de compléter automatiquement ce que vous avez commencé à saisir
  • Des snippets ou extraits de code que vous pouvez insérer rapidement et ainsi réduire vos erreurs de saisie
  • Un enregistrement automatique de vos scripts toutes les 2 minutes (et croyez-moi c'est très utile !!)
  • Un debugger vous permettant d'exécuter tout ou partie de vos script en appliquant des points d'arrêt

Dans un premier temps cet environnement vous sera suffisant. Mais PowerShell ISE est un outil particulièrement personnalisable. C'est d'ailleurs son grand point fort. A tel point que plusieurs développeurs se sont "amusés" à ajouter des fonctionnalités supplémentaires qui peuvent être très utiles.

Cet article a pour objectifs de vous donner un aperçu de la personnalisation de l'éditeur PowerShell :

  • Dans un premier temps nous verrons qu'ISE est avant tout un environnement que nous chargeons qui est tout à fait personnalisable
  • Dans un second temps, nous nous focaliserons sur la création de nos propres snippets
  • Enfin je vous présenterai un Add-on permettant de littéralement doper votre ISE :  ISESteroids

Lire la suite

[PowerShell] Tester si un périphérique est connecté

Bonjour à tous,

Voici une fonction qui vous permettra de tester si un périphérique est connecté sur un poste de travail.
Cette fonction retourne les caractéristiques du périphérique si il est trouvé, sinon elle ne renvoie rien.
Le critère de recherche est un ID plug’n’play ou une liste d’IDs plug’n’play compatibles avec ce périphérique.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function Search-Device
{
    Param
    (
        [Parameter(Mandatory=$true,ValueFromPipeline=$false,Position=0)][String[]]$PnpIDs
    )
 
    $devices = $device = $FoundDevice = $null
 
    # On dresse la liste des pépriphériques connectés 
    $devices = Get-WmiObject -Class Win32_PnpEntity | Sort-Object -Property Caption
 
    # On cherche dans cette liste si un périphérique contient l'ID plug'n'play recherché
    foreach ($device in $devices)
    {
        # On construit la liste des IDs plug'n'play compatibles
        $CompatibleIDs = $null
        if ($device.HardwareID.Count -gt 0)
        {
            $CompatibleIDs = $device.HardwareID
        }
        if ($device.CompatibleID.Count -gt 0)
        {
            $CompatibleIDs += $device.CompatibleID
        }
 
        # On cherche l'ID plug'n'play parmi la liste 
        if ($CompatibleIDs -ne $null)
        {
            foreach ($PnpID in $PnpIDs)
            {
                if ($CompatibleIDs.Contains($PnpID) -eq $true)
                {
                    $FoundDevice = $device
                    break
                }
            }
        }
    }
 
    if ($FoundDevice -ne $null)
    {
        Write-host "Périphérique trouvé" -ForegroundColor Green
        Write-Output $FoundDevice
    }
    else 
    {
        Write-Host "Périphérique non trouvé" -ForegroundColor Yellow
        Write-Output $null
    }
}

Exemples d’utilisation :

1
$Device = Search-Device -PnpIDs @('PCI\VEN_8086&DEV_0166&REV_09','PCI\VEN_8086&CC_030000')

Enjoy 😉

[Windows 10] Obtenir la clé OEM stockée dans le BIOS

Bonjour à tous,

Voici une portion de code PowerShell vous permettant d’obtenir la clé OEM Windows de votre système. Cette fonction renvoie la clé si le BIOS contient une clé Windows sinon elle ne renvoie rien:

1
2
3
4
5
6
7
8
9
10
11
12
Function Get-OriginalProductKey
{
    $ProductKey = (Get-WmiObject -Class SoftwareLicensingService).OA3xOriginalProductKey
    if (-not [string]::IsNullOrEmpty($ProductKey))
    {
        Write-Output $ProductKey
    }
    else
    {
        Write-Output $null
    }
}

Plus globalement, la classe WMI SoftwareLicensingService expose les propriétés d’activation d’un produit ainsi que les méthodes et propriétés liées au Service d’activation (date de fin de grâce, méthode d’activation, etc.). Vous trouverez le détail de cette classe ici.

Dernière information, il semblerai que cette classe soit disponible à partir de Windows 7 / 2008 R2.

Enjoy 😉

[PowerShell] Tester si le compte qui exécute le script est administrateur

Bonjour à tous,

Voici une portion de code intéressante qui vous permettra d’améliorer la qualité générale de vos scripts, particulièrement lorsque ces derniers nécessitent des droits d’administration être exécutés convenablement :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try
{
    $User = [Security.Principal.WindowsIdentity]::GetCurrent()
    $Role = (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
    if(!$Role)
    {
        Throw "Le compte qui exécute ce script ne dispose pas de privilèges élevés"
    }
    Write-Host "Le compte dispose de privilèges élevés"
}
catch
{
    Write-Host $_.Exception.Message -ForegroundColor Red
}

Note : Ce test fonctionne dans toutes les langues.

Enjoy 😉