如何使用 CMD 和 PowerShell Windows 命令

适用于: ✔️ Windows VM

本文提供了一些示例命令,用于在必须使用特殊管理控制台(SAC)访问 Windows 虚拟机(VM)的情况下执行常见任务。 例如,可能需要使用 SAC 排查 RDP 连接故障。

自 Windows Server 2003 以来,SAC 包含在 Windows 的所有版本中。 但是,默认情况下,它处于禁用状态。 SAC 依赖于 sacdrv.sys 内核驱动程序、 Special Administration Console Helper 服务(sacsvr)和 sacsess.exe 进程。 有关详细信息,请参阅 紧急管理服务工具和设置

使用 SAC,可以通过串行端口连接到正在运行的 OS。 在 SAC 中打开命令提示符窗口时,sacsess.exe 会在您正在运行的操作系统中启动 cmd.exe。 在任务管理器中,你可以看到,如果同时通过 RDP 连接到你的虚拟机,那么你现在通过串行控制台功能连接到 SAC。 通过 SAC 访问的 CMD 窗口与 cmd.exe 通过 RDP 连接时使用的窗口相同。 所有相同的命令和工具都可用,包括从该 CMD 实例启动 PowerShell 的功能。 SAC 与 Windows 恢复环境(WinRE)之间的主要区别在于,SAC 允许你管理正在运行的 OS,但 WinRE 会启动到不同的最小作系统。 尽管 Azure VM 不支持访问 WinRE 的功能,但它们可以通过 SAC 进行管理。

由于 SAC 限制为 80x24 像素屏幕缓冲区,没有回退功能,因此请添加到 | more 命令,以便一次显示一页的输出。 用于 <spacebar> 查看下一页,或 <enter> 查看下一行。

串行控制台窗口的粘贴快捷方式为 SHIFT+INSERT

由于 SAC 的屏幕缓冲区有限,通过将命令从本地文本编辑器复制到 SAC,可以更轻松地管理更长的命令。

将 CMD 用于 Windows 注册表设置

若要使用 CMD 查看和编辑 Windows 注册表设置,请执行以下步骤:

  1. 验证是否已启用 RDP。 运行以下命令:

    reg query “HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections

    reg query “HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services” /v fDenyTSConnections

    注意: 仅当配置了相关的组策略设置时,才存在第二个键(在 \Policies 下)。

  2. 通过运行以下命令启用 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 服务

若要使用 CMD 管理 Windows 服务,请执行以下步骤:

  1. 查看服务状态:

    sc query termservice

  2. 查看服务登录帐户:

    sc qc termservice

  3. 设置服务登录帐户:

    sc config termservice obj= "NT Authority\NetworkService"

    注意: 等号后需要空格。

  4. 设置服务启动类型:

    sc config termservice start= demand

    注意: 等号后需要空格。 可能的起始值包括:boot、、systemautodemand、和disableddelayed-auto

  5. 设置服务依赖项:

    sc config termservice depend= RPCSS

    注意: 等号后需要空格。

  6. 通过运行以下命令之一启动服务:

    net start termservice

    sc start termservice

  7. 通过运行以下命令之一来停止服务:

    net stop termservice

    sc stop termservice

使用 CMD 管理网络功能

若要使用 CMD 管理网络功能,请执行以下步骤:

  1. 显示 netsh 网络属性:

    netsh interface show interface

  2. 显示 IP 属性:

    netsh interface ip show config

  3. 显示 IPSec 配置:

    netsh nap client show configuration

  4. 启用网络命令行接口:

    netsh interface set interface name="<interface name>" admin=enabled

  5. 将 netsh 接口设置为使用 DHCP:

    netsh interface ip set address name="<interface name>" source=dhcp

有关详细信息netsh,请参阅 Network shell (netsh)。

应始终在来宾 OS 中配置 Azure VM,以使用 DHCP 获取 IP 地址。 Azure 静态 IP 设置仍使用 DHCP 向 VM 提供静态 IP。

