对于经常用或者重要的脚本,可以保持到本地文件中,需要的时候可直接调用,这样处理更加方便!
编写脚本输出到文件 (若不指定绝对路径,默认都使用当前目录)
"Get-Date" > MyScript.ps1
"pwd" >> MyScript.ps1
"'测试'" >> MyScript.ps1
"Get-Date
pwd
'测试'" > MyScript.ps1
#或者使用 @''@ 批量写入
@'
Get-Date
pwd
"测试"
'@ > MyScript.ps1
相关操作:
#执行文本脚本
.\MyScript.ps1
#获取脚本到PS控制台
Get-Content .\MyScript.ps1
#打开文本文件
notepad MyScript.ps1
#新建或更新脚本,脚本中使用参数
notepad MyScript.ps1
Write-Host "Hello,$args"
.\MyScript.ps1 kk
脚本中的参数用法与函数内部定义一样
#函数
Function Test{
begin{ $i=1 }
process{
$_.name
$i++
}
end{}
}
Get-Service -DisplayName "*MSSQLSERVER*" | Test
#脚本 notepad MyScript.ps1
begin{ $i=1 }
process{
$_.name
$i++
}
end{}
管道中执行的脚本:
#编辑脚本如下 notepad MyScript.ps1
foreach ($element in $input)
{
if($element.Extension -eq ".exe")
{
Write-Host -fore "red" $element.Name
}
else
{
Write-Host -fore "Green" $element.Name
}
}
#或者使用流处理,编辑脚本如下 notepad MyScript.ps1
begin{}
process
{
if($_.Extension -eq ".exe")
{
Write-Host -fore "red" $_.Name
}
else
{
Write-Host -fore "Green" $_.Name
}
}
end{}
#执行
ls $env:windir | .\MyScript.ps1
设置别名更方便:
#设置别名更方便
Set-Alias edit notepad.exe
edit MyScript.ps1
脚本中传递变量:
param (
[Parameter(ValueFromPipeline = $true, HelpMessage = "Enter your name: ")]
[String]$Name = "kk" #default value
)
Write-Host "Your name is $Name."
Write-Host ("Your name is {0} and {1}." -f $Name,"mm")
执行:
【数字签名证书】
脚本很容易被替换或者更高,使用签名验证会告诉我们脚本是否信任,是否包含了恶意篡改。
创建证书:
开始——>所有程序——>Microsoft Visual Studio 2012——>Visual Studio Tools——>VS2012 x86 本机工具命令提示
或者:
C:\Program Files\Windows Kits\8.1\bin\x86\makecat.exe
makecert.exe -pe -r -n "CN=PowerShellTestCert" -eku 1.3.6.1.5.5.7.3.3 -ss "My"
查看证书:
dir Cert:\CurrentUser\My -CodeSigningCert
ls cert:CurrentUser\My
ls cert:CurrentUser\My | where {$_.subject -eq "CN=PowerShellTestCert"}
设置数字签名认证:
$Cert=ls cert:CurrentUser\My | where {$_.subject -eq "CN=PowerShellTestCert"}
Set-AuthenticodeSignature -PSPath "MyScript.ps1" -Certificate $Cert
edit MyScript.ps1
签名已经成功!!
证书相关信息:
#证书的代表
$Cert.subject
#证书的签发者
$Cert.issuer
#证书的序列号,指纹
$Cert | select SerialNumber,Thumbprint | fl *
#证书是否受信任
$Cert.Verify()
#打开证书窗口界面
[System.Reflection.Assembly]::LoadWithPartialName("System.Security")
[System.Security.Cryptography.x509Certificates.X509Certificate2UI]::DisplayCertificate($Cert)
上面打开的证书并不受信任!
添加信任(或者窗口添加:certmgr.msc)
$rootStore= New-Object system.security.cryptography.X509Certificates.x509Store("root","Currentuser")
$rootStore.Open("ReadWrite")
$rootStore.Add($Cert)
$rootStore.Close()
$Cert.Verify()
操作 Add($Cert) 会提示对话框,点击确认即可!
给脚本添加数字签名:
#给文件(MyScript.ps1)添加签名
Set-AuthenticodeSignature MyScript.ps1 $Cert
Set-AuthenticodeSignature -PSPath "MyScript.ps1" -Certificate $Cert
#给所有文件添加签名
Set-AuthenticodeSignature (ls *.ps1) $Cert
Set-AuthenticodeSignature (Dir -recurse -include *.ps1) $Cert
#文件是否有数字签名
Get-AuthenticodeSignature test.ps1
Get-AuthenticodeSignature MyScript.ps1
对于脚本的执行权限,powershell 有几个设置:
#设置脚本执行权限
Set-ExecutionPolicy Restricted #禁止执行脚本
Set-ExecutionPolicy Default #默认
Set-ExecutionPolicy AllSigned #只执行数字验证的脚本
Set-ExecutionPolicy RemoteSigned #本地无需证书,远程需要证书
Set-ExecutionPolicy Unrestricted #无限制,可执行任何脚本
查看当前PS中脚本执行权限:
#查看当前PS中脚本执行权限
Get-ExecutionPolicy
Get-ExecutionPolicy -List
现在设置为只有数字签名的文件可执行:
#现在设置为数字签名可执行
Set-ExecutionPolicy AllSigned
执行脚本(第一个无签名,报错;第二个有签名,正常执行)
#执行脚本(第一个无签名,报错;第二个有签名,正常执行)
ls $env:windir | .\test.ps1
Get-Service -DisplayName "*MSSQLSERVER*" | .\MyScript.ps1
现在我把文件内容篡改:
执行脚本,出错!
完美!~
标签:脚本,Set,证书,Cert,MyScript,Scripts,ps1,PowerShell From: https://blog.51cto.com/hzc2012/6024083