【问题标题】:Compile Powershell script into interpreted code将 Powershell 脚本编译为解释代码
【发布时间】:2021-10-10 20:08:19
【问题描述】:

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

假设我有这个脚本:

$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语句很多。

【问题讨论】:

    标签: powershell powershell-5.1


    【解决方案1】:

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

    在函数中获得逻辑后,您可以围绕该函数编写测试,以确保它按预期工作,并在通过时按预期失败无效条目等。

    PowerShell 有一个testing framework called Pester,对编写测试很有帮助。

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

    你的脚本应该变成:

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

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

    $secureCiphers | Set-MySecureCipher
    

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

    • 编写函数
    • 编写 PowerShell 模块
    • 编写 Pester 测试
    • 编写高级函数(接受管道输入,支持ShouldProcess 支持-WhatIf

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      相关资源
      最近更新 更多