Ping

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 来回顾七天,而不是 24 小时。

在过去七天内按事件 ID、提供程序和事件数据查询事件日志

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

此示例返回虚拟网络适配器驱动程序的文件版本,该驱动程序 netvsc.sys、netvsc63.sys或 netvsc60.sys,具体取决于 Windows 版本。

扫描系统文件损坏

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父文件夹。 例如,如果以前保存了\MachineKeys的权限,请使用\RSA

获取文件夹的 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 模块。 在 SAC 的 PowerShell 会话中运行 PSReadLine 时,有一个已知问题会导致粘贴自剪贴板的文本可能引入多余字符。

首先检查 PSReadLine 是否已加载。 它默认在 Windows Server 2016、Windows 10 和更高版本的 Windows 上加载。 仅当 Windows 早期版本手动安装时,它才会存在。

如果此命令返回没有输出的提示,则模块未加载,你可以像平常一样继续使用 SAC 中的 PowerShell 会话。

get-module psreadline

如果上一个命令返回 PSReadLine 模块版本,请运行以下命令以卸载它。 此命令不会删除或卸载模块。 它仅从当前 PowerShell 会话中卸载它。

remove-module psreadline

如果加载 PSReadLine,则粘贴文本时可能会引入额外的字符。 若要避免这种情况,请使用 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')

使用除其他服务帐户以外的NT AUTHORITY\LocalServiceNT AUTHORITY\NetworkService服务帐户时,或者LocalSystem将帐户密码指定为帐户名称后面的最后一个(第八个)参数。

设置服务启动类型

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 管理网络功能

显示网络适配器属性

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 及更高版本,对于 2008 R2,请使用Get-WmiObject

显示 IP 属性

get-wmiobject Win32_NetworkAdapterConfiguration -filter "ServiceName='netvsc'" | format-list DNSHostName,IPAddress,DHCPEnabled,IPSubnet,DefaultIPGateway,MACAddress,DHCPServer,DNSServerSearchOrder

启用网络适配器

get-netadapter | where {$_.ifdesc.startswith('Microsoft Hyper-V Network Adapter')} | enable-netadapter

(get-wmiobject win32_networkadapter -filter "servicename='netvsc'").enable()

Get-NetAdapter适用于 2012 及更高版本,而对于 2008 R2,请使用Get-WmiObject

将网络适配器设置为使用 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 及更高版本中提供。 对于 2008 R2,请使用 Get-WmiObject。 应始终在来宾 OS 中配置 Azure VM,以使用 DHCP 获取 IP 地址。 Azure 静态 IP 设置仍使用 DHCP 向 VM 提供 IP。

Ping

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 及更高版本中可用。 对于 2008 R2,请按照第二个示例使用 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 及更高版本中提供。 对于 2008 R2,请使用 Net.Sockets.TcpClient

测试 DNS 名称解析

resolve-dnsname bing.com

[System.Net.Dns]::GetHostAddresses('bing.com')

Resolve-DnsName 在 2012 及更高版本中提供。 对于 2008 R2,请使用 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 及更高版本中提供。 对于 2008 R2,请使用 hnetcfg.fwpolicy2 COM 对象。

禁用 Windows 防火墙

Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

Set-NetFirewallProfile 在 2012 及更高版本中提供。 对于 2008 R2,请使用 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 及更高版本中提供。 对于 2008 R2,请使用 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 及更高版本中提供。 对于 2008 R2,请使用 Get-WmiObject。 此示例显示了内置的本地管理员帐户。 此帐户始终具有 SID S-1-5-21-*-500

查看本地组

(get-localgroup).name | sort (get-wmiobject win32_group).Name | sort

Get-LocalUser 在 2012 及更高版本中提供。 对于 2008 R2,请使用 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 来回顾七天,而不是 24 小时。 |

在过去七天内按事件 ID、提供程序和事件数据查询事件日志

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 查看或删除 iInstalled 应用程序

列出已安装的软件

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 反馈社区