[TOC]


命令 -

基础语法:

1
2



简单示例:

1
2


[TOC]

0x00 系统远程访问管理

Enable-PSRemoting 命令 - 将计算机配置为接收远程命令。

描述: 该cmdlet将计算机配置为接收通过使用WS-Management技术发送的PowerShell远程命令。当前仅在Windows平台上支持基于WS-Management的PowerShell远程处理(此cmdlet在Linux或MacOS版本的PowerShell中不可用)。

Tips : Windows Server 平台上默认启用PowerShell远程处理, 通常不允许在计算机位于公用网络上时在Windows客户端版本上启用PowerShell远程处理,但是您可以使用SkipNetworkProfileCheck 参数跳过此限制

1
2
3
4
5
# 查看服务状态
Get-Service -Name WinRM
# Status Name DisplayName
# ------ ---- -----------
# Running WinRM Windows Remote Management (WS-Manag...

该cmdlet会执行以下操作:

  • 运行Set-WSManQuickConfig cmdlet,该cmdlet执行以下任务:
    • 启动WinRM服务。
    • 将WinRM服务上的启动类型设置为“自动”。
    • 创建一个侦听器以接受任何IP地址上的请求。
    • 为WS-Management通信启用防火墙例外。
    • 如果需要,创建简单和长名称会话端点配置。
    • 启用所有会话配置。
    • 更改所有会话配置的安全描述符,以允许远程访问。
  • 重新启动WinRM服务以使前面的更改生效。

语法参数:

1
Enable-PSRemoting [-Force] [-SkipNetworkProfileCheck] [-WhatIf] [-Confirm] [<CommonParameters>]

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 0.配置计算机以接收远程命令(需要远程确认)
Enable-PSRemoting

# 1. 在服务器上以管理员权限运行启用PowerShell远程访问(配置计算机以在没有确认提示的情况下接收远程命令)
Enable-PSRemoting -Force
Enable-PSRemoting -SkipNetworkProfileCheck -Force # 在计算机位于公用网络上时在Windows客户端版本上启用PowerShell远程处理
# 在此计算机上设置了 WinRM 以接收请求。
# WinRM 已经进行了更新,以用于远程管理。
# WinRM 防火墙异常已启用。
# 已配置 LocalAccountTokenFilterPolicy 以远程向本地用户授予管理权限。
# 警告: 正在等待服务“Windows Remote Management (WS-Management) (winrm)”停止.

# 2.如何在Windows操作系统的客户端版本上允许从公共网络进行远程访问,对于不同版本的Windows,防火墙规则的名称可能不同;
# NetSecurity模块中的Set-NetFirewallRulecmdlet添加了防火墙规则,该规则允许从任何远程位置从公共网络进行远程访问
Get-NetFirewallRule -Name 'WINRM*' | Select-Object Name
# Name
# ----
# WINRM-HTTP-In-TCP-NoScope
# WINRM-HTTP-In-TCP
# WINRM-HTTP-Compat-In-TCP-NoScope
# WINRM-HTTP-Compat-In-TCP
# 建议指定远程连接的主机
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-NoScope" -RemoteAddress 10.20.172.103
# 如果安全组有限制, 请开放对此机器入方向的5985(HTTP)和5986(HTTPS)端口。
New-NetFirewallRule -Name powershell-remote-tcp -Direction Inbound -DisplayName 'PowerShell远程连接 TCP' -LocalPort 5985-5996 -Protocol 'TCP' -RemoteAddress 192.168.1.254
New-NetFirewallRule -Name powershell-remote-udp -Direction Inbound -DisplayName 'PowerShell远程连接 UDP' -LocalPort 5985-5996 -Protocol 'UDP' -RemoteAddress 192.168.1.254

