执行网络任务

此示例仅适用于 Windows 平台。

由于 TCP/IP 是最常用的网络协议,因此大多数低级别网络协议管理任务涉及 TCP/IP。 在本部分中,我们使用 PowerShell 和 WMI 来执行这些任务。

列出计算机的 IP 地址

若要获取本地计算机上使用的所有 IP 地址,请使用以下命令:

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=$true |
    Select-Object -ExpandProperty IPAddress

由于 Win32_NetworkAdapterConfiguration 对象的 IPAddress 属性是数组,因此必须使用 Select-ObjectExpandProperty 参数来查看整个地址列表。

10.0.0.1
fe80::60ea:29a7:a233:7cb7
2601:600:a27f:a470:f532:6451:5630:ec8b
2601:600:a27f:a470:e167:477d:6c5c:342d
2601:600:a27f:a470:b021:7f0d:eab9:6299
2601:600:a27f:a470:a40e:ebce:1a8c:a2f3
2601:600:a27f:a470:613c:12a2:e0e0:bd89
2601:600:a27f:a470:444f:17ec:b463:7edd
2601:600:a27f:a470:10fd:7063:28e9:c9f3
2601:600:a27f:a470:60ea:29a7:a233:7cb7
2601:600:a27f:a470::2ec1

使用 Get-Member cmdlet,可以看到 IPAddress 属性是数组:

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=$true |
    Get-Member -Name IPAddress
   TypeName: Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_NetworkAdapterConfiguration

Name      MemberType Definition
----      ---------- ----------
IPAddress Property   string[] IPAddress {get;}

每个网络适配器的 IPAddress 属性实际上是一个数组。 定义中的大括号表示 IPAddress 不是 System.String 值,而是 System.String 值的数组。

列出 IP 配置数据

若要显示每个网络适配器的详细 IP 配置数据,请使用以下命令:

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=$true

网络适配器配置对象的默认显示是一组非常减少的可用信息。 若要进行深入检查和故障排除,请使用 Select-Object 或格式化 cmdlet(如 Format-List)指定要显示的属性。

在新式 TCP/IP 网络中,你可能对 IPX 或 WINS 属性不感兴趣。 可以使用 Select-ObjectExcludeProperty 参数隐藏名称以“WINS”或“IPX”开头的属性。

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=$true |
    Select-Object -ExcludeProperty IPX*,WINS*

此命令返回有关 DHCP、DNS、路由和其他次要 IP 配置属性的详细信息。

Ping 计算机

可以使用 Win32_PingStatus对计算机执行简单的ping操作。 以下命令执行 ping,但返回较长的输出:

Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'"

来自 Win32_PingStatus 的响应包含 29 个属性。 可以使用 Format-Table 选择最感兴趣的属性。 自动调整大小的 参数 Format-Table 重新调整表列的大小,使其能在 PowerShell 中正确显示。

Get-CimInstance -Class Win32_PingStatus -Filter "Address='127.0.0.1'" |
    Format-Table -Property Address,ResponseTime,StatusCode -Autosize
Address   ResponseTime StatusCode
-------   ------------ ----------
127.0.0.1            0          0

StatusCode 为 0 表示 ping 成功。

可以使用数组通过一个命令同时对多台计算机执行ping操作。 由于有多个地址,因此请使用 ForEach-Object 单独 ping 每个地址:

'127.0.0.1','localhost','bing.com' |
  ForEach-Object -Process {
    Get-CimInstance -Class Win32_PingStatus -Filter ("Address='$_'") |
      Select-Object -Property Address,ResponseTime,StatusCode
  }

可以使用相同的命令格式对子网上的所有地址执行 ping作,例如使用网络编号 192.168.1.0 和标准类 C 子网掩码(255.255.255.0)的专用网络)。 只有 192.168.1.1 到 192.168.1.254 范围内的地址是合法的本地地址(0 始终保留为网络编号,255 是子网广播地址)。

