(一)概述
PowerShell 是构建于 .NET 上基于任务的命令行 shell 和脚本语言。PowerShell帮助系统管理员和高级用户快速自动化管理操作系统(Linux、macOS和Windows)和进程的任务。
使用 PowerShell 命令可以从命令行管理计算机。PowerShell providers允许您像访问文件系统一样轻松地访问数据存储,比如注册表和证书存储。PowerShell具有丰富的表达式解析器和完全成熟的脚本语言。
powershell提供了可以帮助查找相关cmdlet的命令,例如,若要查找用于查看和更改 Windows 服务的 cmdlet 列表,请输入:
Get-Command *-Service
例如,若要查找用于查看和更改 Windows 服务的 cmdlet 列表,请键入:
Get-Help Get-Service
大多数 cmdlet 会返回对象,这些对象可获得操作,然后再呈现为显示文本。 若要全面了解 cmdlet 的输出,请将输出通过管道传递给 Get-Member cmdlet。 例如,下面的命令显示 Get-Service cmdlet 的输出对象成员的相关信息。
Get-Service | Get-Member
以上文字摘自官方说明文档:
https://docs.microsoft.com/zh-cn/powershell/scripting/overview?view=powershell-7
(二)远程控制
Windows PowerShell 通过使用各种技术(包括 WMI、RPC 和 WS-Management)支持远程处理。
■无特殊配置cmdlet(无需WinRM设置)
许多 Windows PowerShell cmdlet 可以通过指定ComputerName 参数,在一台或多台远程计算机上收集数据和更改设置。 这些 cmdlet 使用不同的通信协议,无需进行任何特殊配置即可在所有 Windows 操作系统上工作。
通常情况下,无需特殊配置即可进行远程处理的 cmdlet 有 ComputerName 参数,但没有 Session 参数。 如果要在会话中查找这些 cmdlet,可以输入以下命令:
Get-Command | where { $_.parameters.keys -contains "ComputerName" -and $_.parameters.keys -notcontains "Session"}
■通过WinRM远程处理
使用WinRM(协议:WS-Management),我们可以在一台或多台远程计算机上运行任何Windows PowerShell命令。我们还可以建立持久连接、启动交互会话并在远程计算机上运行脚本。
该方法要求被远程计算机与远程管理计算机都进行WinRM的配置。具体配置方法如下:
被远程计算机:
- 使用管理员用户打开powershell窗口。
- 执行Enable-PSRemoting命令。
该命令会自动设置相应的防火墙策略,详细请参考【About Remote Requirements】
Enable-PSRemoting -Force
- 输入相关命令,验证远程处理配置是否正确。例:
New-PSSession
如果配置成功,该命令会在本地计算机上创建一个会话,并返回表示该会话的对象。输出内容如下:
Id Name ComputerName State ConfigurationName
-- ---- ------------ ----- -----
1 Session1 localhost Opened Microsoft.PowerShell
远程管理计算机:
- 执行以下命令,启动WinRM
winrm quickconfig -q
- 设置信任主机
Set-Item wsman:\localhost\client\trustedhosts *
- 重启WinRM服务
Restart-Service WinRM
远程处理
远程处理有多种方式,此处只列举以下三种。
- 使用
New-PSSession
创建到本地或远程计算机的持久连接。
例:为Server01计算机上创建一个新的PSSession,并将其保存在$Server01变量中。
$Server01 = New-PSSession -ComputerName Server01
- 使用
Enter-PSSession
建立交互式会话,示例如下,可输入exit
退出会话。
Enter-PSSession -ComputerName Server01
[Server01]: PS>
[Server01]: Get-Process PowerShell > C:\ps-test\Process.txt
[Server01]: exit
- 使用
Invoke-Command
在远程计算机上执行命令。
ComputerName :远程计算机
Credential :认证信息
ScriptBlock :要执行的命令行。
示例如下:
$Srv = "Server01"
$Username = 'Admin'
$Password = 'Admin'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
Invoke-Command -ComputerName $Srv -Credential $Cred -ScriptBlock { Get-Service }
(三)常用cmdlet
这次学习的重点是通过WIMI取得系统软硬件信息,主要用到了Get-CimInstance
cmdlet,此处主要为了记录:
WMI提供的各种类
WMI reference
筛选功能
可以使用 Select-Object cmdlet 创建新的自定义 PowerShell 对象(包含从用于创建它们的对象中选择的属性)。 键入下面的命令以创建仅包括 Win32_LogicalDisk WMI 类的 Name 和 FreeSpace 属性的新对象:
PS C:\WINDOWS\system32> Get-CimInstance -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace
Name FreeSpace
---- ---------
C: 2192871424
D: 20595388416
E: 58155708416
可以使用 Select-Object 创建计算属性。 这样即可以以十亿字节为单位显示 FreeSpace,而非以字节为单位。
PS C:\WINDOWS\system32> Get-CimInstance -Class Win32_LogicalDisk |
>> Select-Object -Property Name, @{
>> label='FreeSpace'
>> expression={($_.FreeSpace/1GB).ToString('F2')}
>> }
Name FreeSpace
---- ---------
C: 2.04
D: 19.18
E: 54.16