PowerShell

PowerShell

在管理员权限下调整执行策略

远程执行ps脚本

两个要求:

  1. 远程主机身份经过验证,为可信任主机

    为满足第一个要求,远端主机必须经过域服务器验证。最佳应对方法时将对方主机名称或IP加入本机信任列表,可以跳过Kerberos身份验证。

  2. 提供账号、密码远程登录

远程连接方法:

语法与命令

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中最重要的管理技术之一,通过它可以访问磁盘、事件日志、文件、文件夹等系统资源。

  1. Get-WmiObject (新版本中被 Get-CimInstance 取代)
    Get-WmiObject 可让用户轻易获得系统内 WMI 类及实例
  2. Remove-WmiObject
    关闭已运行的 WMI 实例
  3. New-Object
    创建新的系统物件,常见用法是通过赋值将变量定义为指定的系统物件
  4. Get-Membe 获得对象的属性、方法、事件
  5. Where-Object
    用于筛选对象,通常配合管道一起使用。在筛选时,使用“$_”这个特殊的变量名词,指代管道所传输的对象
    从查询到的数百计的驱动中过滤处运行态的
  6. 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 <==="
    }
}

 

posted @ 2022-10-08 17:50  某某人8265  阅读(354)  评论(0编辑  收藏  举报