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、、systemautodemanddisableddelayed-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\LocalServiceNT AUTHORITY\NetworkService服务帐户时,将帐户密码指定为帐户名称后最后 (第八个) 参数。

设置服务启动类型

set-service termservice -startuptype Manual

Set-service 接受 AutomaticManualDisabled 作为启动类型。

设置服务依赖项

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

后续步骤

  • main串行控制台 Windows 文档页位于此处
  • 串行控制台也可用于 Linux VM。
  • 详细了解启动诊断

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。