То, что должно быть простой конфигурацией реестра DSC, превратилось в несколько досадную догадку. Я пытаюсь установить двоичный ключ реестра. Я нахожу невозможным найти правильный формат для данных значения, чтобы правильно установить ключ. Я пытаюсь преобразовать этот файл реестра в DSC:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\DefaultSecurity]
"SrvsvcShareAdminConnect"=hex:01,00,04,80,64,00,00,00,70,00,00,00,00,00,00,00,\
14,00,00,00,02,00,50,00,03,00,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,\
00,00,05,20,00,00,00,20,02,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,00,\
00,05,20,00,00,00,25,02,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,00,00,\
05,20,00,00,00,27,02,00,00,01,01,00,00,00,00,00,05,12,00,00,00,01,01,00,00,\
00,00,00,05,12,00,00,00
Я пробовал это как с реестром, так и с ресурсом xregistry и обнаружил ту же ошибку формата (я действительно не возражаю, что использую). Я попытался предоставить данные в виде одной строки, массива строк, массива строк с добавлением 0x, чтобы показать, что он шестнадцатеричный и т. Д. Я пробовал это предложение Вот также.
Самое близкое, что я получил, - это конфигурация ниже, которая, похоже, работает:
Registry disableAdminShare {
Ensure = "Present"
Key = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\DefaultSecurity"
Force = $true
ValueName = "SrvsvcShareAdminConnect"
ValueData = @("010004806400000070000000000000001400000002005000030000000000180003000f00010200000000000520000000200200000000180003000f00010200000000000520000000250200000000180003000f0001020000000000052000000027020000010100000000000512000000010100000000000512000000")
ValueType = "Binary"
}
Но глядя на журнал, когда он применяется, кажется, что значение преобразуется в Decimal, что приводит к недопустимой записи:
'HKLM:\SYSTEM\CurrentControlSet\Services\lanmanserver\DefaultSecurity\SrvsvcSha
reAdminConnect' to '(1, 0, 4, 128, 100, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 20,
0, 0, 0, 2, 0, 80, 0, 3, 0, 0, 0, 0, 0, 24, 0, 3, 0, 15, 0, 1, 2, 0, 0, 0, 0,
0, 5, 32, 0, 0, 0, 32, 2, 0, 0, 0, 0, 24, 0, 3, 0, 15, 0, 1, 2, 0, 0, 0, 0, 0,
5, 32, 0, 0, 0, 37, 2, 0, 0, 0, 0, 24, 0, 3, 0, 15, 0, 1, 2, 0, 0, 0, 0, 0, 5,
32, 0, 0, 0, 39, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0, 1, 1, 0, 0, 0,
0, 0, 5, 18, 0, 0, 0)' of type 'Binary'
VERBOSE: [SCDEV-RD-02]: LCM: [ End Set ]
Я уверен, что на этот вопрос есть простой ответ, но я не могу найти ничего в документации.
Формат DSC MSFT_Registry
Двоичный тип ValueData
представляет собой строку с непрерывными парами байтовых значений с необязательным ведущим "0x"
Уловка заключается в следующем фрагменте кода из ресурса в $ env: windir \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ PSDesiredStateConfiguration \ DSCResources \ MSFT_Registry.psm1.
Он анализирует значение с помощью:
$binaryVal = $null
$val = $Data[0].TrimStart("0x")
if ($val.Length % 2 -ne 0)
{
$val = $val.PadLeft($val.Length+1, "0")
}
try
{
$byteArray = [Byte[]]@()
for ($i = 0 ; $i -lt ($val.Length-1) ; $i = $i+2)
{
$byteArray += [Byte]::Parse($val.Substring($i, 2), "HexNumber")
}
$ReturnValue.Value = [Byte[]]$byteArray
}
пример
Используя небольшое изменение ваших входных данных:
$reg = "01,00,04,80,64,00,00,00,70,00,00,00,00,00,00,00,
14,00,00,00,02,00,50,00,03,00,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,
00,00,05,20,00,00,00,20,02,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,00,
00,05,20,00,00,00,25,02,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,00,00,
05,20,00,00,00,27,02,00,00,01,01,00,00,00,00,00,05,12,00,00,00,01,01,00,00,
00,00,00,05,12,00,00,00"
Вы можете создать правильно отформатированную строку с помощью этого:
$val = [String]::Join("",$reg.Split(",").Trim())
В MOF вы увидите это:
ValueData = {
"010004806400000070000000000000001400000002005000030000000000180003000f00010200000000000520000000200200000000180003000f00010200000000000520000000250200000000180003000f0001020000000000052000000027020000010100000000000512000000010100000000000512000000"
};
Вот полный тестовый образец, чтобы доказать это:
$reg = "01,00,04,80,64,00,00,00,70,00,00,00,00,00,00,00,
14,00,00,00,02,00,50,00,03,00,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,
00,00,05,20,00,00,00,20,02,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,00,
00,05,20,00,00,00,25,02,00,00,00,00,18,00,03,00,0f,00,01,02,00,00,00,00,00,
05,20,00,00,00,27,02,00,00,01,01,00,00,00,00,00,05,12,00,00,00,01,01,00,00,
00,00,00,05,12,00,00,00"
$val = [String]::Join("",$reg.Split(",").Trim())
Configuration RegistryTest
{
param([string] $Path, [string] $Name, [string] $BinaryValue)
Import-DscResource -ModuleName PSDesiredStateConfiguration
Registry test
{
Key = $Path
ValueName = $Name
ValueData = $val
ValueType = "Binary"
}
}
$args = @{
Path = "HKLM:\SOFTWARE\StackOverflow"
Name = "BinaryTest"
}
Remove-ItemProperty @args
Get-ItemProperty @args -ErrorAction Continue # Nothing up my sleeve!
$o = RegistryTest @args -BinaryValue $val -outputpath $env:temp
Start-DscConfiguration ($o | split-path) -Wait -Verbose -force
Get-ItemProperty @args
Это приводит к следующему выводу:
Get-ItemProperty : Property BinaryTest does not exist at path
HKEY_LOCAL_MACHINE\SOFTWARE\StackOverflow.
At C:\scratch\test.ps1:30 char:1
+ Get-ItemProperty @args -ErrorAction Continue # Nothing up my sleeve!
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (BinaryTest:String) [Get-ItemProperty], PSArgu
mentException
+ FullyQualifiedErrorId : System.Management.Automation.PSArgumentException,Microsoft.Powe
rShell.Commands.GetItemPropertyCommand
VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendCo
nfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microso
ft/Windows/DesiredStateConfiguration'.
VERBOSE: An LCM method call arrived from computer STACKOVERFLOW with user sid S-...
VERBOSE: [STACKOVERFLOW]: LCM: [ Start Set ]
VERBOSE: [STACKOVERFLOW]: LCM: [ Start Resource ] [[Registry]test]
VERBOSE: [STACKOVERFLOW]: LCM: [ Start Test ] [[Registry]test]
VERBOSE: [STACKOVERFLOW]: [[Registry]test] Registry key value 'HKLM:\SOFTW
ARE\StackOverflow\BinaryTest' does not exist
VERBOSE: [STACKOVERFLOW]: LCM: [ End Test ] [[Registry]test] in 0.2130 seconds.
VERBOSE: [STACKOVERFLOW]: LCM: [ Start Set ] [[Registry]test]
VERBOSE: [STACKOVERFLOW]: [[Registry]test] (SET) Set registry key value 'H
KLM:\SOFTWARE\StackOverflow\BinaryTest' to '(1, 0, 4, 128, 100, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0,
0, 20, 0, 0, 0, 2, 0, 80, 0, 3, 0, 0, 0, 0, 0, 24, 0, 3, 0, 15, 0, 1, 2, 0, 0, 0, 0, 0, 5, 32,
0, 0, 0, 32, 2, 0, 0, 0, 0, 24, 0, 3, 0, 15, 0, 1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 37, 2, 0,
0, 0, 0, 24, 0, 3, 0, 15, 0, 1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 39, 2, 0, 0, 1, 1, 0, 0, 0,
0, 0, 5, 18, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0)' of type 'Binary'
VERBOSE: [STACKOVERFLOW]: LCM: [ End Set ] [[Registry]test] in 0.1390 seconds.
VERBOSE: [STACKOVERFLOW]: LCM: [ End Resource ] [[Registry]test]
VERBOSE: [STACKOVERFLOW]: LCM: [ End Set ]
VERBOSE: [STACKOVERFLOW]: LCM: [ End Set ] in 0.7010 seconds.
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Time taken for configuration job to complete is 0.799 seconds
BinaryTest : {1, 0, 4, 128...}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\StackOverflow
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
PSChildName : StackOverflow
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Если посмотреть на сервер Server 2016 и компьютер с Windows 10, на котором я запускал это, реестр выглядит правильно.