# 3.在客户端机器上(需要远程连接被管理的机器上)运行以下命令以接受被管理的机器是受信任的 (如果想管理任何机器请设置为*), 运行以下命令必须是管理员权限
PS > Get-Service -Name WinRM | Start-Service
PS > Set-Item WSMan:localhost\client\trustedhosts -value 10.20.172.106 -Force
PS > Enter-PSSession -ComputerName 10.20.172.106 -Credential weiyigeek
# [10.20.172.106]: PS C:\Users\WeiyiGeek\Documents> hostname
# Security
# [10.20.172.106]: PS C:\Users\WeiyiGeek\Documents> Get-NetAdapter

# Name InterfaceDescription ifIndex Status MacAddress LinkSpeed
# ---- -------------------- ------- ------ ---------- ---------
# VMware Network Adapte...1 VMware Virtual Ethernet Adapter for ... 16 Up 00-50-56-C0-00-01 100 Mbps
# 以太网 Intel(R) Ethernet Connection (11) I2... 12 Up B0-7B-25-05-9E-DE 1 Gbps
# VMware Network Adapte...8 VMware Virtual Ethernet Adapter for ... 4 Up 00-50-56-C0-00-08 100 Mbps


问题1.如在被控制机器上执行时出现如下Set-WSManQuickConfig错误时请将网络连接类型更改为域或专用然后再次尝试.

1
Set-WSManQuickConfig : <f:WSManFault xmlns:f="http://schemas.microsoft.com/wbem/wsman/1/wsmanfault" Code="2150859113" Machine="localhost"><f:Message><f:ProviderFault provider="Config provider" path="%systemroot%\system32\WsmSvc.dll"><f:WSManFault xmlns:f="http://schemas.microsoft.com/wbem/wsman/1/wsmanfault" Code="2150859113" Machine="Security"><f:Message>由于此计算机上的网络连接类型之一设置为公用,因此 WinRM 防火墙例外将不运行。  </f:Message></f:WSManFault></f:ProviderFault></f:Message></f:WSManFault>

WeiyiGeek.专用网络配置

WeiyiGeek.专用网络配置

问题2.如在客户端机器上执行set-Item命令出现如下Set-Item : 客户端无法连接到请求中指定的目标错误时,请开启客户端的启动 WinRM 服务。

1
2
Set-Item WSMan:localhost\client\trustedhosts -value 10.20.172.106 -Force
Set-Item : 客户端无法连接到请求中指定的目标。 请验证该目标上的服务是否正在运行以及是否正在接受请求。 有关目标(通常是 IIS 或 WinRM)上运行的 WS 管理服务,请查阅日志和文档。 如果目标是 WinRM 服务,则在目标上运行以下命令来分析和配置 WinRM 服务: "winrm quickconfig"

解决办法: Get-Service -Name WinRM | Start-Service


Disable-PSRemoting 命令 - 禁用Windows PowerShell远程会话配置

描述: 该cmdlet阻止对本地计算机上所有PowerShell版本和更高会话会话配置的远程访问,同样需要使用“以管理员身份运行” 选项启动。

语法参数:

