首页 > 解决方案 > 使用 C# / .NetCore 签署 Powershellscript

问题描述

对于我的复杂系统,我正在寻找一种方法来签署 powershellscript,而不是使用powershell,而是使用C# / .NetCore

这里是Powershell版本:

$cert=Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
Set-AuthenticodeSignature -FilePath PsTestInternet2.ps1 -Certificate $cert

我当前的解决方案启动了一个Powershell控制台

process.start

为什么我要使用 C# 而不是 Powershell 签名?

  1. 我的系统是 Intranet 服务
  2. 用户可以从应用程序中的片段编译脚本并选择其他安装文件
  3. 现在脚本已使用安装文件进行签名并编译为 exe(C# 控制台项目 - 在运行时使用 dotnet 编译)
  4. 此 exe 可由用户控制(该 exe 具有检查更新的开关)
  5. 现在这个 exe(更新)通过 wsus 分发并到达用户计算机并使用脚本安装安装文件。

所有这些都是一个不错的系统,但如果我不必先保存脚本来签名它会更好

进程启动 => powershell

正如您在上面所读到的,我不是在找人来做我的作业,而是找一个有足够经验的人告诉我如何在不使用 powershellpipe 的情况下使用 C# 签署脚本。

非常感谢
最好的问候

标签: c#powershell.net-core

解决方案


既然投入了更多的时间,摸清了底层技术,我在 GitHub 上用微软的代码找到了解决方案。

到目前为止,stackoverflow 上还声称这是不可能的。

这是他们如何做到的 https://github.com/PowerShell/PowerShell/blob/d8f8f0a8bcbadb357f9eaafbb797278ebe07d7cc/src/System.Management.Automation/security/Authenticode.cs

在此文件中,您可以找到具有以下功能的 signaturehelper 类:

internal static Signature SignFile(SigningOption option,
                                           string fileName,
                                           X509Certificate2 certificate,
                                           string timeStampServerUrl,
                                           string hashAlgorithm)

对不起,如果有人介意,我很快就找到了解决方案。至少现在我已经分享过了。

编辑:

由于底层功能,文件仍然必须先保存。所以优势是微乎其微的。


推荐阅读