PowerShell学习之新手入门

2023-09-16 windows 2210

今日开始学习一些简单的powershell命令。

官方链接:
关于脚本 - PowerShell | Microsoft Learn
关于签名 - PowerShell | Microsoft Learn

查看 PowerShell 版本:

# 查看powershell版本
$PSVersionTable

运行脚本前

运行脚本前,需要更改默认的 PowerShell 执行策略,windows 默认策略为 Restricted 即阻止所有脚本的运行,包括本地编写的脚本。

所以,学习 PowerShell 命令前,需要设置计算机的执行策略,管理员模式打开 PowerShell 执行以下命令:

  1. 设置可执行已签名的脚本,自己的脚本需要做一次签名。

# 可运行所有由受信任的发布者签名的脚本执行
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
  1. 允许远程(网上下载的)脚本执行,包含未签名脚本,但不支持解除本地编写的脚本限制。[针对网络下载的脚本]

# 允许执行远程脚本
Set-ExecutionPolicy RemoteSigned
# 解除未签名限制,鼠标右键文件属性,点击 “取消限制”,或执行以下命令:
Unblock-File -Path xxx.ps1
  1. 简单粗暴设置不阻止任何脚本执行,用完重新设置回默认。[不推荐,仅限学习和本地开发]

# 允许任何脚本执行,且没有任何警告和提示
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该文件有一个有效的签名。这意味着只有签名的语法上是合法的。这并不意味着信任。
2