在PowerShell中禁用以太网适配器

时间:2014-07-09 09:11:58

标签: powershell powershell-v3.0 ethernet

我是PowerShell的新手,我认为这是一个快速脚本的完美解决方案,只需点击一下即可禁用所有网络适配器。
我找到this website并按照那里描述的步骤进行操作 一切看起来都很正常,直到我调用Disable()函数。这是我的剧本:

$lan = get-wmiobject -class Win32_NetworkAdapter -namespace root\CIMV2 | where-object {$_.Name -match "Ethernet"}
$lanEnabled = $lan | % {$_.NetEnabled}
write-host "Ethernet status: " $lanEnabled
if($lanEnabled){
    write-host "Disabling Ethernet"
    $lan | % {$_.Disable()}
}
else{
    write-host "Enabling Ethernet"
    $lan | % {$_.Enable()}
}

因此% {$_.NetEnabled}会返回以太网卡的正确状态。我在控制台中看到write-host的所有输出。但拨打% {$_.Enable()}% {$_.Disable()}而不是启用/停用的呼叫只输出以下内容(请参阅下面的行'禁用以太网'): Script output

我做错了吗?就像我说我是powershell世界的全新,所以我不会感到惊讶...感谢您的时间和帮助:))

3 个答案:

答案 0 :(得分:2)

由于您将问题标记为PowerShell 3,因此您可以使用新的NetAdapter cmdlet。

Get-NetAdapter | Disable-NetAdapter -Confirm:$false

答案 1 :(得分:1)

ReturnValue表示“访问被拒绝”。

请尝试使用管理员提示。

此外,您可以通过“net helpmsg 5”检查返回值。

它对我来说非常好。

答案 2 :(得分:1)

正如Koliat所说,返回值意味着拒绝访问。对于几乎所有WMI方法,您都需要管理权限。您需要以管理员身份提升PowerShell主机并再次尝试。

另外,我稍微重写了PowerShell代码:

$lan = get-wmiobject -query "SELECT * FROM Win32_NetworkAdapter WHERE NetEnabled='True' OR NetEnabled='False'"
foreach ($adapter in $lan) {
    Switch ($adapter.NetEnabled) {
        "True" { 
            Write-Host "Disabling adapter ..."
            $adapter.Disable() 
        }
        "False" { 
            Write-Host "Enabling adapter ..."
            $adapter.Enable() 
        }
    }
}

使用WMI时,过滤对象的正确方法是使用-Filter参数。使用Where-Object时,会产生性能影响。您可能在示例中没有注意到它,但最好将-FilterGet-WmiObject cmdlet一起使用。