PowerShell
在管理员权限下调整执行策略
远程执行ps脚本
两个要求:
- 远程主机身份经过验证,为可信任主机
为满足第一个要求,远端主机必须经过域服务器验证。最佳应对方法时将对方主机名称或IP加入本机信任列表,可以跳过Kerberos身份验证。
- 提供账号、密码远程登录
远程连接方法:
语法与命令
Cmdlet
是PowerShell提供的命令,大多数以 “动词-名词”的规律命名。
定义变量与使用数组
使用“$”作为起始标识符,与python类似都是弱类型。
没有提供数组的定义方法,当普通变量接收到一组数据时自动拓展为一维固定数组。
管道
# 关闭防火墙
$tempService=Get-Service
foreach($StopService in $tempService)
{
if ($StopService.name -eq "MpsSvc")
{ Stop-Service $StopService.name }
}
# 使用管道
Get-Service | Where-Object -FilterScript {$_.name -eq "MpsSvc"} | Stop-Service
算术、逻辑、比较运算
算术:+ - * / %
数学库:正切:[System.Math]::Tan(8)
逻辑运算:-and -or -not -xor
比较运算:-eq,c开头的严格区分大小,其余两个不区分大小
流程控制
循环
1.
$count=0
while($count -lt 3)
{
$count++
write-host '第'$count'次循环'
}
2.
$Num=5
$count=0
do {
$count++
$Num++
write-host 'No.'$count
} while($Num -lt 3)
3.
$tempProcess=Get-Process
foreach ($StopProcess in $tempProcess)
{
if ($StopProcess.Responding -eq $false) {
Stop-Process $StopProcess
}
# Write-Host $StopProcess.Responding
}
4.
for ($i=1; $i -le 10; $i++) {
Write-Host $i
}
可使用 break 跳出循环
分支
1.
$a=1
if ($a -ge 2) {
Write-Host "equal or grater than 2"
} else {
echo "less than 2"
}
2.
$day=[System.DateTime]::Now
switch ($day) {
Monday {
"one"
break
}
Truesday {
"two"
break
}
default {
"other"
}
}
常用Cmdlet
在cmd中使用 help 与 ?
在 PowerShell 中提供了 Get-help Get-command 两个查询 Cmdlet
Get-Command 用于提供基本语法信息,信息来自Cmdlet、函数脚本、自带的说明内容,用法:
Get-Command [通配符]关键字[通配符]
Get-help [待查询的cmdlet] [-example] [-detailed] [-full]
位置导航
大多数Cmdlet可使用-path指定执行位置或路径,交互模式下可使用 Set-Location 指定路径。
Set-Location [-LiteralPath 此参数忽略] <string> [-PassThru 切换后显示切换位置]
访问驱动器
驱动器除了磁盘分区还包含注册表、证书存储空间、函数存储空间、变量存储位置等。
Get-PSDrive [-PSProvider string]
对象处理
常用的对象处理 Cmdlet 有6个 Get-WmiObject Remove-WmiObject New-Object Get-Member Where-Object Select-Object
Windows Management Instrumentation(Windows 管理规范)是windows中最重要的管理技术之一,通过它可以访问磁盘、事件日志、文件、文件夹等系统资源。
- Get-WmiObject (新版本中被 Get-CimInstance 取代)
Get-WmiObject 可让用户轻易获得系统内 WMI 类及实例 - Remove-WmiObject
关闭已运行的 WMI 实例 - New-Object
创建新的系统物件,常见用法是通过赋值将变量定义为指定的系统物件 - Get-Membe 获得对象的属性、方法、事件
- Where-Object
用于筛选对象,通常配合管道一起使用。在筛选时,使用“$_”这个特殊的变量名词,指代管道所传输的对象
从查询到的数百计的驱动中过滤处运行态的 - Select-Object
复制对象的指定属性到一个新对象
脚本示例
查看代码
# 远程修改注册表
# 添加一个自启动程序
function Set-RegistryValue($key, $name, $value, $type)
{
if ((Test-Path $key) -eq $false) {
md $key | Out-Null
}
Set-ItemProperty $key $name $value -type $type
}
Set-RegistryValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "myValue" "c:\windows\xxx.exe" "String"
Set-RegistryValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DisableRegistryTools" "1" "dword"
# 新添加的值是隐藏状态,使用regedit无法查看。可通过 Get-ItemProperty -path xxxx 查看
查看代码
# 导出证书
# 设置密码,导出证书时需要
$Password="opendoor"
# 导出证书种类,Pfx为带私钥证书,若只要公钥可选Cert
$type="Pfx"
# 规范证书类型
$type=[System.Security.Cryptography.X509Certificates.X509Certificate]::$type
# 导出路径
$Path="C:\Users\color"
# 访问证书存储位置,查找带私钥的个人证书
$certs=dir Cert:\CurrentUser\My | Where-Object {$_.HasPrivateKey}
foreach ($cert in $certs) {
[void]($cert.Subject -match 'CN=([^,]+)')
# 获取使用者名词,并取出不能作为文件名的部分
$CN=$matches[1] -replace '[\\/:\*?`"<>|]',''
[System.IO.File]::WriteAllBytes($(Join-Path $Path ($CN + "_" + $cert.Thumbprint + ".pfx")), $cert.Export($type,$Password))
}
查看代码
$maxDays=4
$currentDate = [System.DateTime]::Now
$lastLogonTimeStampLimit = $currentDate.AddDays(-$maxDays)
$strComputer = [System.Net.Dns]::GetHostName()
$computer = [ADSI]("WinNT://" + $strComputer + ",computer")
$Users = $computer.psbase.children|where{$_.psbase.schemaclassname -eq "User"}
foreach ($member in $Users.psbase.syncroot) {
Trap {Continue} # Powershell 对ADSI支持不好,使用Trap忽略提示
if ($member.lastlogin -lt $lastLogonTimeStampLimit) {
$temName=$member.Name
Write-Host "$temName <==="
}
}
标签:count,Get,eq,Object,System,type,PowerShell From: https://www.cnblogs.com/zhh567/p/16767232.html