大多数低级网络协议管理任务都涉及 TCP/IP,因为 TCP/IP 是最常用的网络协议。我们将看一看如何使用 WMI 从 Windows PowerShell 完成其中的一些任务。
使用以下命令可以返回计算机正使用的所有 IP 地址:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Select-Object -Property IPAddress<o:p></o:p> |
<o:p> </o:p>
此命令的输出与大多数属性列表不同,因为值将括在方括号中:
IPAddress
---------
{192.168.1.80}
{192.168.148.1}
{192.168.171.1}
{0.0.0.0}
若要了解为什么将它们括在方括号中,可以使用 Get-Member 仔细地查看 IPAddress 属性:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Get-Member -Name IPAddress
<o:p> </o:p>
<o:p> </o:p>
TypeName:System.Management.ManagementObject#root\cimv2\Win32_NetworkAdapter
Configuration
<o:p> </o:p>
Name MemberType Definition
---- ---------- ----------
IPAddress Property System.String[] IPAddress {get;}
每个网络适配器的 IPAddress 属性实际上是一个数组。定义中的大括号指示 IPAddress 不是 System.String 值,而是 System.String 值的数组。
可以使用 Select-Object ExpandProperty 参数扩展这些值:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Select-Object -ExpandProperty IPAddress<o:p></o:p> 192.168.1.80<o:p></o:p> 192.168.148.1<o:p></o:p> 192.168.171.1<o:p></o:p> 0.0.0.0<o:p></o:p> |
<o:p> </o:p>
若要为每个网络适配器显示详细的 IP 配置数据,可以使用以下命令:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .<o:p></o:p> |
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
网络适配器配置的默认显示是非常精简的一组可用信息。有关深入检查和疑难解答,请使用 Select-Object 强制显示更多属性。如果对 IPX 或 WINS 属性不感兴趣(很可能是在使用现代 TCP/IP 网络的情况下),也可以排除以 WINS 或 IPX 开头的所有属性:<o:p></o:p>
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .| Select-Object -Property [a-z]* -ExcludeProperty IPX*,WINS*<o:p></o:p>
此命令将返回有关 DHCP、DNS、路由和其他次要 IP 配置属性的详细信息。<o:p></o:p>
<o:p> </o:p>
可以使用 Win32_PingStatus 对计算机执行简单的 <st1:place w:st="on">Ping</st1:place> 操作。以下命令将执行 Ping 操作,但是返回冗长的输出:
Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName .<o:p></o:p> |
<o:p> </o:p>
摘要信息的更有用形式是仅显示 Address、ResponseTime 和 StatusCode 属性:
PS> Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName .| Select-Object -Property Address,ResponseTime,StatusCode<o:p></o:p> <o:p> </o:p> Address ResponseTime StatusCode<o:p></o:p> ------- ------------ ----------<o:p></o:p> 127.0.0.1 0 0<o:p></o:p> |
<o:p> </o:p>
状态代码 0 指示 <st1:place w:st="on">Ping</st1:place> 操作成功。
可以使用数组对整个系列的计算机执行 <st1:place w:st="on">Ping</st1:place> 操作。因为此处使用多个地址,所以需要使用 ForEach-Object 分别对每个地址执行 Ping 操作:
"127.0.0.1","localhost","research.microsoft.com" | ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter ("Address='" + $_ + "'") -ComputerName .}| Select-Object -Property Address,ResponseTime,StatusCode<o:p></o:p> |
<o:p> </o:p>
可以使用相同的过程对整个子网执行 <st1:place w:st="on">Ping</st1:place> 操作。例如,若要检查使用网络号 192.168.1.0 的专用网络,并使用标准的 C 类子网掩码 (255.255.255.0),则只有 192.168.1.1 到 192.168.1.254 的范围内的地址才是合法的本地地址(0 始终是为网络号保留的,255 是子网广播地址)。
可以在 Windows PowerShell 中使用语句 1..254 获取从 1 到 254 的数字的数组,因此通过生成该数组并将值添加到 Ping 语句中的部分地址,可以对完整子网执行 Ping 操作:
1..254| ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter ("Address='192.168.1."+ $_ + "'") -ComputerName .}| Select-Object -Property Address,ResponseTime,StatusCode<o:p></o:p> |
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
该生成地址范围的方法也可以在别处使用。可以使用此方法生成一组完整地址:<o:p></o:p>
$ips = 1..254 | ForEach-Object -Process {"192.168.1." + $_}<o:p></o:p>
<o:p> </o:p>
本入门中前面已经提到,可以使用 Win32_NetworkAdapterConfiguration 检索常规配置属性。虽然不是严格的 TCP/IP 信息,但是诸如 MAC 地址和适配器类型的网络适配器信息对于了解计算机的当前状况是很有用的。可以使用以下命令获取此信息的摘要:
Get-WmiObject -Class Win32_NetworkAdapter -ComputerName .<o:p></o:p> |
<o:p> </o:p>
可以使用 Win32_NetworkAdapterConfiguration SetDNSDomain 方法自动完成要在自动名称解析中使用的 DNS 域的指定。因为独立地为每个网络适配器配置指定 DNS 域,所以需要使用 ForEach-Object 语句来确保逐个选择适配器:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName .| ForEach-Object -Process { $_.InvokeMethod("SetDNSDomain", "fabrikam.com")}<o:p></o:p> |
<o:p> </o:p>
在此处使用了筛选语句 IPEnabled=true,因为甚至在仅使用 TCP/IP 的网络上,计算机上的几个网络适配器配置也不是真正的 TCP/IP 适配器;它们是支持用于所有适配器的 RAS、PPTP、QoS 和其他服务的常规软件元素,因此没有它们自己的地址。
可以使用 Where-Object 而不是 Get-WmiObject Filter 筛选该命令:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName .| Where-Object -FilterScript {$_.IPEnabled} | ForEach-Object -Process {$_.InvokeMethod("SetDNSDomain", "fabrikam.com")}<o:p></o:p> |
<o:p> </o:p>
修改 DHCP 详细信息涉及使用一组适配器,就像 DNS 配置一样。有数个可以使用 WMI 执行的不同操作,我们将介绍其中的几个常见任务。
使用以下命令,可以在计算机上查找启用 DHCP 的适配器:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName .<o:p></o:p> |
<o:p> </o:p>
如果不查找有 IP 配置问题的适配器,则可以进一步将此限制为仅查找启用 IP 的适配器:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName .<o:p></o:p> |
<o:p> </o:p>
适配器的 DHCP 相关属性通常以 DHCP 开头,因此可以添加管道元素 Select-Object -Property DHCP* 以查看适配器的摘要 DHCP 信息:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName .| Select-Object -Property DHCP*<o:p></o:p> |
<o:p> </o:p>
若要在所有适配器上全局启用 DHCP,请使用
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName .| ForEach-Object -Process {$_.InvokeMethod("EnableDHCP", $null)}<o:p></o:p> |
<o:p> </o:p>
可以改用 Filter 语句“IPEnabled=true and DHCPEnabled=false”,以免在已经启用 DHCP 处启用它,但是省略此步骤不会导致任何错误。
Win32_NetworkAdapterConfiguration 具有 ReleaseDHCPLease 和 RenewDHCPLease 方法。它们的使用方式是相同的。通常,如果仅需要为特定子网上的某个适配器解除或续订地址,则需要使用这些方法。筛选子网上适配器的最简单方法是,仅选择使用该子网网关的适配器配置。例如,以下命令将对本地计算机上正从 192.168.1.254 获取 DHCP 租约的适配器解除所有 DHCP 租约:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName .| Where-Object -FilterScript {$_.DHCPServer -contains "192.168.1.254"} | ForEach-Object -Process {$_.InvokeMethod("ReleaseDHCPLease",$null)}<o:p></o:p> |
<o:p> </o:p>
续订 DHCP 租约时的唯一更改是,调用 RenewDHCPLease 而不是 ReleaseDHCPLease:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName .| Where-Object -FilterScript {$_.DHCPServer -contains "192.168.1.254"} | ForEach-Object -Process {$_.InvokeMethod("ReleaseDHCPLease",$null)}<o:p></o:p> |
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
对远程计算机使用这些方法时,如果是通过解除或续订租约的适配器连接到远程计算机的,则可能失去对远程计算机的访问。<o:p></o:p>
使用 Win32_NetworkAdapterConfiguration 的 ReleaseDHCPLeaseAll 和 RenewDHCPLeaseAll 方法,可以对所有适配器执行全局 DHCP 地址解除或续订。但是,该命令必须适用于 WMI 类,而不是特定的适配器,因为全局解除和续订租约是对类执行的,而不是对特定适配器执行的。
通过列出所有 WMI 类,然后按名称仅选择所需类,可以获取对 WMI 类而不是类实例的引用。例如,以下命令返回 Win32_NetworkAdapterConfiguration 类:
Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"}<o:p></o:p> |
<o:p> </o:p>
可以将整个命令视为类,然后对它调用 ReleaseDHCPAdapterLease 方法。在以下命令中,Get-WmiObject 和 Where-Object 管道元素括在圆括号中;这将强制首先计算它们:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"} ) .InvokeMethod("ReleaseDHCPLeaseAll", $null)<o:p></o:p> |
<o:p> </o:p>
可以使用相同的命令格式调用 RenewDHCPLeaseAll 方法:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"} ) .InvokeMethod("RenewDHCPLeaseAll", $null)<o:p></o:p> |
<o:p> </o:p>
可以使用 Win32_Share Create 方法创建网络共享:
(Get-WmiObject -List -ComputerName .| Where-Object -FilterScript {$_.Name -eq "Win32_Share"}).InvokeMethod("Create",("C:\temp","TempShare",0,25,"test share of the temp folder"))<o:p></o:p> |
<o:p> </o:p>
也可以在 Windows PowerShell 中使用 net share 创建共享
net share tempshare=c:\temp /users:25 /remark:"test share of the temp folder"<o:p></o:p> |
<o:p> </o:p>
可以使用 Win32_Share 删除网络共享,但是该过程与创建共享稍有不同,因为需要检索要删除的特定共享,而不是 Win32_Share 类。以下语句将删除共享“TempShare”:
(Get-WmiObject -Class Win32_Share -ComputerName .-Filter "Name='TempShare'").InvokeMethod("Delete",$null)<o:p></o:p> |
<o:p> </o:p>
也可以使用 Net share 删除它:
PS> net share tempshare /delete<o:p></o:p> tempshare 已成功删除。<o:p></o:p> |
<o:p> </o:p>
使用 New-PSDrive 可以创建 Windows PowerShell 驱动器,但是这样创建的驱动器仅对 Windows PowerShell 可用。若要创建新的网络驱动器,可以使用 WScript.Network COM 对象。以下命令将共享 \\FPS01\users 映射到本地驱动器 B:
(New-Object -ComObject WScript.Network).MapNetworkDrive("B:", "\\FPS01\users")<o:p></o:p> |
<o:p> </o:p>
也可以使用 net use 命令做到这一点:
net use B:\\FPS01\users<o:p></o:p> |
<o:p> </o:p>
使用 WScript.Network 或 net use 映射的驱动器立即对 Windows PowerShell 可用。