Mon premier script PoSh avec “PrimalForms”

Devez-vous vraiment installer un VPN sur votre ordinateur ou votre smartphone?

Si vous téléchargez des films illégalement, si vous voulez surfer sur Internet de façon anonyme sans que le gouvernement, votre FAI ou votre employeur soit au courant ... OUI installer un VPN est définitivement une bonne idée.

Installer un VPN consiste à chiffrer toutes vos communications vers Internet. Ce n'est plus votre ordinateur qui est exposé sur Internet mais votre fournisseur de VPN.

Anonymat NordVPN

Après ma découverte de PrimalForms, j’ai eu envie d’en savoir un peu plus et donc de tester un peu le produit. J’en ai profité pour faire un tutoriel pour montrer un peu les possibilités de ce logiciel.

Évidement, il faut installer PrimalForms. Rendez-vous sur le site de SAPIEN Technologies pour le télécharger. L’installation en elle même s’effectue sans problème.

Nous allons faire un petit soft (un script en réalité) sans prétention qui va juste lister les membres d’un groupe locale sur l’ordinateur courant. Nous allons voir que le bout de code dédier au listage des membres à proprement parlé est tout petit comparé à tout le code nécessaire pour générer le formulaire. C’est là que nous nous rendons compte finalement de l’utilité d’un tel logiciel. Bon, si vous êtes prêt, on y va !

1 – Création du formulaire

Lancer PrimalForms. Dans la partie gauche de la fenêtre se trouve les contrôles. Se sont les “objets” à placer sur le formulaire (champs de saisie, bouton, liste de choix …). Dans la partie du milieu se trouve le formulaire. C’est là que nous plaçons par glissé-déplacé les contrôles dont nous avons besoin. Dans la partie de droite se trouve les propriétés associées à chacun des contrôles et aussi de l’objet formulaire.

Nous allons avoir besoin des contrôles suivants : 1 label, 1 textBox, 1 button et 1 richTextBox.

Nous utiliserons le “textBox” pour saisir le nom du groupe dont on souhaite lister les membres, le “button” pour lancer le recherche et enfin le “richTextBox” pour afficher le résultat.

Placer les contrôles sur le formulaire afin d’obtenir quelque chose qui ressemble à ça (en mode création) :

Après avoir modifié les propriétés (dans la partie à droite de la fenêtre) de chacun des contrôles comme indiqué ci-dessous :

Pour “form1” :  Text : Et les membres sont …

Pour “button1” :  Text : Va chercher !

Pour “label1” :  Text : Nom du groupe

Pour “richTextBox1” :  ScrollBars : Vertical

Ceci étant fait, on enregistre notre boulot à l’aide du bouton SaveAs, pour sauvegarder notre projet, puis on clique sur Export PowerShell pour enregistrer le script que génère PrimalForms.

2 – Ajout des actions

Ouvrez le script généré par PrimalForms avec votre éditeur préféré.Vous devriez vous retrouver avec un script qui fait environ 125 ligne. Hé oui, quand même ! Y nous a bien aidé le PrimalForms !

Si on prend le temps de détailler un peu, on voit que le code n’est pas mal fait et ne contient rien de futile. On remarquera vers la ligne 29 le commentaire suivant :

#TODO: Place custom script here

Oui, c’est bien là que nous allons placer notre bout de code à nous (bon, qu’on a pompé sur le Net…)

Donc on fait une petite recherche sur le Net “powershell Listing local group members” via Google et hop ! en 2ème position on trouve notre bonheur avec le bout de code suivant :

$group =[ADSI]"WinNT://./Administrators"
$members = @($group.psbase.Invoke("Members"))
$members | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}

Il ne nous reste plus qu’à l’adapter pour l’intégrer dans notre formulaire et déclencher l’action en fonction du groupe indiqué.

En regardant le code de notre formulaire, aux alentours des lignes 14 à 21, on peut noter le nom des variables objets utilisés. On voit que le champs de saisie du nom du groupe à pour nom de variable $textBox1. Il nous faut donc récupérer le contenu de cet objet pour provoquer la cherche l’aide de la propriété .text de cet objet. La première ligne du bout code que l’on va insérer va commencer comme ça :

$GroupName = [string]$textBox1.text

Quand on va cliquer sur “Va chercher !$GroupName va prendre pour valeur le contenu de $textBox1 converti en chaine de caractère grâce à [String].

Ensuite nous devons modifier la ligne du code “$group =[ADSI]”WinNT://./Administrators”” pour que “Administrators” soit remplacé par notre recherche à nous. On obtiendra une ligne de code comme suit :

$group =[ADSI]"WinNT://./$GroupName"

On a pas besoin de modifier la ligne $members = @($group.psbase.Invoke(“Members”)) on la laisse telle quelle.

Enfin, pour finir il faut que la sortie de notre code se fasse dans la zone prévue à cet effet, le $richTextBox1. On va donc modifier la dernière ligne du bout code qu’on a trouvé pour obtenir le résultat attendu comme suit (notez le petit “+`n” à la fin de ligne qui va gérer le retour chariot) :

foreach ($mem in $members) {
$richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
}

Au final on doit donc obtenir le code suivant :

$GroupName = [string]$textBox1.text
$group =[ADSI]"WinNT://./$GroupName"
$members = @($group.psbase.Invoke("Members"))
foreach ($mem in $members) {
$richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
}

Il ne nous reste plus qu’à le coller tout ça dans le code de notre formulaire (au niveau de la ligne 30 dans mon cas)

29 | #TODO: Place custom script here
30 |   LE CODE DOIT ÊTRE COLLE ICI
31 | }

On doit donc obtenir ça :

29 | #TODO: Place custom script here
30 | $GroupName = [string]$textBox1.text
31 | $group =[ADSI]"WinNT://./$GroupName"
32 | $members = @($group.psbase.Invoke("Members"))
33 | foreach ($mem in $members) {
34 |     $richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
35 | }
36 | }

Enregistrez puis exécutez votre code comme vous en avez l’habitude. Si vous faites l’essai sur le groupe “Administrateurs” vous devriez, en principe, obtenir un résultat.

Si vous cliquez sur “Va chercher !” alors que le champs “Nom du groupe” est vide, il va nous générer une erreur … que nous devons, en bon scripteur, gérer.

#TODO: Place custom script here
$GroupName = [string]$textBox1.text
If (!$GroupName) {$richTextBox1.text = "Le champs Nom du groupe ne peut être null"}
Else {
    $richTextBox1.text = ""
    $group =[ADSI]"WinNT://./$GroupName"
    $members = @($group.psbase.Invoke("Members"))
    foreach ($mem in $members) {
        $richTextBox1.text += $mem.GetType().InvokeMember("Name", 'GetProperty', $null, $mem, $null)+"`n"
    } # Fin du bloc ForEach
} # Fin du bloc Else
} # Fin de la procédure $button1_OnClick (TODO ...)

3 – Conclusion

Bon, rien de vraiment compliqué pour qui est à l’aise avec le scripting. En fait, on arriverai presque à le comparer au HTA (en [beaucoup] mieux quand même !). Au début j’ai cherché un peu pour récupérer le contenu de ma variable $textBox1. Mais après je me suis sentie assez vite à l’aise. Reste plus qu’à trouver un équivalent à VBS2EXE pour avoir un semblant de “redistribuable”. Intéressant pour un gars comme moi qui doit proposer et développer des solutions “cadrés” d’industrialisation de processus …

1 réflexion au sujet de « Mon premier script PoSh avec “PrimalForms” »

Laisser un commentaire

Cliquez ici pour révoquer votre décision.