PS命令之操作系统远程管理及进程服务操作示例

2022-09-29 15:22:01 浏览数 (1)

[TOC]

命令 -

基础语法:

简单示例:

[TOC]

0x00 系统远程访问管理

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

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

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

代码语言:javascript复制
# 查看服务状态
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服务以使前面的更改生效。

语法参数:

代码语言:javascript复制
Enable-PSRemoting [-Force] [-SkipNetworkProfileCheck] [-WhatIf] [-Confirm] [<CommonParameters>]

基础示例:

代码语言:javascript复制
# 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:localhostclienttrustedhosts -value 10.20.172.106 -Force
PS > Enter-PSSession -ComputerName 10.20.172.106 -Credential weiyigeek
  # [10.20.172.106]: PS C:UsersWeiyiGeekDocuments> hostname
  # Security
  # [10.20.172.106]: PS C:UsersWeiyiGeekDocuments> 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错误时请将网络连接类型更改为域或专用然后再次尝试.

代码语言:javascript复制
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%system32WsmSvc.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.专用网络配置

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

代码语言:javascript复制
Set-Item WSMan:localhostclienttrustedhosts -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版本和更高会话会话配置的远程访问,同样需要使用“以管理员身份运行” 选项启动。

语法参数:

代码语言:javascript复制
Disable-PSRemoting [-Force] [-WhatIf] [-Confirm] [<CommonParameters>]

基础示例:

代码语言:javascript复制
# 示例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 AUTHORITYNETWORK AccessDenied, NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators AccessAllowed ...
  # PowerShell.6.2.0   NT AUTHORITYNETWORK AccessDenied, NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators AccessAllowed ...

# 新的输出显示AccessDenied安全描述符已从所有会话配置中删除,此时便可以正常的创建远程连接会话了。
Enable-PSRemoting -Force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Auto
  # Name               Permission
  # ----               ----------
  # PowerShell.6       NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators AccessAllowed ...
  # PowerShell.6.2.0   NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators 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 AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators AccessAllowed,
  #                   BUILTINRemote Management Users AccessAllowed
  # PowerShell.6.2.0   NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators AccessAllowed,
  #                   BUILTINRemote Management Users AccessAllowed
  # Test               NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdministrators AccessAllowed,
  #                   User01 AccessAllowed

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

Set-PSSessionConfiguration -Name PowerShell.6 -AccessMode Remote -Force
Get-PSSessionConfiguration | Format-Table -Property Name, Permission -Auto
  # Name                 Permission
  # ----                 ----------
  # PowerShell.6         NT AUTHORITYINTERACTIVE AccessAllowed(关键点), BUILTINAdministrators AccessAllowed, BUILTIN ...
  # PowerShell.6.2.0     NT AUTHORITYNETWORK AccessDenied, NT AUTHORITYINTERACTIVE AccessAllowed, BUILTINAdm ..

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


0x01 计算机管理配置

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

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

语法说明:

代码语言:javascript复制
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>]

简单示例

代码语言:javascript复制
# - 1) 本地计算机重命名并重启计算机
Rename-Computer -NewName "weiyigeek" -Restart
Rename-Computer -NewName "DomainServer" -DomainCredential Domain01Admin01 -Restart

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

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

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

基础语法:

代码语言:javascript复制
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

简单示例:

代码语言:javascript复制
# - 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"的参数将关闭操作作为后台作业运行,指定身份验证级别和备用凭据,限制为运行命令而创建的并发连接,并强制立即关闭

基础语法:

代码语言:javascript复制
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>]

简单示例:

代码语言:javascript复制
# 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 Domain01Admin01
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命令:

代码语言:javascript复制
#1.获取进程相关的cmdlet命令
PS > (Get-Command *-Process).Name  #值得学习
Get-Process
Start-Process
Stop-Process
Wait-Process
Debug-Process

基础语法

代码语言:javascript复制
# - 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 基础使用

代码语言:javascript复制
# 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:WINDOWSsystem32ApplicationFrameHost.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 WEIYIGEEKWeiyiGeek    notepad
Get-Process notepad  -FileVersionInfo # 获取进程的版本信息
  # ProductVersion   FileVersion      FileName
  # --------------   -----------      --------
  # 10.0.19041.980   10.0.19041.98... C:WINDOWSsystem32notepad.exe
Get-Process pwsh   
Get-Process -Id $PID  # 使用自动变量标识承载当前会话的进程

2) Start-Process 基础使用

代码语言:javascript复制
# 1.此示例启动一个进程,该进程使用当前文件夹中的Sort.exe文件。该命令使用所有默认值包括默认窗口样式、工作文件夹和凭据。
Start-Process -FilePath "sort.exe"

# 2.此示例启动一个进程,该进程打印C:PS TestMyFile.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:WindowsSystem32notepad.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 基础使用

代码语言:javascript复制
# 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 基础使用

代码语言:javascript复制
# 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 基础使用

代码语言:javascript复制
# 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命令:

代码语言:javascript复制
> (Get-Command *-Service).Name
Get-Service
New-Service
Restart-Service
Resume-Service 
Set-Service
Start-Service
Stop-Service
Suspend-Service

参数说明:

代码语言:javascript复制
StartupType : 启动类型支持的参数值(Automatic/Boot/Disabled/Manual/System)

基础语法:

代码语言:javascript复制
# - 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)

基础信息:

代码语言:javascript复制
# 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

代码语言:javascript复制

实际案例:

代码语言:javascript复制
# 1) Windows 上 Prometheus 节点采集服务创建并设置防火墙访问规则
# - 自启动服务创建并且启动服务
$exporterVersion="0.16.0"
$params = @{
  Name = "windows_exporter_service"
  BinaryPathName = "d:prowindows_exporter-0.16.0-amd64 --config.file=d:proconfig.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

0 人点赞