Set-AuthenticodeSignature

Authenticode 签名添加到 PowerShell 脚本或其他文件。

语法

Set-AuthenticodeSignature
   [-Certificate] <X509Certificate2>
   [-IncludeChain <String>]
   [-TimestampServer <String>]
   [-HashAlgorithm <String>]
   [-Force]
   [-FilePath] <String[]>
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]
Set-AuthenticodeSignature
   [-Certificate] <X509Certificate2>
   [-IncludeChain <String>]
   [-TimestampServer <String>]
   [-HashAlgorithm <String>]
   [-Force]
   -LiteralPath <String[]>
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]
Set-AuthenticodeSignature
   [-Certificate] <X509Certificate2>
   [-IncludeChain <String>]
   [-TimestampServer <String>]
   [-HashAlgorithm <String>]
   [-Force]
   -SourcePathOrExtension <String[]>
   -Content <Byte[]>
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]

说明

此 cmdlet 仅在 Windows 平台上可用。

cmdlet 将 Set-AuthenticodeSignature Authenticode 签名添加到支持使用者接口包 (SIP) 的任何文件。

在 PowerShell 脚本文件中,签名采用文本块的形式,该块指示脚本中执行的指令的结尾。 如果在此 cmdlet 运行时文件中有签名,则该签名被删除。

示例

示例 1 - 使用本地证书存储中的证书对脚本进行签名

这些命令从 PowerShell 证书提供程序检索代码签名证书,并使用它对 PowerShell 脚本进行签名。

$cert=Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
$signingParameters = @{
    FilePath      = 'PsTestInternet2.ps1'
    Certificate   = $cert
    HashAlgorithm = 'SHA256'
}
Set-AuthenticodeSignature @signingParameters

第一个命令使用 Get-ChildItem cmdlet 和 PowerShell 证书提供程序获取证书 Cert:\CurrentUser\My 存储的子目录中的证书。 驱动器 Cert: 是由证书提供程序公开的驱动器。 仅受证书提供程序支持的 CodeSigningCert 参数将检索到的证书限制为具有代码签名权限的证书。 命令将结果存储在 变量中 $cert

第二个命令将$signingParameters变量定义为 HashTable,其中包含 cmdlet 用于对脚本进行签名PSTestInternet2.ps1的参数Set-AuthenticodeSignature。 它使用 FilePath 参数指定脚本的名称, 使用 Certificate 参数指定证书存储在变量中 $cert ,并使用 HashAlgorithm 参数将哈希算法设置为 SHA256。

第三个命令通过 Splalatting 中 $signingParameters定义的参数对脚本进行签名。

注意

CodeSigningCert 参数与 Get-ChildItem 仅返回具有代码签名机构且包含私钥的证书。 如果没有私钥,则证书不能用于签名。

示例 2 - 使用 PFX 文件中的证书对脚本进行签名

这些命令使用 Get-PfxCertificate cmdlet 加载代码签名证书。 然后,使用它对 PowerShell 脚本进行签名。

$cert = Get-PfxCertificate -FilePath C:\Test\Mysign.pfx
$signingParameters = @{
    FilePath      = 'ServerProps.ps1'
    Certificate   = $cert
    HashAlgorithm = 'SHA256'
}
Set-AuthenticodeSignature @signingParameters

第一个命令使用 Get-PfxCertificate cmdlet 将 C:\Test\MySign.pfx 证书加载到 变量中 $cert

第二个命令将$signingParameters变量定义为 HashTable,其中包含 cmdlet 用于对脚本进行签名ServerProps.ps1的参数Set-AuthenticodeSignature。 它使用 FilePath 参数指定脚本的名称, 使用 Certificate 参数指定证书存储在变量中 $cert ,并使用 HashAlgorithm 参数将哈希算法设置为 SHA256。

第三个命令通过 Splalatting 中 $signingParameters定义的参数对脚本进行签名。

如果证书文件受密码保护,PowerShell 会提示你输入密码。

示例 3 - 添加包含根颁发机构的签名

此命令添加数字签名,它包括信任链中的根证书颁发机构,并由第三方时间戳服务器对其进行签名。

