1

如果我写错了标题,请原谅我,但这是我要找的:

假设我有这个脚本:

$secureCiphers = @(
  'AES 128/128',
  'AES 256/256'
)
foreach ($secureCipher in $secureCiphers) {
    $key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey($secureCipher)
    New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\$secureCipher" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force | Out-Null
    $key.close()
    Write-Host "Strong cipher $secureCipher has been enabled."
}

有没有什么东西可以展开循环,为每次迭代进行分配,并说上面的代码相当于:

$key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey('AES 128/128')
New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 128/128" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force | Out-Null
$key.close()
Write-Host "Strong cipher AES 128/128 has been enabled."


$key = (Get-Item HKLM:\).OpenSubKey('SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers', $true).CreateSubKey('AES 256/256')
New-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\AES 256/256" -name 'Enabled' -value '0xffffffff' -PropertyType 'DWord' -Force | Out-Null
$key.close()
Write-Host "Strong cipher AES 256/256 has been enabled."

然后我可以编写一个自动化测试来说明脚本应该设置这些注册表项,并且系统具有这些注册表项的预期值。这个要求有意义吗?脚本比较复杂,有函数和很多 if-else 语句。

4

1 回答 1

1

相反,我认为可能更好地为您服务的是将您尝试执行的操作的逻辑抽象为函数(最好在模块中),这些函数为发生变化的事物提供参数。因此,在这种情况下,您将拥有一个函数,该函数采用特定的“安全密码”并执行它需要执行的操作。

一旦你在函数中获得了逻辑,你就可以围绕函数编写测试,以确保它按预期工作,当传递无效条目时它会按预期失败,等等。

PowerShell 有一个名为 Pester 的测试框架,它有助于编写测试。

现在你已经有了可重用的功能,并通过测试证明它有效。

你的脚本应该变成:

$secureCiphers = @(
  'AES 128/128',
  'AES 256/256'
)
foreach ($secureCipher in $secureCiphers) {
  Set-MySecureCipher -Cipher $secureCipher
}

或者,如果您编写的函数能够接受管道输入,它可能是:

$secureCiphers | Set-MySecureCipher

我省略了很多细节,以便在高层次上进行解释,但您可以继续研究这些领域中的每一个:

  • 编写函数
  • 编写 PowerShell 模块
  • 编写 Pester 测试
  • 编写高级函数(接受管道输入,支持ShouldProcess支持-WhatIf
于 2021-08-05T20:19:48.320 回答