若要在 PowerShell 中表示从 1 到 254 的数字数组,请使用表达式 1..254。 要执行完整的子网 ping,可以在 ping 语句中将范围内的每个值添加到部分地址:

1..254| ForEach-Object -Process {
  Get-CimInstance -Class Win32_PingStatus -Filter ("Address='192.168.1.$_'") } |
    Select-Object -Property Address,ResponseTime,StatusCode

请注意,用于生成一系列地址的技术也可以在其他位置使用。 可以采用以下方式生成一组完整的地址:

$ips = 1..254 | ForEach-Object -Process {'192.168.1.' + $_}

检索网络适配器属性

前面我们提到,可以使用 Win32_NetworkAdapterConfiguration 类检索常规配置属性。 虽然不是严格 TCP/IP 信息,但网络适配器信息(如 MAC 地址和适配器类型)对于了解计算机发生的情况非常有用。 若要获取此信息的摘要,请使用以下命令:

Get-CimInstance -Class Win32_NetworkAdapter -ComputerName .

为网络适配器分配 DNS 域

若要为 DNS 域分配自动名称解析,请使用 Win32_NetworkAdapterConfigurationSetDNSDomain 方法。 Invoke-CimMethodQuery 参数采用 WQL 查询字符串。 该 cmdlet 会调用查询返回的每个实例上指定的方法。

$wql = 'SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True'
$args = @{ DnsDomain = 'fabrikam.com'}
Invoke-CimMethod -MethodName SetDNSDomain -Arguments $args -Query $wql

必须筛选 IPEnabled=True,因为即使在仅使用 TCP/IP 的网络上,计算机上的多个网络适配器配置并不是真正的 TCP/IP 适配器。 它们是所有适配器支持 RAS、VPN、QoS 和其他服务的常规软件元素,因此没有自己的地址。

执行 DHCP 配置任务

修改 DHCP 详细信息涉及使用一组网络适配器,就像 DNS 配置一样。 可以使用 WMI 执行多个不同的动作。

查找已启用 DHCP 的适配器

若要在计算机上查找已启用 DHCP 的适配器,请使用以下命令:

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true"

若要排除 IP 配置问题的适配器,只能检索启用了 IP 的适配器:

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=$true and DHCPEnabled=$true"

检索 DHCP 属性

由于适配器的 DHCP 相关属性通常以 DHCP开头,因此可以使用 Format-Table 的属性参数仅显示这些属性:

Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter  "IPEnabled=$true and DHCPEnabled=$true" |
  Format-Table -Property DHCP*

在每个适配器上启用 DHCP

若要在所有适配器上启用 DHCP,请使用以下命令:

$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE IPEnabled=True and DHCPEnabled=False'
Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql

通过使用过滤器语句 IPEnabled=True and DHCPEnabled=False,可以避免在已经启用了 DHCP 的地方再次启用 DHCP。

在特定适配器上释放和续订 DHCP 租约

Win32_NetworkAdapterConfiguration 类的实例具有 ReleaseDHCPLeaseRenewDHCPLease 方法。 两者都以相同的方式使用。 一般情况下,如果只需要在特定子网上释放或续订适配器的地址,请使用这些方法。 筛选子网上的适配器的最简单方法是仅选择使用该子网网关的适配器配置。 例如,以下命令释放从 192.168.1.254 获取 DHCP 租约的本地计算机上的适配器上的所有 DHCP 租约:

$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE DHCPServer="192.168.1.1"'
Invoke-CimMethod -MethodName ReleaseDHCPLease -Query $wql

续订 DHCP 租约的唯一更改是使用 RenewDHCPLease 方法而不是 ReleaseDHCPLease 方法:

$wql = 'SELECT * from Win32_NetworkAdapterConfiguration WHERE DHCPServer="192.168.1.1"'
Invoke-CimMethod -MethodName RenewDHCPLease -Query $wql

注释

