[TOC]
命令 -
基础语法:
简单示例:
[TOC]
0x00 系统远程访问管理
Enable-PSRemoting 命令 - 将计算机配置为接收远程命令。
描述: 该cmdlet将计算机配置为接收通过使用WS-Management技术发送的PowerShell远程命令。当前仅在Windows平台上支持基于WS-Management的PowerShell远程处理(此cmdlet在Linux或MacOS版本的PowerShell中不可用)。
Tips : Windows Server 平台上默认启用PowerShell远程处理, 通常不允许在计算机位于公用网络上时在Windows客户端版本上启用PowerShell远程处理,但是您可以使用SkipNetworkProfileCheck
参数跳过此限制
# 查看服务状态
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
错误时请将网络连接类型更改为域或专用然后再次尝试.
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