【问题标题】:Checking if a file is signed using a Powershell script on Linux检查文件是否在 Linux 上使用 Powershell 脚本签名
【发布时间】:2020-09-16 21:34:41
【问题描述】:

我编写了一个简单的 Powershell 脚本,如果文件未签名,则会引发错误:

[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
$fileSignature = Get-AuthenticodeSignature -FilePath <file that I want to check>
if ($fileSignature.Status -eq "NotSigned")
{
    throw "File is unsigned"
}

这在 Windows 上运行良好,但我需要将脚本移植到 Linux 上运行。我仍然可以在那里使用 Powershell,但尚未为 Linux 实现 Get-AuthenticodeSignature。有什么替代方法可以用来执行相同的测试吗?

【问题讨论】:

    标签: linux powershell signing


    【解决方案1】:

    首先,您使用的是两种不同的 PowerShell 环境。

    1. Windows 上的 Windows PowerShell。 (powershell.exe/powershel_ise.exe) - 完整的.Net
    2. Linux/OSX 上的 PowerShell 核心。 (pwsh.exe) - .Net 核心

    正如您所发现的,可用的 cmdlet 是特定于 PowerShell 版本的。任何需要完整 .Net 的 cmdlet(嗯,任何东西)在 Windows 之外都将不可用。

    您不应该以这种方式检查此状态。 PowerShell 提供了一种强制使用签名的内置方法。这就是 ExecutionPolciy 设置的用途。默认情况下,在 PowerShell 上安装的 EP 是 RemoteSigned,因此无论是否签名的本地脚本都会运行。

    如果您想始终强制执行签名脚本,请以这种方式设置 EP。

    Set-ExecutionPolicy -ExecutionPolicy AllSigned

    全签名

    脚本可以运行。

    要求所有脚本和配置文件由 受信任的发布者,包括您在本地编写的脚本 计算机。在运行来自您的发布者的脚本之前提示您 尚未归类为受信任或不受信任。风险运行签署, 但恶意脚本。

    在需要的范围内设置它

    MachinePolicy、UserPolicy、Process、CurrentUser 或 LocalMachine

    about_Execution_Policies - PowerShell | Microsoft Docs

    Get-ExecutionPolicy (Microsoft.PowerShell.Security

    Set-ExecutionPolicy (Microsoft.PowerShell.Security

    通过强制执行“AllSigned”策略,您可以对文件夹中的所有脚本文件运行循环并尝试运行它们,而那些没有签名的文件将会失败。因此,只需使用 try/catch 来报告这些情况。

    【讨论】:

    • 在这种情况下,我不希望将检查应用于脚本,我希望将其应用于可能无法运行的任意文件。我在部署期间将此脚本用作验证检查的一部分,以通过导入候选文件并对其进行测试来测试特定构建是否已签名。
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2017-02-20
    • 2010-10-16
    相关资源
    最近更新 更多