今日开始学习一些简单的powershell命令。
官方链接:
关于脚本 - PowerShell | Microsoft Learn
关于签名 - PowerShell | Microsoft Learn
查看 PowerShell
版本:
# 查看powershell版本
$PSVersionTable
运行脚本前
运行脚本前,需要更改默认的 PowerShell
执行策略,windows
默认策略为 Restricted
即阻止所有脚本的运行,包括本地编写的脚本。
所以,学习 PowerShell
命令前,需要设置计算机的执行策略,管理员模式打开 PowerShell
执行以下命令:
设置可执行已签名的脚本,自己的脚本需要做一次签名。
# 可运行所有由受信任的发布者签名的脚本执行
Set-ExecutionPolicy AllSigned
对脚本进行签名的方法 - PowerShell | Microsoft Learn
对脚本进行签名的方法:
参考:
Powershell 脚本数字签名 – PowerShell 中文博客 (pstips.net)
Set-AuthenticodeSignature (Microsoft.PowerShell.Security) - PowerShell | Microsoft Learn
购买颁发机构的证书(可运行在所有windows计算机),略
创建自签名证书(只能运行在自己计算机)
$params = @{
Subject = 'CN=PowerShell Code Signing Cert'
Type = 'CodeSigning'
CertStoreLocation = 'Cert:\CurrentUser\My'
HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params
查看自签名证书
# 获取
$certs = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
# 或
$certs = @(Dir cert:\CurrentUser\My -codeSigningCert)
$cert = ls cert:\CurrentUser\My | where {$_.subject -eq "CN=PowerShell Code Signing Cert"}
# 查看
$cert.subject
$cert.issuer
$cert.Thumbprint
$cert | select SerialNumber,Thumbprint | fl *
# 验证, False 表示不受信任
$cert.Verify()
验证证书是否受信任
# False 表示不受信任
$cert.Verify()
# 弹窗显示证书信息
[System.Security.Cryptography.X509Certificates.X509Certificate2UI]::DisplayCertificate($cert)
弹窗如下:
声明或设置证书受信任
方法一:win+R
运行certmgr.msc
,直接拖到受信任证书列表
方法二:$rootStore = New-Object System.Security.Cryptography.X509Certificates.X509Store("root","CurrentUser") $rootStore.Open("ReadWrite") # 添加前面生成的证书 $rootStore.Add($cert) # 弹窗提示要安装此证书,选择是 $rootStore.Close()
对脚本进行签名
# 获取前面生成的证书Object
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
# 若有很多个代码签名证书,可通过下面方法获取指定名称证书
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | where {$_.subject -eq "CN=PowerShell Code Signing Cert"}
# 给单个脚本文件签名
Set-AuthenticodeSignature xxx.ps1 $cert
# 批量签名
Set-AuthenticodeSignature (ls *.ps1) $cert
验证脚本文件是否已签名
$checkPs = Get-AuthenticodeSignature .\servicelog.ps1
# 输出 NotSigned:表示没有签名 Valid:表示签名验证通过,文末附验证结果列表
$checkPs.Status
# 以文字形式输出结果
$checkPs.StatusMessge
允许远程(网上下载的)脚本执行,包含未签名脚本,但不支持解除本地编写的脚本限制。[针对网络下载的脚本]
# 允许执行远程脚本
Set-ExecutionPolicy RemoteSigned
# 解除未签名限制,鼠标右键文件属性,点击 “取消限制”,或执行以下命令:
Unblock-File -Path xxx.ps1
简单粗暴设置不阻止任何脚本执行,用完重新设置回默认。[不推荐,仅限学习和本地开发]
# 允许任何脚本执行,且没有任何警告和提示
Set-ExecutionPolicy Bypass
# 完成,记得重置默认策略
Set-ExecutionPolicy Restricted
检查执行策略是否设置成功:
Get-ExecutionPolicy
第一个简单的脚本
脚本文件的扩展名是 .ps1
,创建获取当前运行的服务并保存到以当前日期为名称的日志文件里,脚本内容如下:
$date = (get-date).dayofyear
get-service | out-file "$date.log"
执行该脚本
.\servicelog.ps1
若提示 “未对文件 D:\powershell\servicelog.ps1 进行数字签名。” 或 “已处理证书链,但是在不受信任提供程序信任的根证书中终止。”
可按照 “对脚本进行签名的方法” 解决证书和签名问题。
Status返回值 | 描述 |
---|---|
HashMismatch | 文件的哈希码和存储的签名不匹配 |
Incompatible | 无法验证签名,因为与当前操作系统不兼容 |
NotSigned | 文件没有签名 |
NotSupportedFileFormat | 指定的文件格式不支持的系统签名。这通常意味着系统不知道如何签名或验证文件的类型。 |
NotTrusted | 证书的发布者在系统中不受信任. |
UnknownError | 文件签名无效 |
Valid | 该文件有一个有效的签名。这意味着只有签名的语法上是合法的。这并不意味着信任。 |