执行网络任务

本示例仅适用于 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-Object 的 ExpandProperty 参数查看整个地址列表 。

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-Object 的 ExcludeProperty 参数隐藏以“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'"

摘要信息是更为有用的形式,它显示下面的命令生成的 Address、ResponseTime 以及 StatusCode 属性。 Format-Table 的 Autosize 参数调整表列的大小,以使其正确显示在 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
  }

可以使用相同的命令格式对一个子网(例如使用网络号码 (192.168.1.0) 和标准 C 类子网掩码 (255.255.255.0) 的专用网)上的所有地址执行 Ping 操作。仅在 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_NetworkAdapterConfiguration 的 SetDNSDomain 方法。 Invoke-CimMethod 的 Query 参数采用 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 的 Property 参数来仅显示那些属性:

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 方法。 这两种方法的使用方式相同。 一般情况下,在仅需释放或续订特定子网上的适配器地址时使用这些方法。 在子网上筛选器适配器的最简单方法是仅选择使用该子网的网关的适配器配置。 例如,下面的命令释放本地计算机上适配器上的所有 DHCP 租约,这些适配器正在从 192.168.1.254 获得 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_Share 的 Create 方法:

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'
}

这等效于 Window 上的以下 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 的默认行为。 有关详细信息,请参阅以下文章: