PowerShell脚本签名与Shell环境配置全解析
立即解锁
发布时间: 2025-08-26 01:43:37 阅读量: 8 订阅数: 12 


Windows PowerShell深度解析与实践指南
### PowerShell脚本签名与Shell环境配置全解析
#### 脚本签名
在对脚本进行签名之前,需要确保运行脚本的策略要求脚本必须预先签名。为此,要将当前的脚本执行策略切换为`AllSigned`。只有具有管理员权限的用户才能在计算机上执行此操作,在Windows Vista系统中,这些用户需要以提升的权限运行Shell。具体操作步骤如下:
1. 以管理员身份启动Shell会话。
2. 调用`Set-ExecutionPolicy` cmdlet:
```powershell
PS C:\> Set-ExecutionPolicy AllSigned
PS C:\> Get-ExecutionPolicy
AllSigned
```
接下来创建一个简单的脚本,用于返回当前文件夹中的所有证书文件并尝试运行它:
```powershell
PS> Set-Content Get-CertificateFiles.ps1 "dir *.cer"
PS> .\Get-CertificateFiles.ps1
```
运行结果会提示该脚本未进行数字签名,无法在系统上执行。这是因为当前处于`AllSigned`脚本执行策略下,不允许运行未签名的脚本。
要对脚本进行签名,需要获取签名证书,并将其与脚本路径一起传递给`Set-AuthenticodeSignature` cmdlet。可以从证书存储中获取证书并用于签名脚本:
```powershell
PS> $certStore = dir cert:\CurrentUser\My
PS> $certStore
Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\My
Thumbprint Subject
---------- -------
E5F1C5F21B5E276374626A9C4F68E39DBB0BB062 CN=Pro Windows PowerShell Scri...
PS> Set-AuthenticodeSignature Get-CertificateFiles.ps1 -cert $certStore
Directory: C:\PowerShell\certs
SignerCertificate Status Path
----------------- ------ ----
E5F1C5F21B5E276374626A9C4F68E39DBB0BB062 Valid Get-Certifica...
```
如果个人存储中包含多个证书,可能需要使用索引器(如`(dir cert:\CurrentUser\My)[0]`)来获取正确的证书。可以随时通过调用`Get-AuthenticodeSignature`来获取脚本的签名:
```powershell
PS> Get-AuthenticodeSignature Get-CertificateFiles.ps1
Directory: C:\PowerShell\certs
SignerCertificate Status Path
----------------- ------ ----
E5F1C5F21B5E276374626A9C4F68E39DBB0BB062 Valid Get-Certifica...
```
当`Status`属性为`Valid`时,脚本可以安全执行。运行签名后的脚本时,可能会出现提示询问是否信任该发布者。选择信任后,脚本将执行。
信任脚本发布者意味着PowerShell会从签名脚本中提取公共证书,并将其存储在“受信任的发布者”证书存储中。如果从“受信任的发布者”存储中删除该证书,下次运行该脚本时将再次询问是否信任该发布者。
还可以从之前导出的PFX文件中获取发布者证书。使用`Get-PfxCertificate` cmdlet提取证书时,需要输入私钥密码,这比从证书存储中获取证书感觉更安全,但证书存储是更安全的存储证书的地方,且不需要处理文件系统权限。获取证书后,签名脚本的操作与之前相同:
```powershell
PS> $certFile = Get-PfxCertificate ScriptSign.pfx
Enter password: **********
PS> Set-AuthenticodeSignature Get-CertificateFiles.ps1 -cert $certFile
Directory: C:\PowerShell\certs
SignerCertificate Status Path
----------------- ------ ----
E5F1C5F21B5E276374626A9C4F68E39DBB0BB062 Valid Get-Certifica...
PS> Get-AuthenticodeSignature Get-CertificateFiles.ps1
Directory: C:\PowerShell\certs
SignerCertificate Status Path
----------------- ------ ----
E5F1C5F21B5E276374626A9C4F68E39DBB0BB062 Valid Get-Certifica...
```
签名后的脚本会在注释部分嵌入签名信息。为了验证签名的安全性,对脚本进行修改,插入恶意命令后再运行脚本,PowerShell会检测到脚本内容已更改,拒绝执行,并提示哈希不匹配。手动验证签名时,`Status`属性会显示`HashMismatch`。
#### 脚本在其他机器上运行
使用自己的自签名证书颁发机构证书对脚本进行签名的一个限制是,在其他机器上很难验证该签名。如果使用V
0
0
复制全文
相关推荐










