3 votes

Attraper une clé d'identification d'activation après la première occurrence d'une chaîne de texte en utilisant Slmgr /dlv et Regex?

Slmgr /dlv donne une liste de licences sur n'importe quel ordinateur donné. L'un est pour le système d'exploitation, un est appelé une clé "ESU", il y en a d'autres en fonction de votre système. J'essaie de récupérer la première instance d'un ID d'activation qui vient après le texte "ESU", donc je ne récupère pas la clé d'activation du système d'exploitation ou une autre en fait.

Avec ce code, je pense qu'il récupère la deuxième instance de l'ID d'activation après le texte "ESU" ou il récupère simplement la mauvaise clé. Qu'est-ce que je fais de travers ? Merci d'avance.

$Slmgr = cscript.exe C:\Windows\system32\slmgr.vbs /dlv

switch -Regex ($slmgr | Out-String){'(?s)ESU.+Activation ID: (.+?)(?=\r?\n)'{

[PSCustomObject]@{

ActivationID = $Matches[1]
    }
  }
}

MISE À JOUR : Voici le résultat de slmgr /dlv ci-dessous. Il récupérait la première instance de l'ID d'activation de la clé du système d'exploitation, mais maintenant il récupère la bonne clé de la section ESU en utilisant (?s)ESU.+?Activation ID:\s*([^\r\n]+) ci-dessous dans les commentaires.

http://imgur.com/gallery/BIJcyqM

Mais, la sortie montre "Nom" et "Valeur", alors que j'ai juste besoin de ce numéro qui est obfusqué seul pour le traiter plus tard.

http://imgur.com/gallery/gVPMeHM

Mise à jour

Apparemment, sur certains systèmes $Slmgr est un tableau, pas une chaîne multiligne, donc -match ne fonctionne pas pour une regex multiligne.

J'ai essayé ceci, mais cela me donne beaucoup d'informations supplémentaires après la clé d'activation :

$Slmgr = cscript.exe C:\Windows\system32\slmgr.vbs /dlv
$Slmgr -match '(?s)ESU.+?Activation ID:\s*([^\r\n]+)'
$Slmgr -join "'r'n" -match '(?s)ESU.+?Activation ID:\s*([^\r\n]+)'
$ActivationID = $matches[1]

En regardant $ActivationID, il a effectivement la clé d'activation au début, puis il montre "'r'n" que j'ai dans mon code, puis beaucoup d'autres choses après comme des clés d'installation, des infos de certificat. Je pense que mon -join dans mon code est en train de déranger quelque chose.

Des idées sur ce que je fais de travers ou une meilleure façon d'accomplir ce que j'essaie de faire ?

0voto

Wiktor Stribiżew Points 100073

Vous pouvez le faire en utilisant

$slmgr = cscript.exe C:\Windows\system32\slmgr.vbs /dlv
$ActivationID = If ($slmgr -match '(?s)ESU.+?Activation ID:\s*([^\r\n]+)') {$matches[1]} Else {""}

Le regex (?s)ESU.+?Activation ID:\s*([^\r\n]+) correspond

  • (?s) - option RegexOptions.Singleline activée pour faire en sorte que . corresponde également aux sauts de ligne
  • ESU - un sous-chaîne ESU
  • .+? - un ou plusieurs caractères, avec le minimum possible
  • Activation ID: - une phrase littérale
  • \s* - zéro ou plusieurs espaces
  • ([^\r\n]+) - Groupe de capture 1: un ou plusieurs caractères autres que CR et LF.

Concernant la mise à jour, si votre entrée est un tableau et que vous avez besoin de la convertir en une chaîne, vous devez utiliser :

$slmgr = cscript.exe C:\Windows\system32\slmgr.vbs /dlv
$slmgrString = $slmgr -join "`r`n"
$ActivationID = If ($slmgrString -match '(?s)ESU.+?Activation ID:\s*([^\r\n]+)') {$matches[1]} Else {""}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X