Question
Resolution du \"DigitalProductId\" via PowerShell
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 182
- Remerciements reçus 0
Suite à mon post \" Audit Server & Workstation \" j'aimerais y inclure la clé d'installation de Windows.
Pour cela, j'ai déjà trouvé comment localiser la valeur dans la base de registre avec la commande suivante :
[code:1](get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"«»).DigitalProductId[52..66][/code:1]
Les valeur \"52\" et \"66\" en base décimal sont les équivalent de \"34\" et \"42\".en base hexadécimal
De cette façon nous avons maintenant un tableau à une dimension sur lequel on cible les valeurs désirées ...
Reste plus qu'à appliquer l'algorithme cité par Maître Bellamy qu'on va trouver ICI mais pour cela, j'aurais besoin qu'on m'aide un tit peu ...
Pourriez-vous me mettre un peu sur la piste concernant les fonctions à utiliser et sans pour autant me fournir une solution toute faite (on apprend rien come ça ..)
Merci beaucoup d'avance pour vos suggestions !
Olivier
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Récupérer les données dans un tableau, puis inverser son contenu. Enfin, si j'ai bien compris ceci :Pourriez-vous me mettre un peu sur la piste concernant les fonctions à utiliser
Sous PS tu peux utiliser 0x34 qui indique un nombre hexa.C'est ce que l'on observe dans toutes entrées DigitalProductID,
la Raw Key étant stockée sur 15 octets, entre les offsets 0x34 à 0x42.
Ne pas oublier que dans les architectures \"Intel\" (et compatible), les grandeurs binaires sont représentées en \"Little Endian\", c'est à dire que les octets de poids faibles sont en tête.
Dans l'exemple ci-contre, la Raw Key est le nombre (en hexadécimal) 03D3FC979F6BA773C899DEA7EF6380
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 182
- Remerciements reçus 0
Voici le résultat inversé en prennant les valeur hexa ...
[code:1]$tab =(get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"«»).DigitalProductId[0x42..0x34]
$tab
[/code:1]
Donc, à partir de là, faut créer la moulinette pour faire la conversion et trouver le modulo (reste de division par 24 ...) et j'ai trouvé ça :
[code:1]$tab =(get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"«»).DigitalProductId[0x42..0x34]
for($i =0 ; $i -le 14 )
{
$tab[$i]%24
$i++
}[/code:1]
Et pi là je patauge un peu ...<br><br>Message édité par: Olivier, à: 7/02/09 21:42
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
J'étais parti sur autre chose :Merci pour l'info
[code:1]
[byte[]]$Rawkey=(get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"«»).DigitalProductId[0x32..0x42]
$RawKey
[system.array]::Reverse($RawKey)
$RawKey
[/code:1]
Comme quoi l'approche procédurale/Poo n'est pas tjrs la plus pertinente sous PS
Pour la suite ça part en sucette car tu ne suis pas l'algo donné :
Je verrais bien une fonction récursive sur ce coup là, mais je ne suis pas allé plus loin que la lecture de l'algoAvec de possibles variantes, l'algorithme est toujours le même :
On effectue une division euclidienne du nombre par 24.
Le reste obtenu est le chiffre en base 24 des unités.
Puis on recommence la division euclidienne sur le quotient,
et ainsi de suite, jusqu'à ce que le quotient soit nul.
Chaque reste est un chiffre de poids de plus en plus fort.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Olivier
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 182
- Remerciements reçus 0
Voilà, ça avance très doucement mais ça avance ...
Jusqu'à maintenant, on avait le résultat de la valeur recherchée en colonne et là, j'ai trouvé comme la faire afficher en ligne en excluant les espaces^
[code:1]$tab = -join (get-itemproperty -path registry::\"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"«»).DigitalProductId[0x42..0x34][/code:1]
Ce qui me donne maintenant la valeur recherché pour faire les calcul pour retrouver la clé ...
$tab (valeur trop secret
Par contre, pour retrouver le premier caractère, si j'ai bien compris, il faut trouver le modulo 24 de la valeur $tab avec :
[code:1]$tab%24[/code:1]
Après, il faudrait faire ($tab/24)%24 et après (($tab/24)/24)%24 et ainsi de suite ... en utilisant une fonction de division qui ne garde que le quotient [entier] ...
Une foi trouvé les restes des division, les faire correpondre avec un tableau comme ça :
[code:1]$comp = 'B','C','D','F','G','H','J','K','M','P','Q','R','T','V','W','X','Y','2','3','4','6','7','8','9'
$mod = 2 # Valeur à définir avec un modulo 24 de la valeur de $tab
$comp[$mod-1][/code:1]
Si quelqu'un peutx me donner un coup de main car en faisant le test comme sur le site à Mr. Bellamy ça fonctionne mais avec la valeur $tab, fonctionne pas ... nombre peut-être trop grand ...
Si vous avez quelques minutes pour m'aider à avancer
Merci déjà à tous ceux qui m'ont lu et donné réponse !!!
Olivier<br><br>Message édité par: Olivier, à: 7/02/09 15:58
Connexion ou Créer un compte pour participer à la conversation.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
- Messages : 576
- Remerciements reçus 0
En effet, la commandelette get-itemproperty ... renvoie une liste de nombres décimaux. Par exemple:
5
103
27
48
...
Les accoler comme tu le fais ne donne absolument pas le nombre exact:
[code:1]
PS> -join (5,103,27,48)
51032748
[/code:1]
Tu vois bien que le résultat n'est pas bon. Cette opération -join ne marcherait que si get-itemproperty te renvoyait des nombres au format hexadécimal formatté sur deux chiffres, ce qui n'est pas le cas.
Tu pourrais forcer la conversion en hexa assez facilement, mais après il te faudra assurer une conversion de base 16 vers base 24. Faisable, mais pas forcément évident.
Tu pourrais aussi faire un vrai \"join\" prenant en compte le poids de chaque nombre renvoyé par get-itemproperty. Quelque chose dans le genre de:
[code:1]
$rank = $sum = 0
$tab | foreach {
$sum += $_ * [System.Math]::«»Pow(256,$rank)
$rank++
}
[/code:1]
Au final, $sum doit contenir la bonne valeur, à laquelle appliquer la série de divisions par 24 pour arriver au Product ID.
Ah oui, attention: ma lecture de $tab suppose que j'ai les chiffres de poids faible en premier, or je crois que c'est l'inverse dans ton début de script. A vérifier en tout cas (si c'est le cas, il est facile d'énumérer $tab dans le sens inverse).
Bon courage. Je retourne me coucher...
Janel
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Resolution du "DigitalProductId" via PowerShell