Windows 命令 - CMD 和 PowerShell
本部分包括用于在可能需要使用 SAC 访问 Windows VM 的情况下执行常见任务的示例命令,例如需要排查 RDP 连接故障时。
自 Windows Server 2003 以来的所有 Windows 版本中都包含 SAC,但默认处于禁用状态。 SAC 依赖于 sacdrv.sys
内核驱动程序、 Special Administration Console Helper
服务 (sacsvr
) 和 sacsess.exe
进程。 有关详细信息,请参阅 紧急管理服务工具和设置。
SAC 允许通过串行端口连接到正在运行的 OS。 从 SAC 启动 CMD 时, sacsess.exe
会在正在运行的 cmd.exe
OS 中启动。 如果在通过串行控制台功能连接到 SAC 的同时将 RDP 连接到 VM,则可以在任务管理器中看到这一点。 通过 SAC 访问的 CMD 与通过 RDP 连接时使用的 CMD 相同 cmd.exe
。 所有相同的命令和工具都可用,包括从该 CMD 实例启动 PowerShell 的功能。 这是 SAC 与 Windows 恢复环境 (WinRE) 的主要区别,因为 SAC 允许你管理正在运行的操作系统,其中 WinRE 启动到不同的最小操作系统。 虽然 Azure VM 不支持访问 WinRE 的功能,但借助串行控制台功能,可以通过 SAC 管理 Azure VM。
由于 SAC 限制为 80x24 屏幕缓冲区,且没有回退,因此请添加到 | more
命令,一次显示一页输出。 使用 <spacebar>
查看下一页,或 <enter>
查看下一行。
SHIFT+INSERT
是串行控制台窗口的粘贴快捷方式。
由于 SAC 的屏幕缓冲区有限,较长的命令可能更易于在本地文本编辑器中键入,然后将其粘贴到 SAC 中。
使用 CMD 查看和编辑 Windows 注册表设置
验证 RDP 是否已启用
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v fDenyTSConnections
只有在配置了相关组策略设置时,才会存在 \Policies) 下的第二个键 (。
启用 RDP
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v fDenyTSConnections /t REG_DWORD /d 0
只有在配置了相关组策略设置时,才需要 \Policies) 下的第二个键 (。 如果在组策略中配置了值,则会在下一次组策略刷新时重写该值。
使用 CMD 管理 Windows 服务
查看服务状态
sc query termservice
查看服务登录帐户
sc qc termservice
设置服务登录帐户
sc config termservice obj= "NT Authority\NetworkService"
等号后需要一个空格。
设置服务启动类型
sc config termservice start= demand
等号后需要一个空格。 可能的起始值包括 boot
、、system
、auto
demand
、disabled
、 delayed-auto
。
设置服务依赖项
sc config termservice depend= RPCSS
等号后需要一个空格。
启动服务
net start termservice
或
sc start termservice
停止服务
net stop termservice
或
sc stop termservice
使用 CMD 管理网络功能
显示 NIC 属性
netsh interface show interface
显示 IP 属性
netsh interface ip show config
显示 IPSec 配置
netsh nap client show configuration
启用 NIC
netsh interface set interface name="<interface name>" admin=enabled
将 NIC 设置为使用 DHCP
netsh interface ip set address name="<interface name>" source=dhcp
有关 的详细信息 netsh
, 请单击此处。
应始终在来宾 OS 中配置 Azure VM,以使用 DHCP 获取 IP 地址。 Azure 静态 IP 设置仍使用 DHCP 将静态 IP 提供给 VM。
坪
ping 8.8.8.8
端口 ping
安装 telnet 客户端
dism /online /Enable-Feature /FeatureName:TelnetClient
测试连接性
telnet bing.com 80
删除 telnet 客户端
dism /online /Disable-Feature /FeatureName:TelnetClient
默认情况下,如果仅限于 Windows 中可用的方法,则 PowerShell 可能是测试端口连接的更好方法。 有关示例,请参阅下面的 PowerShell 部分。
测试 DNS 名称解析
nslookup bing.com
显示 Windows 防火墙规则
netsh advfirewall firewall show rule name="Remote Desktop - User Mode (TCP-In)"
禁用 Windows 防火墙
netsh advfirewall set allprofiles state off
在进行故障排除时,可以使用此命令暂时排除 Windows 防火墙。 它将在下次重启时启用,或者在使用以下命令启用时启用。 不要停止 Windows 防火墙服务 (MPSSVC) 或基本筛选引擎 (BFE) 服务,以排除 Windows 防火墙。 停止 MPSSVC 或 BFE 将导致所有连接被阻止。
启用 Windows 防火墙
netsh advfirewall set allprofiles state on
使用 CMD 管理用户和组
创建本地用户帐户
net user /add <username> <password>
将本地用户添加到本地组
net localgroup Administrators <username> /add
验证用户帐户是否已启用
net user <username> | find /i "active"
从通用化映像创建的 Azure VM 会将本地管理员帐户重命名为在 VM 预配期间指定的名称。 因此,它通常不会是 Administrator
。
启用用户帐户
net user <username> /active:yes
查看用户帐户属性
net user <username>
本地管理员帐户中感兴趣的示例行:
Account active Yes
Account expires Never
Password expires Never
Workstations allowed All
Logon hours allowed All
Local Group Memberships *Administrators
查看本地组
net localgroup
使用 CMD 管理 Windows 事件日志
查询事件日志错误
wevtutil qe system /c:10 /f:text /q:"Event[System[Level=2]]" | more
更改为 /c:10
要返回的所需事件数,或移动它以返回与筛选器匹配的所有事件。
按事件 ID 查询事件日志
wevtutil qe system /c:1 /f:text /q:"Event[System[EventID=11]]" | more
按事件 ID 和提供程序查询事件日志
wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Microsoft-Windows-Hyper-V-Netvsc'] and EventID=11]]" | more
按事件 ID 和提供程序查询过去 24 小时的事件日志
wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Microsoft-Windows-Hyper-V-Netvsc'] and EventID=11 and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
使用 604800000
回顾 7 天而不是 24 小时。
在过去 7 天内按事件 ID、提供程序和 EventData 查询事件日志
wevtutil qe security /c:1 /f:text /q:"Event[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=4624 and TimeCreated[timediff(@SystemTime) <= 604800000]] and EventData[Data[@Name='TargetUserName']='<username>']]" | more
使用 CMD 查看或删除已安装的应用程序
列出已安装的应用程序
wmic product get Name,InstallDate | sort /r | more
按 sort /r
安装日期进行降序排序,以便轻松查看最近安装的内容。 使用 <spacebar>
前进到下一页输出,或 <enter>
前进一行。
卸载应用程序
wmic path win32_product where name="<name>" call uninstall
将 替换为 <name>
上述命令中为要删除的应用程序返回的名称。
使用 CMD 进行文件系统管理
获取文件版本
wmic datafile where "drive='C:' and path='\\windows\\system32\\drivers\\' and filename like 'netvsc%'" get version /format:list
此示例返回虚拟 NIC 驱动程序的文件版本,根据 Windows 版本 netvsc.sys、netvsc63.sys 或 netvsc60.sys。
扫描系统文件损坏
sfc /scannow
另请参阅 修复 Windows 映像。
扫描系统文件损坏
dism /online /cleanup-image /scanhealth
另请参阅 修复 Windows 映像。
将文件权限导出到文本文件
icacls %programdata%\Microsoft\Crypto\RSA\MachineKeys /t /c > %temp%\MachineKeys_permissions_before.txt
将文件权限保存到 ACL 文件
icacls %programdata%\Microsoft\Crypto\RSA\MachineKeys /save %temp%\MachineKeys_permissions_before.aclfile /t
从 ACL 文件还原文件权限
icacls %programdata%\Microsoft\Crypto\RSA /save %temp%\MachineKeys_permissions_before.aclfile /t
使用 /restore
时的路径必须是使用 /save
时指定的文件夹的父文件夹。 在此示例中, \RSA
是上例中指定的文件夹的/save
父\MachineKeys
级。
获取文件夹的 NTFS 所有权
takeown /f %programdata%\Microsoft\Crypto\RSA\MachineKeys /a /r
以递归方式授予对文件夹的 NTFS 权限
icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "BUILTIN\Administrators:(F)"
管理设备
删除不存在的 PNP 设备
%windir%\System32\RUNDLL32.exe %windir%\System32\pnpclean.dll,RunDLL_PnpClean /Devices /Maxclean
管理组策略
强制组策略更新
gpupdate /force /wait:-1
使用 CMD 的其他任务
显示 OS 版本
ver
或
wmic os get caption,version,buildnumber /format:list
或
systeminfo find /i "os name"
systeminfo | findstr /i /r "os.*version.*build"
查看 OS 安装日期
systeminfo | find /i "original"
或
wmic os get installdate
查看上次启动时间
systeminfo | find /i "system boot time"
查看时区
systeminfo | find /i "time zone"
或
wmic timezone get caption,standardname /format:list
重启 Windows
shutdown /r /t 0
添加 /f
将强制关闭正在运行的应用程序,而不会警告用户。
检测安全模式启动
bcdedit /enum | find /i "safeboot"
Windows 命令 - PowerShell
若要在 SAC 中运行 PowerShell,请在出现 CMD 提示符后键入:
powershell <enter>
警告
在运行任何其他 PowerShell 命令之前,从 PowerShell 会话中删除 PSReadLine 模块。 存在一个已知问题:如果 PSReadLine 在 SAC 的 PowerShell 会话中运行,则从剪贴板粘贴的文本中可能会引入额外的字符。
首先检查是否加载了 PSReadLine。 默认情况下,它将在 Windows Server 2016、Windows 10 及更高版本的 Windows 上加载。 仅当已手动安装早期 Windows 版本时,它才会存在。
如果此命令返回到没有输出的提示符,则表示模块未加载,你可以像平常一样继续使用 SAC 中的 PowerShell 会话。
get-module psreadline
如果上述命令返回 PSReadLine 模块版本,请运行以下命令以卸载它。 此命令不会删除或卸载模块,只会从当前 PowerShell 会话中卸载该模块。
remove-module psreadline
使用 PowerShell 查看和编辑 Windows 注册表设置
验证 RDP 是否已启用
get-itemproperty -path 'hklm:\system\curRentcontrolset\control\terminal server' -name 'fdenytsconNections'
get-itemproperty -path 'hklm:\software\policies\microsoft\windows nt\terminal services' -name 'fdenytsconNections'
只有在配置了相关组策略设置时,才会存在 \Policies) 下的第二个键 (。
启用 RDP
set-itemproperty -path 'hklm:\system\curRentcontrolset\control\terminal server' -name 'fdenytsconNections' 0 -type dword
set-itemproperty -path 'hklm:\software\policies\microsoft\windows nt\terminal services' -name 'fdenytsconNections' 0 -type dword
只有在配置了相关组策略设置时,才需要 \Policies) 下的第二个键 (。 如果在组策略中配置了值,则会在下一次组策略刷新时重写该值。
使用 PowerShell 管理 Windows 服务
查看服务详细信息
get-wmiobject win32_service -filter "name='termservice'" | format-list Name,DisplayName,State,StartMode,StartName,PathName,ServiceType,Status,ExitCode,ServiceSpecificExitCode,ProcessId
Get-Service
可以使用,但不包括服务登录帐户。 Get-WmiObject win32-service
做。
设置服务登录帐户
(get-wmiobject win32_service -filter "name='termservice'").Change($null,$null,$null,$null,$null,$false,'NT Authority\NetworkService')
使用 、 或 LocalSystem
以外的NT AUTHORITY\LocalService
NT AUTHORITY\NetworkService
服务帐户时,将帐户密码指定为帐户名称后最后 (第八个) 参数。
设置服务启动类型
set-service termservice -startuptype Manual
Set-service
接受 Automatic
、 Manual
或 Disabled
作为启动类型。
设置服务依赖项
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\TermService' -Name DependOnService -Value @('RPCSS','TermDD')
启动服务
start-service termservice
停止服务
stop-service termservice
使用 PowerShell 管理网络功能
显示 NIC 属性
get-netadapter | where {$_.ifdesc.startswith('Microsoft Hyper-V Network Adapter')} | format-list status,name,ifdesc,macadDresS,driverversion,MediaConNectState,MediaDuplexState
或
get-wmiobject win32_networkadapter -filter "servicename='netvsc'" | format-list netenabled,name,macaddress
Get-NetAdapter
在 2012+ 版中可用,对于 2008R2,请使用 Get-WmiObject
。
显示 IP 属性
get-wmiobject Win32_NetworkAdapterConfiguration -filter "ServiceName='netvsc'" | format-list DNSHostName,IPAddress,DHCPEnabled,IPSubnet,DefaultIPGateway,MACAddress,DHCPServer,DNSServerSearchOrder
启用 NIC
get-netadapter | where {$_.ifdesc.startswith('Microsoft Hyper-V Network Adapter')} | enable-netadapter
或
(get-wmiobject win32_networkadapter -filter "servicename='netvsc'").enable()
Get-NetAdapter
在 2012+ 版中可用,对于 2008R2,请使用 Get-WmiObject
。
将 NIC 设置为使用 DHCP
get-netadapter | where {$_.ifdesc.startswith('Microsoft Hyper-V Network Adapter')} | Set-NetIPInterface -DHCP Enabled
(get-wmiobject Win32_NetworkAdapterConfiguration -filter "ServiceName='netvsc'").EnableDHCP()
Get-NetAdapter
在 2012+ 上可用。 对于 2008R2,请使用 Get-WmiObject
。 应始终在来宾 OS 中配置 Azure VM,以使用 DHCP 获取 IP 地址。 Azure 静态 IP 设置仍使用 DHCP 将 IP 提供给 VM。
坪
test-netconnection
注意
Write-Progress cmdlet 可能无法与此命令配合使用。 作为缓解措施,可以在 PowerShell 中运行 $ProgressPreference = "SilentlyContinue"
以禁用进度栏。
或
get-wmiobject Win32_PingStatus -Filter 'Address="8.8.8.8"' | format-table -autosize IPV4Address,ReplySize,ResponseTime
Test-Netconnection
不带任何参数将尝试 ping internetbeacon.msedge.net
。 它在 2012+ 版可用。 对于 2008R2,请使用 Get-WmiObject
,如第二个示例中所示。
端口 Ping
test-netconnection -ComputerName bing.com -Port 80
或
(new-object Net.Sockets.TcpClient).BeginConnect('bing.com','80',$null,$null).AsyncWaitHandle.WaitOne(300)
Test-NetConnection
在 2012+ 上可用。 对于 2008R2 使用 Net.Sockets.TcpClient
测试 DNS 名称解析
resolve-dnsname bing.com
或
[System.Net.Dns]::GetHostAddresses('bing.com')
Resolve-DnsName
在 2012+ 上可用。 对于 2008R2,请使用 System.Net.DNS
。
按名称显示 Windows 防火墙规则
get-netfirewallrule -name RemoteDesktop-UserMode-In-TCP
按端口显示 Windows 防火墙规则
get-netfirewallportfilter | where {$_.localport -eq 3389} | foreach {Get-NetFirewallRule -Name $_.InstanceId} | format-list Name,Enabled,Profile,Direction,Action
或
(new-object -ComObject hnetcfg.fwpolicy2).rules | where {$_.localports -eq 3389 -and $_.direction -eq 1} | format-table Name,Enabled
Get-NetFirewallPortFilter
在 2012+ 上可用。 对于 2008R2, hnetcfg.fwpolicy2
请使用 COM 对象。
禁用 Windows 防火墙
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
Set-NetFirewallProfile
在 2012+ 上可用。 对于 2008R2,请使用 netsh advfirewall
上述 CMD 部分所引用的 。
使用 PowerShell 管理用户和组
创建本地用户帐户
new-localuser <name>
验证用户帐户是否已启用
(get-localuser | where {$_.SID -like "S-1-5-21-*-500"}).Enabled
或
(get-wmiobject Win32_UserAccount -Namespace "root\cimv2" -Filter "SID like 'S-1-5-%-500'").Disabled
Get-LocalUser
在 2012+ 上可用。 对于 2008R2,请使用 Get-WmiObject
。 此示例显示始终具有 SID S-1-5-21-*-500
的内置本地管理员帐户。 从通用化映像创建的 Azure VM 会将本地管理员帐户重命名为在 VM 预配期间指定的名称。 因此,它通常不会是 Administrator
。
将本地用户添加到本地组
add-localgroupmember -group Administrators -member <username>
启用本地用户帐户
get-localuser | where {$_.SID -like "S-1-5-21-*-500"} | enable-localuser
此示例启用始终具有 SID S-1-5-21-*-500
的内置本地管理员帐户。 从通用化映像创建的 Azure VM 会将本地管理员帐户重命名为在 VM 预配期间指定的名称。 因此,它通常不会是 Administrator
。
查看用户帐户属性
get-localuser | where {$_.SID -like "S-1-5-21-*-500"} | format-list *
或
get-wmiobject Win32_UserAccount -Namespace "root\cimv2" -Filter "SID like 'S-1-5-%-500'" | format-list Name,Disabled,Status,Lockout,Description,SID
Get-LocalUser
在 2012+ 上可用。 对于 2008R2,请使用 Get-WmiObject
。 此示例显示始终具有 SID S-1-5-21-*-500
的内置本地管理员帐户。
查看本地组
(get-localgroup).name | sort
(get-wmiobject win32_group).Name | sort
Get-LocalUser
在 2012+ 上可用。 对于 2008R2,请使用 Get-WmiObject
。
使用 PowerShell 管理 Windows 事件日志
查询事件日志错误
get-winevent -logname system -maxevents 1 -filterxpath "*[System[Level=2]]" | more
更改为 /c:10
要返回的所需事件数,或移动它以返回与筛选器匹配的所有事件。
按事件 ID 查询事件日志
get-winevent -logname system -maxevents 1 -filterxpath "*[System[EventID=11]]" | more
按事件 ID 和提供程序查询事件日志
get-winevent -logname system -maxevents 1 -filterxpath "*[System[Provider[@Name='Microsoft-Windows-Hyper-V-Netvsc'] and EventID=11]]" | more
按事件 ID 和提供程序查询过去 24 小时的事件日志
get-winevent -logname system -maxevents 1 -filterxpath "*[System[Provider[@Name='Microsoft-Windows-Hyper-V-Netvsc'] and EventID=11 and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
使用 604800000
回顾 7 天而不是 24 小时。 |
在过去 7 天内按事件 ID、提供程序和 EventData 查询事件日志
get-winevent -logname system -maxevents 1 -filterxpath "*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=4624 and TimeCreated[timediff(@SystemTime) <= 604800000]] and EventData[Data[@Name='TargetUserName']='<username>']]" | more
使用 PowerShell 查看或删除已安装的应用程序
列出已安装的软件
get-wmiobject win32_product | select installdate,name | sort installdate -descending | more
卸载软件
(get-wmiobject win32_product -filter "Name='<name>'").Uninstall()
使用 PowerShell 进行文件系统管理
获取文件版本
(get-childitem $env:windir\system32\drivers\netvsc*.sys).VersionInfo.FileVersion
此示例返回虚拟 NIC 驱动程序的文件版本,该驱动程序 netvsc.sys、netvsc63.sys 或 netvsc60.sys,具体取决于 Windows 版本。
下载并提取文件
$path='c:\bin';md $path;cd $path;(new-object net.webclient).downloadfile( ('htTp:/'+'/download.sysinternals.com/files/SysinternalsSuite.zip'),"$path\SysinternalsSuite.zip");(new-object -com shelL.apPlication).namespace($path).CopyHere( (new-object -com shelL.apPlication).namespace("$path\SysinternalsSuite.zip").Items(),16)
此示例创建一个 c:\bin
文件夹,然后将 Sysinternals 工具套件下载并提取到 中 c:\bin
。
使用 PowerShell 的其他任务
显示 OS 版本
get-wmiobject win32_operatingsystem | format-list caption,version,buildnumber
查看 OS 安装日期
(get-wmiobject win32_operatingsystem).converttodatetime((get-wmiobject win32_operatingsystem).installdate)
查看上次启动时间
(get-wmiobject win32_operatingsystem).lastbootuptime
查看 Windows 运行时间
"{0:dd}:{0:hh}:{0:mm}:{0:ss}.{0:ff}" -f ((get-date)-(get-wmiobject win32_operatingsystem).converttodatetime((get-wmiobject win32_operatingsystem).lastbootuptime))
返回运行时间,例如 <days>:<hours>:<minutes>:<seconds>:<milliseconds>
49:16:48:00.00
。
重启 Windows
restart-computer
添加 -force
将强制关闭正在运行的应用程序,而不会警告用户。
实例元数据
可以从 Azure VM 中查询 Azure 实例元数据,以查看 osType、Location、vmSize、vmId、name、resourceGroupName、subscriptionId、privateIpAddress 和 publicIpAddress 等详细信息。
查询实例元数据需要正常的来宾网络连接,因为它通过 Azure 主机对实例元数据服务进行 REST 调用。 因此,如果能够查询实例元数据,则表明来宾能够通过网络与 Azure 托管服务进行通信。
有关详细信息,请参阅 Azure 实例元数据服务。
实例元数据
$im = invoke-restmethod -headers @{"metadata"="true"} -uri http://169.254.169.254/metadata/instance?api-version=2017-08-01 -method get
$im | convertto-json
OS 类型 (实例元数据)
$im.Compute.osType
位置 (实例元数据)
$im.Compute.Location
大小 (实例元数据)
$im.Compute.vmSize
VM ID (实例元数据)
$im.Compute.vmId
VM 名称 (实例元数据)
$im.Compute.name
资源组名称 (实例元数据)
$im.Compute.resourceGroupName
订阅 ID (实例元数据)
$im.Compute.subscriptionId
标记 (实例元数据)
$im.Compute.tags
放置组 ID (实例元数据)
$im.Compute.placementGroupId
平台容错域 (实例元数据)
$im.Compute.platformFaultDomain
平台更新域 (实例元数据)
$im.Compute.platformUpdateDomain
IPv4 专用 IP 地址 (实例元数据)
$im.network.interface.ipv4.ipAddress.privateIpAddress
IPv4 公共 IP 地址 (实例元数据)
$im.network.interface.ipv4.ipAddress.publicIpAddress
IPv4 子网地址/前缀 (实例元数据)
$im.network.interface.ipv4.subnet.address
$im.network.interface.ipv4.subnet.prefix
IPv6 IP 地址 (实例元数据)
$im.network.interface.ipv6.ipAddress
MAC 地址 (实例元数据)
$im.network.interface.macAddress
后续步骤
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