在远程计算机上使用这些方法时,请注意,如果通过已释放或续订租约的适配器连接到远程系统,则无法访问远程系统。

在所有适配器上释放和续订 DHCP 租约

可以使用 Win32_NetworkAdapterConfiguration 方法、ReleaseDHCPLeaseAllRenewDHCPLeaseAll对所有适配器执行全局 DHCP 地址发布或续订。 但是,该命令必须应用于 WMI 类,而不是特定适配器,因为全局释放和续订租约是在类上执行的,而不是在特定适配器上执行的。 Invoke-CimMethod cmdlet 可以调用类的方法。

Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName ReleaseDHCPLeaseAll

可以使用相同的命令格式调用 RenewDHCPLeaseAll 方法:

Invoke-CimMethod -ClassName Win32_NetworkAdapterConfiguration -MethodName RenewDHCPLeaseAll

创建网络共享

若要创建网络共享,请使用 Win32_ShareCreate 方法:

Invoke-CimMethod -ClassName Win32_Share -MethodName Create -Arguments @{
    Path = 'C:\temp'
    Name = 'TempShare'
    Type = [uint32]0 #Disk Drive
    MaximumAllowed = [uint32]25
    Description = 'test share of the temp folder'
}

这等效于 Windows 上的以下 net share 命令:

net share tempshare=c:\temp /users:25 /remark:"test share of the temp folder"

若要调用采用参数的 WMI 类的方法,必须知道哪些参数可用,以及这些参数的类型。 例如,可以使用以下命令列出 Win32_Class 的方法:

(Get-CimClass -ClassName Win32_Share).CimClassMethods
Name          ReturnType Parameters                                   Qualifiers
----          ---------- ----------                                   ----------
Create            UInt32 {Access, Description, MaximumAllowed, Name…} {Constructor, Implemented, MappingStrings, Stati…
SetShareInfo      UInt32 {Access, Description, MaximumAllowed}        {Implemented, MappingStrings}
GetAccessMask     UInt32 {}                                           {Implemented, MappingStrings}
Delete            UInt32 {}                                           {Destructor, Implemented, MappingStrings}

使用以下命令列出 Create 方法的参数。

(Get-CimClass -ClassName Win32_Share).CimClassMethods['Create'].Parameters
Name            CimType Qualifiers                                  ReferenceClassName
----            ------- ----------                                  ------------------
Access         Instance {EmbeddedInstance, ID, In, MappingStrings…}
Description      String {ID, In, MappingStrings, Optional}
MaximumAllowed   UInt32 {ID, In, MappingStrings, Optional}
Name             String {ID, In, MappingStrings}
Password         String {ID, In, MappingStrings, Optional}
Path             String {ID, In, MappingStrings}
Type             UInt32 {ID, In, MappingStrings}

您还可以阅读 Win32_Share 类的 Create 方法的文档。

删除网络共享

可以使用 Win32_Share删除网络共享,但该过程与创建共享略有不同,因为需要检索要删除的特定实例,而不是 Win32_Share 类。 以下示例删除共享 TempShare

$wql = 'SELECT * from Win32_Share WHERE Name="TempShare"'
Invoke-CimMethod -MethodName Delete -Query $wql

连接 Windows 可访问的网络驱动器

New-PSDrive cmdlet 可以创建一个映射到网络共享的 PowerShell 虚拟驱动器。

New-PSDrive -Name "X" -PSProvider "FileSystem" -Root "\\Server01\Public"

但是,以这种方式创建的驱动器仅适用于创建驱动器的 PowerShell 会话。 若要映射在 PowerShell 之外或其他 PowerShell 会话中可用的驱动器,必须使用 Persist 参数。

New-PSDrive -Persist -Name "X" -PSProvider "FileSystem" -Root "\\Server01\Public"

注意

在提升的上下文中运行时,永久性映射驱动器可能不可用。 这是 Windows UAC 的默认行为。 有关详细信息,请参阅以下文章: