Comment définir une valeur de registre binaire (REG_BINARY) avec PowerShell?
Contexte:
J'ai besoin de modifier certaines propriétés du service d'état ASP.NET à l'aide d'un script PowerShell. Malheureusement, l'applet de commande PowerShell intégrée Set-Service
vous permet uniquement de modifier la description du service, le type de démarrage, le nom d'affichage et l'état. Je dois modifier le Subsequent failures
propriété trouvée sur l'onglet Récupération (lors de l'affichage des propriétés du service). J'ai trouvé que cette valeur était stockée dans le registre en tant que valeur REG_BINARY.
Une exportation de la valeur ressemble à ceci:
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\aspnet_state]
"FailureActions"=hex:50,33,01,00,00,00,00,00,00,00,00,00,03,00,00,00,0e,00,00,\
00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00
À Powershell, il y a Set-ItemProperty
applet de commande avec laquelle vous pouvez définir des valeurs de valeur de registre. Pour une chaîne ou une valeur dword, vous pouvez simplement passer une chaîne ou un entier. Je sais quelle valeur hexadécimale dans le tableau changer, mais je ne sais pas comment définir une valeur binaire.
La ligne suivante vous donne un exemple comment en créer un
New-ItemProperty -Path . -Name Test -PropertyType Binary -Value ([byte[]](0x30,0x31,0xFF))
et comment changer un existant:
Set-ItemProperty -Path . -Name Test -Value ([byte[]](0x33,0x32,0xFF))
Ce message m'a aidé avec un problème similaire. Merci!
Rassembler les réponses de xBr0k3n et Howard:
#Change these three to match up to the extracted registry data and run as Admin
$YourInput = "50,33,01,00,00,00,00,00,00,00,00,00,03,00,00,00,0e,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00"
$RegPath = 'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\aspnet_state'
$AttrName = "FailureActions"
$hexified = $YourInput.Split(',') | % { "0x$_"}
New-ItemProperty -Path $RegPath -Name $AttrName -PropertyType Binary -Value ([byte[]]$hexified)
Est-ce juste moi qui pense que cela manque la partie principale de cette question?
Comment changeriez-vous l'original:
50,33,01,00,00,00,00,00,00,00,00,00,03,00,00,00,0e,00,00,\
00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00
Dans un format comme:
([byte[]](0x33,0x32,0xFF))
EDIT: Après avoir essayé de faire fonctionner cela, il s'avère que vous préfixez toutes les paires avec "0x". Je ne sais pas pourquoi cela n'a pas été mentionné dans la réponse. Il suffit donc de changer ce qui précède pour:
0x50,0x33,0x01,0x00,0x00,0x00,0x00,0x00... etc.
Enveloppez ensuite cela dans ce qui suit:
([byte[]](0x50,0x33,0x01,0x00,0x00,0x00,0x00,0x00... etc.))
Pour info, vous pouvez également définir des valeurs binaires avec le module PSRemoteRegistry PowerShell ( http://psremoteregistry.codeplex.com/ ), sur des ordinateurs locaux ou distants.
$Key = 'SOFTWARE\MyCompany'
Set-RegBinary -Hive LocalMachine -ComputerName Server1 -Key $Key -Value RegBinary -Data @([char[]]'PowerShell')
Commençons par un entier:
$int = 0xffffffff
Obtenez les octets:
$bytes = [bitconverter]::GetBytes($int)
Utilisation de set-itemproperty avec le paramètre '-type' peu connu qui peut être utilisé avec les chemins de registre:
Set-ItemProperty hkcu:\key1 bin1 $bytes -type binary
Récupérer:
$bytes = Get-ItemProperty hkcu:\key1 bin1 | % bin1
Transformez 4 octets en entier:
$int = [bitconverter]::toint32($bytes, 0)
'0x{0:x}' -f $int
0xffffffff