単純なレジストリ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リソースの両方でこれを試しましたが、同じ形式のエラーが発生しました(どちらを使用してもかまいません)。データを単一の文字列、文字列の配列、16進数であることを示すために0xが追加された文字列の配列などとして提供しようとしました。提案 ここ も試しました。
私が得た最も近いものは、以下の構成であり、これは機能しているように見えました。
Registry disableAdminShare {
Ensure = "Present"
Key = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\DefaultSecurity"
Force = $true
ValueName = "SrvsvcShareAdminConnect"
ValueData = @("010004806400000070000000000000001400000002005000030000000000180003000f00010200000000000520000000200200000000180003000f00010200000000000520000000250200000000180003000f0001020000000000052000000027020000010100000000000512000000010100000000000512000000")
ValueType = "Binary"
}
しかし、ログが適用されたときにログを見ると、値が10進数に変換されているようで、無効なエントリが生成されます。
'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
これを実行したServer2016とWindows10マシンの両方を見ると、レジストリは正しいように見えます。