1
Disable-PSRemoting [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 示例1:阻止对所有PowerShell会话配置的远程访问
Disable-PSRemoting

# 示例2:在没有确认提示的情况下阻止对所有PowerShell会话配置的远程访问
Disable-PSRemoting -Force
# 禁用会话配置后,该New-PSSessioncmdlet尝试创建到本地计算机的远程会话(也称为“环回”)。
# 由于在本地计算机上禁用了远程访问,因此该命令将失败
New-PSSession -ComputerName localhost -ConfigurationName PowerShell.6

# 示例4:运行此cmdlet和Enable-PSRemoting的效果
Disable-PSRemoting -force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Auto
# Name Permission
# ---- ----------
# PowerShell.6 NT AUTHORITY\NETWORK AccessDenied, NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed ...
# PowerShell.6.2.0 NT AUTHORITY\NETWORK AccessDenied, NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed ...

# 新的输出显示AccessDenied安全描述符已从所有会话配置中删除,此时便可以正常的创建远程连接会话了。
Enable-PSRemoting -Force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Auto
# Name Permission
# ---- ----------
# PowerShell.6 NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed ...
# PowerShell.6.2.0 NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed ...

# 示例5:具有禁用的会话端点配置的环回连接
Disable-PSRemoting -Force
# 第一次会话创建尝试: 凭据通过Credential参数显式传递给命令, 这种类型的连接通过网络堆栈,而不是环回。因此与禁用端点的连接尝试失败,并显示“拒绝访问”错误。
New-PSSession -ComputerName localhost -ConfigurationName powershell.6 -Credential (Get-Credential)
# 第二次会话创建尝试: 它是成功的因为它是绕过网络堆栈的环回连接。
New-PSSession -ComputerName localhost -ConfigurationName powershell.6 -EnableNetworkAccess
# Id Name Transport ComputerName ComputerType State ConfigurationName Availability
# -- ---- --------- ------------ ------------ ----- ----------------- ------------
# 1 Runspace1 WSMan localhost RemoteMachine Opened powershell.6 Available

# 示例6:阻止对具有自定义安全描述符的会话配置的远程访问
# Register-PSSessionConfiguration创建测试会话配置, 该文件路径参数指定自定义会话的会话配置文件, 该 ShowSecurityDescriptorUI参数显示一个对话框为会话配置的权限集
Register-PSSessionConfiguration -Name Test -FilePath .\TestEndpoint.pssc -ShowSecurityDescriptorUI -Force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Wrap
# 现在Get-PSSessionConfigurationand和Format-Tablecmdlet显示将 所有网络用户的AccessDenied安全描述符添加到所有会话配置中,包括 测试会话配置。尽管其他安全描述符未更改,但“ network_deny_all”安全描述符优先
# Name Permission
# ---- ----------
# PowerShell.6 NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed,
# BUILTIN\Remote Management Users AccessAllowed
# PowerShell.6.2.0 NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed,
# BUILTIN\Remote Management Users AccessAllowed
# Test NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed,
# User01 AccessAllowed

# 示例7:重新启用对选定会话配置的远程访问
# 例如:下面更改PowerShell.6会话配置利用AccessMode参数重新启用对配置的远程访问。
Disable-PSRemoting -Force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Auto
# Name Permission
# ---- ----------
# PowerShell.6 NT AUTHORITY\NETWORK AccessDenied(关键点), NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Adm ...
# PowerShell.6.2.0 NT AUTHORITY\NETWORK AccessDenied, NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Adm ...

Set-PSSessionConfiguration -Name PowerShell.6 -AccessMode Remote -Force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Auto
# Name Permission
# ---- ----------
# PowerShell.6 NT AUTHORITY\INTERACTIVE AccessAllowed(关键点), BUILTIN\Administrators AccessAllowed, BUILTIN\ ...
# PowerShell.6.2.0 NT AUTHORITY\NETWORK AccessDenied, NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Adm ..

Tips : 当满足以下条件时将创建回送连接,1.要连接的计算机名称是“ localhost”,2.没有凭据传入。当前登录用户(隐式凭据)用于连接,3.使用EnableNetworkAccess开关参数。


0x01 计算机管理配置

Rename-Computer 命令 - 更改计算机名称

描述: 此Cmdlet是在 Windows PowerShell 3.0 时加入。

语法说明:

1
Rename-Computer [-NewName] <System.String> [-ComputerName <System.String>] [-DomainCredential <System.Management.Automation.PSCredential>] [-Force] [-LocalCredential <System.Management.Automation.PSCredential>] [-PassThru] [-Protocol {DCOM | WSMan}] [-Restart] [-WsmanAuthentication {Default | Basic | Negotiate | CredSSP | Digest | Kerberos}] [-Confirm] [-WhatIf] [<CommonParameters>]


简单示例

1
2
3
4
5
6
# - 1) 本地计算机重命名并重启计算机
Rename-Computer -NewName "weiyigeek" -Restart
Rename-Computer -NewName "DomainServer" -DomainCredential Domain01\Admin01 -Restart

# - 2) 远程计算机重命名
Rename-Computer -ComputerName "Srv01" -NewName "Server001" -DomainCredential Domain01\Admin01 -Force


Restart-Computer 命令 - 在本地和远程计算机上重新启动操作系统。

描述: 从Windows PowerShell 3.0开始,您可以等待重新启动完成,然后再运行下一个命令。指定等待超时和查询间隔,并等待重新启动的计算机上的特定服务可用。

基础语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Restart-Computer [[-ComputerName] <System.String[]>] [[-Credential] <System.Management.Automation.PSCredential>] [-AsJob] [-DcomAuthentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Force] [-Impersonation {Default
| Anonymous | Identify | Impersonate | Delegate}] [-ThrottleLimit <System.Int32>] [-Confirm] [-WhatIf] [<CommonParameters>]

Restart-Computer [[-ComputerName] <System.String[]>] [[-Credential] <System.Management.Automation.PSCredential>] [-DcomAuthentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Delay <System.Int16>] [-For {Wmi | WinRM | PowerShell}] [-Force] [-Impersonation {Default | Anonymous | Identify | Impersonate | Delegate}] [-Protocol {DCOM | WSMan}] [-Timeout <System.Int32>] [-Wait] [-WsmanAuthentication {Basic | CredSSP | Default | Digest | Kerberos | Negotiate}] [-Confirm] [-WhatIf] [<CommonParameters>]

# 参数说明:
ComputerName 参数 : 指定要操作的Server01和Server02服务器名称或者IP
Force 参数 : 使每台计算机立即重新启动。
ThrottleLimit 参数 : 将命令限制为10个并发连接。
Impersonation 参数: 指定匿名以隐藏请求者的身份。
DcomAuthentication 参数 : 将PacketIntegrity指定为连接的身份验证级别。
AsJob 参数 : 将命令作为后台作业运行。
Wait 参数 : 等待重启完成。
For 参数 : 指定PowerShell可以在远程计算机上运行命令。
Timeout 参数 : 指定五分钟的等待时间。
Delay 参数 : 每两秒钟查询一次远程计算机,以确定它是否重新启动。
Protocol 参数 : 指定使用WSMan协议。
WsmanAuthentication 参数 : 将身份验证方法指定为Kerberos


简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# - 1.Restart the local computer (简单且最常用)
Restart-Computer
Restart-Computer -ComputerName localhost, Server01

# - 2.Restart a remote compute
# `Restart Computer`使用ComputerName参数指定Server01。
Restart-Computer -ComputerName Server01 -Impersonation Anonymous -DcomAuthentication PacketIntegrity

# - 3.作为后台作业重新启动计算机,作业对象存储在`$job`变量中`$Job`通过管道发送到获取结果的'Receive Job'cmdlet。
$Job = Restart-Computer -ComputerName "Server01", "Server02" -AsJob
$Job | Receive-Job

# - 4.重新启动远程计算机并等待PowerShell
Restart-Computer -ComputerName Server01 -Wait -For PowerShell -Timeout 300 -Delay 2

# - 5.`Get Content`使用Path参数从文本文件Domain01.txt中获取计算机名列表。计算机名存储在变量“$names”中`Get Credential`提示您输入用户名和密码,并将值存储在变量“$Creds”中`Restart Computer`使用ComputerNameCredential参数及其变量。
$Names = Get-Content -Path C:\Domain01.txt
$Creds = Get-Credential
Restart-Computer -ComputerName $Names -Credential $Creds -Force -ThrottleLimit 10

# - 6.使用WSMan协议重新启动计算机
Restart-Computer -ComputerName Server01 -Protocol WSMan -WsmanAuthentication Kerberos


Stop-Computer 命令 - 停止(关闭)本地和远程计算机

描述: 使用"Stop Computer"的参数将关闭操作作为后台作业运行,指定身份验证级别和备用凭据,限制为运行命令而创建的并发连接,并强制立即关闭

基础语法:

1
Stop-Computer [[-ComputerName] <System.String[]>] [[-Credential] <System.Management.Automation.PSCredential>] [-AsJob] [-Confirm] [-DcomAuthentication {Default | None | Connect | Call | Packet | PacketIntegrity | PacketPrivacy | Unchanged}] [-Force] [-Impersonation {Default | Anonymous | Identify | Impersonate | Delegate}] [-Protocol {DCOM | WSMan}] [-ThrottleLimit <System.Int32>] [-WsmanAuthentication {Default | Basic | Negotiate | CredSSP | Digest | Kerberos}] [-WhatIf] [<CommonParameters>]


简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Example 1: Shut down the local computer  or two remote computers 
Stop-Computer -ComputerName localhost
Stop-Computer -ComputerName "Server01", "Server02", "localhost"

# Example 2: Shut down remote computers as a background job
$j = Stop-Computer -ComputerName "Server01", "Server02" -AsJob
$results = $j | Receive-Job
$results

# Example 3: Shut down a remote computer
Stop-Computer -ComputerName "Server01" -Impersonation Anonymous -DcomAuthentication PacketIntegrity

# Example 4: Shut down computers in a domain
$s = Get-Content -Path ./Domain01.txt
$c = Get-Credential -Credential Domain01\Admin01
Stop-Computer -ComputerName $s -Force -ThrottleLimit 10 -Credential $c


0x02 进程查看和管理

Get-Process 命令 - 获取在本地计算机或远程计算机上运行的进程

Start-Process 命令 - 启动在本地计算机或远程计算机未运行进程

Stop-Process 命令 - 停止在本地计算机或远程计算机上运行的进程

Wait-Process 命令 - 使在本地计算机或远程计算机上运行的进程等待

Debug-Process 命令 - 调试本地计算机上运行的一个或多个进程。

描述: Debug Process cmdlet将调试器附加到本地计算机上一个或多个正在运行的进程。可以通过进程名称或进程ID(PID)指定进程,也可以将进程对象通过管道传送到此cmdlet。

描述: 进程与服务常用cmdlet命令:

1
2
3
4
5
6
7
#1.获取进程相关的cmdlet命令
PS > (Get-Command *-Process).Name #值得学习
Get-Process
Start-Process
Stop-Process
Wait-Process
Debug-Process


基础语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# - Get-Process
Get-Process [[-Name] <System.String[]>] [-ComputerName <System.String[]>] [-FileVersionInfo] [-Module] [<CommonParameters>] -Id <System.Int32[]> -IncludeUserName [<CommonParameters>] -InputObject <System.Diagnostics.Process[]> [<CommonParameters>]

# - Start-Process
Start-Process [-FilePath] <System.String> [[-ArgumentList] <System.String[]>] [-Credential <System.Management.Automation.PSCredential>] [-LoadUserProfile] [-NoNewWindow] [-PassThru] [-RedirectStandardError <System.String>] [-RedirectStandardInput <System.String>] [-RedirectStandardOutput <System.String>] [-UseNewEnvironment] [-Wait] [-WindowStyle {Normal | Hidden | Minimized | Maximized}] [-WorkingDirectory <System.String>] [<CommonParameters>]

# - Wait-Process
Wait-Process [-Id] <System.Int32[]> [-Name] <System.String[]> [[-Timeout] <System.Int32>] [<CommonParameters>] -InputObject <System.Diagnostics.Process[]>

# - Stop-Process
Stop-Process [-Id] <System.Int32[]> -Name <System.String[]> [-InputObject] <System.Diagnostics.Process[] [-Force] [-PassThru] [-Confirm] [-WhatIf] [<CommonParameters>]

# - Debug-Process
Debug-Process [-Id] <System.Int32[]> [-Name] <System.String[]> -InputObject <System.Diagnostics.Process[]> [-Confirm] [-WhatIf] [<CommonParameters>]


基础示例:

  • 1) Get-Process 基础使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    # 1.获取进程 (gps / ps)相关信息
    Get-Process -Id 5600
    get-Process -Name notepad #获取指定运行经常的消息
    # Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
    # ------- ------ ----- ----- ----- ------ -- -----------
    # 467 37 20916 50980 248 2.01 5600 notepad
    Get-Process notepad, explorer | Format-List * # 获取有关一个或多个进程的所有可用数据
    Get-Process | Where-Object {$_.WorkingSet -gt 20000000} # 获取工作集大于指定大小的所有进程
    Get-Process | Where-Object {$_.Name -eq "notepad" -or $_.Name -eq "iexplore"} # 根据进程名过滤所有记事本进程以及IE进程。
    Get-Process | Where-Object {$_.company -like '*Microsoft*' } | select Name,Description,Company # 根据company过滤所有产品发布者以”Microsoft”打头的进程
    Get-Process | select -First 1 | Format-List * # 通过每个Process对象的属性进行过滤并获取第一个对象的属性
    # Name : ApplicationFrameHost
    # Id : 4756
    # PriorityClass : Normal
    # FileVersion : 10.0.19041.746 (WinBuild.160101.0800)
    # HandleCount : 510
    # WorkingSet : 42315776
    # PagedMemorySize : 17203200
    # PrivateMemorySize : 17203200
    # VirtualMemorySize : 385449984
    # TotalProcessorTime : 00:14:45.3750000
    # SI : 1
    # Handles : 510
    # VM : 2203703672832
    # WS : 42315776
    # PM : 17203200
    # NPM : 33360
    # Path : C:\WINDOWS\system32\ApplicationFrameHost.exe
    Get-Process | Format-Table -View priority # 按优先级分组列出计算机上的进程
    # PriorityClass:Idle
    # ProcessName Id HandleCount WorkingSet64
    # ----------- -- ----------- ------------
    # firefox 20764 847 177819648
    # firefox 21368 1343 157007872
    # - 向标准Get进程输出显示添加属性(值得学习)
    Get-Process notepad | Format-Table `
    @{Label = "NPM(K)"; Expression = {[int]($_.NPM / 1024)}},
    @{Label = "PM(K)"; Expression = {[int]($_.PM / 1024)}},
    @{Label = "WS(K)"; Expression = {[int]($_.WS / 1024)}},
    @{Label = "VM(M)"; Expression = {[int]($_.VM / 1MB)}},
    @{Label = "CPU(s)"; Expression = {if ($_.CPU) {$_.CPU.ToString("N")}}},
    Id, MachineName, ProcessName -AutoSize
    # NPM(K) PM(K) WS(K) VM(M) CPU(s) Id MachineName ProcessName
    # ------ ----- ----- ----- ------ -- ----------- -----------
    # 15 3312 16792 2101400 0.14 4060 . notepad
    Get-Process SQL* -Module # 获取用指定进程加载的模块
    Get-Process notepad -IncludeUserName # 查找进程的所有者(需要管理员权限)
    # Handles WS(K) CPU(s) Id UserName ProcessName
    # ------- ----- ------ -- -------- -----------
    # 240 16732 0.14 4060 WEIYIGEEK\WeiyiGeek notepad
    Get-Process notepad -FileVersionInfo # 获取进程的版本信息
    # ProductVersion FileVersion FileName
    # -------------- ----------- --------
    # 10.0.19041.980 10.0.19041.98... C:\WINDOWS\system32\notepad.exe
    Get-Process pwsh
    Get-Process -Id $PID # 使用自动变量标识承载当前会话的进程
  • 2) Start-Process 基础使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # 1.此示例启动一个进程,该进程使用当前文件夹中的Sort.exe文件。该命令使用所有默认值包括默认窗口样式、工作文件夹和凭据。
    Start-Process -FilePath "sort.exe"

    # 2.此示例启动一个进程,该进程打印C:\PS Test\MyFile.txt文件。
    Start-Process -FilePath "myfile.txt" -WorkingDirectory "C:\PS-Test" -Verb Print

    # 3.示例启动了一个进程,对Testsort.txt文件中的项进行排序,并返回sorted.txt文件中的排序项,任何错误都会写入sorterrror.txt文件。
    Start-Process -FilePath "Sort.exe" -RedirectStandardInput "Testsort.txt" -RedirectStandardOutput "Sorted.txt" -RedirectStandardError "SortError.txt" -UseNewEnvironment

    # 4.启用notepad打开1.txt并使最大化窗口(# hidden)
    Start-Process C:\Windows\System32\notepad.exe 1.txt -WindowStyle Maximized

    # 5.此示例使用“以管理员身份运行”选项启动PowerShell。
    Start-Process -FilePath "powershell" -Verb RunAs

    # 6.此示例演示如何查找启动进程时可以使用的动词,可用的谓词由进程中运行的文件的文件扩展名决定。
    $startExe = New-Object System.Diagnostics.ProcessStartInfo -Args PowerShell.exe
    $startExe.verbs
    open
    runas
    runasuser

    # 7.为进程指定参数
    Start-Process -FilePath "$env:comspec" -ArgumentList "/c dir `"%systemdrive%\program files`""
    Start-Process -FilePath "$env:comspec" -ArgumentList "/c","dir","`"%systemdrive%\program files`""

    # 8.示例在Linux上启动PowerShell的后台实例,该实例即使在关闭启动会话后仍保持活动状态。nohup命令在当前目录的nohup.out文件中收集输出。
    # 为了避免在类Unix平台上终止子进程,可以将Start进程与nohup结合起来。
    Start-Process nohup 'pwsh -noprofile -c "1..120 | % { Write-Host . -NoNewline; sleep 1 }"'


  • 3) Wait-Process 基础使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 1.停止进程并等待
    PS C:\> $nid = (Get-Process notepad).id
    PS C:\> Stop-Process -Id $nid
    PS C:\> Wait-Process -Id $nid

    # 2.指定进程进行等待
    Wait-Process -Id 5600
    $p = Get-Process notepad
    Wait-Process -Id $p.id
    Wait-Process -InputObject $p

    # 3.等待10秒,等待Outlook和notepad进程停止。如果两个进程都未停止,cmdlet将显示非终止错误并显示命令提示符。
    Wait-Process -Name Outlook,notepad -Timeout 10


  • 4) Stop-Process 基础使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 1.停止进程 ( spps / kill)
    Stop-Process -ID 7960
    Stop-Process -Name notepad -Force #强制结束

    # 2.进程停止的四种方法(补充)
    # 纯cmdlet命令
    Get-Process -Name notepad | Stop-Process
    # cmdlet+遍历
    Get-Process -Name notepad | foreach-object{$_.Kill()} 
    # WMI 对象 + 遍历 + 对象方法 
    Get-WmiObject Win32_Process -Filter "name = 'notepad.exe'" | ForEach-Object{$_.Terminate()  | Out-Null }
    # WMI 对象 + 遍历 + cmdlet方法
    Get-WmiObject Win32_Process -Filter "name = 'notepad.exe'" | Invoke-WmiMethod -Name Terminate | Out-Null
  • 5) Debug-Process 基础使用

    1
    2
    3
    4
    5
    6
    # 1.将调试器附加到以指定字符串开头的所有进程动力壳
    Debug-Process -Name "SQL*"

    # 2.将调试器附加到多个进程(名称或者id)
    PS C:\> Debug-Process "Winlogon", "Explorer", "Outlook"
    PS C:\> Debug-Process -Id 1132, 2028

0x03 服务查看和管理

Get-Service 命令 - 获取服务信息

New-Service 命令 - 创建新的Windows服务

Restart-Service 命令 - 重新启动服务

Resume-Service 命令 - 恢复挂起服务

Set-Service 命令 - 配置服务

Start-Service 命令 - 开启服务

Stop-Service 命令 - 停止服务

Suspend-Service 命令 - 延缓挂起服务

描述: 服务常用的cmdlet命令:

1
2
3
4
5
6
7
8
9
> (Get-Command *-Service).Name
Get-Service
New-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service

参数说明:

1
StartupType : 启动类型支持的参数值(Automatic/Boot/Disabled/Manual/System)

基础语法:

1
2
3
4
5
6
# - New-Service
New-Service [-Name] <System.String> [-BinaryPathName] <System.String> [-Credential <System.Management.Automation.PSCredential>] [-DependsOn <System.String[]>] [-Description <System.String>] [-DisplayName <System.String>] [-StartupType {Boot | System | Automatic | Manual | Disabled}] [-Confirm] [-WhatIf] [<CommonParameters>]


# - 参数解析 -
StartupType : 启动类型支持的参数值(Automatic/Boot/Disabled/Manual/System)

Automatic

基础信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1.系统服务信息获取
Get-Service -Name RpcSs
# Status Name DisplayName
# ------ ---- -----------
# Running RpcSs Remote Procedure Call (RPC)
Get-Service RpcSs -RequiredServices # 查看其被依赖的的服务
# Running DcomLaunch DCOM Server Process Launcher
# Running RpcEptMapper RPC Endpoint Mapper

Get-Service | ? {$_.Name -like "B*"} # 获取以B开头的服务相关信息
Get-service | Where-Object {$_.Status -eq "Running"} # 对象有哪些属性后就可以采取过滤 $_表示当前对象
Get-Service w32time | Where {$_.status –eq 'Stopped'} | Start-Service # 判断w32time服务状态如果是停止状态则启动w32time服务

Get-service | Select-Object -First 1 | Get-Member -MemberType Property
Get-Service -Name TermService | Select-Object -Property *


# 使用 cmdlet 执行该操作(如果存在)继续操作,并启动 Windows 时间服务,但这次使用 cmdlet 启动服务。
Get-Service -Name w32time | Start-Service -PassThru
#显示具体属性说明(如下)
Get-service | Select-Object -First 1 | Format-List * #显示具体的属性值


# 2.启动服务
Start-Service RpcSs
Start-Service -Name "*RpcSs*"
Get-Service w32time | Start-Service -PassThru

# 3.暂停服务
Stop-Service RpcSs -Force # 强制暂停
Get-Service w32time | Stop-Service -PassThru

# 4.延缓挂起服务
Suspend-Service

# 5.设置服务自动启用
Set-Service -DisplayName "手机网络时间" -StartupType Automatic
Get-Service w32time

  • New-Service
    1
    2


实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1) Windows 上 Prometheus 节点采集服务创建并设置防火墙访问规则
# - 自启动服务创建并且启动服务
$exporterVersion="0.16.0"
$params = @{
Name = "windows_exporter_service"
BinaryPathName = "d:\pro\windows_exporter-0.16.0-amd64 --config.file=d:\pro\config.yml"
DisplayName = "windows_exporter_service"
StartupType = "Automatic"
Description = "windows exporter service open 9100 port!"
}
New-Service @params | Start-Service -PassThru
# - 防火墙规则设置(只允许10.0.0.2机器访问)
New-NetFirewallRule -Name "windows_exporter_service" -DisplayName "windows_exporter_service" -Description "windows_exporter_service" -Direction Inbound -LocalPort 9100 -RemoteAddress 10.0.0.2 -Protocol TCP -Action Allow -Enabled True
Get-NetFirewallRule -Name "windows_exporter_service" | Format-Table