$signingParameters = @{
    FilePath      = 'C:\scripts\Remodel.ps1'
    Certificate   = $cert
    HashAlgorithm = 'SHA256'
    IncludeChain  = 'All'
    TimestampServer = 'http://timestamp.fabrikam.com/scripts/timstamper.dll'
}
Set-AuthenticodeSignature @signingParameters

第一个命令将 $signingParameters 变量定义为 HashTable, 其中包含用于对脚本进行签名的 Set-AuthenticodeSignature cmdlet 的参数。 它使用 FilePath 参数指定脚本的路径, 使用 Certificate 参数指定证书存储在变量中 $cert ,并使用 HashAlgorithm 参数将哈希算法设置为 SHA256。 它使用 IncludeChain 参数来包括信任链中的所有签名,包括根颁发机构。 它还使用 TimeStampServer 参数向签名添加时间戳。 这会阻止脚本在证书过期时失败。

第二个命令通过 splalas 中定义的 $signingParameters参数对脚本进行签名。

参数

-Certificate

指定将用来对脚本或文件进行签名的证书。 输入存储对象的变量,该对象表示证书或获取证书的表达式。

若要查找证书,请在Get-PfxCertificate证书Cert:驱动器中使用或使用该 Get-ChildItem cmdlet。 如果证书无效或没有 code-signing 权限,则命令将失败。

Type:X509Certificate2
Position:1
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Confirm

提示你在运行 cmdlet 之前进行确认。

Type:SwitchParameter
Aliases:cf
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Content

此参数显示在语法列表中,因为它是在派生自的基类 Set-AuthenticodeSignature 中定义的。 但是,在 中 Set-AuthenticodeSignature未实现对此参数的支持。

Type:Byte[]
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-FilePath

指定正进行签名的文件的路径。

Type:String[]
Position:1
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-Force

允许该 cmdlet 将签名追加到只读文件。 即使使用 Force 参数,cmdlet 也无法覆盖安全限制。

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-HashAlgorithm

指定 Windows 用来计算文件的数字签名的哈希算法。

默认值为 SHA1。 使用不同的哈希算法进行签名的文件可能无法在其他系统上识别。 支持哪些算法取决于操作系统的版本。

有关可能值的列表,请参阅 HashAlgorithmName 结构

Type:String
Position:Named
Default value:Null
Accept pipeline input:False
Accept wildcard characters:False

-IncludeChain

确定证书信任链中的哪些证书包含在数字签名中。 默认为 NotRoot

有效值是:

  • 签名者:仅包括签名者的证书。
  • NotRoot:包括证书链中的所有证书,根颁发机构除外。
  • All:包括证书链中的所有证书。
Type:String
Position:Named
Default value:NotRoot
Accept pipeline input:False
Accept wildcard characters:False

-LiteralPath

指定正进行签名的文件的路径。 与 FilePath 不同,LiteralPath 参数的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包括转义符,请将其括在单引号中。 单引号告知 PowerShell 不要将任何字符解释为转义序列。

Type:String[]
Aliases:PSPath
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-SourcePathOrExtension

此参数显示在语法列表中,因为它是在派生自的基类 Set-AuthenticodeSignature 中定义的。 但是,在 中 Set-AuthenticodeSignature未实现对此参数的支持。

Type:String[]
Position:Named
Default value:None
Accept pipeline input:True
Accept wildcard characters:False

-TimestampServer

使用指定的时间戳服务器将时间戳添加到签名。 以字符串的形式键入时间戳服务器的 URL。

时间戳表示将证书添加到文件的确切时间。 如果证书过期,时间戳可阻止脚本失败,因为用户和程序可以验证在签名时证书有效。

Type:String
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-WhatIf

显示运行该 cmdlet 时会发生什么情况。 cmdlet 未运行。

Type:SwitchParameter
Aliases:wi
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

输入

String

可以通过管道将包含文件路径的字符串传递给此 cmdlet。

输出

Signature

此 cmdlet 返回一个 Signature 对象,该对象表示它设置的值。

备注

此 cmdlet 仅在 Windows 平台上可用。