2014-07-09 27 views
1

我對powershell相當陌生,我認爲這是一個快速腳本的完美解決方案,只需單擊一次即可禁用所有網絡適配器。
我發現this website並遵循了那裏描述的步驟。
一切看起來不錯,直到我叫Disable()功能。這裏是我的腳本:在PowerShell中禁用以太網適配器

$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的世界,所以我不會感到驚訝你的時間...感謝幫助:)

回答

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是最佳做法。

+0

如果我弄錯了,請糾正我的錯誤,但性能問題是由'Where-object'導致的,因爲它傳遞了一個完整的查詢,而WMI'-Filter'導致它在運行中過濾掉? – Koliat

+0

這是正確的。另外,當你使用'-Filter'時,過濾發生在遠程系統上。如果使用WMI cmdlet查詢遠程系統,則不希望通過線路傳輸所有對象,然後在本地系統中進行篩選。 – ravikanth

+0

我意識到我沒有工作,因爲我不得不以管理員身份運行它。儘管如此,你的代碼更好,所以我會接受它作爲答案:)謝謝:) –

2

既然你已被標籤爲PowerShell的3,你可以使用新的cmdlet NetAdapter問題。

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

NetAdapter cmdlet僅在Windows 8和Windows Server 2012及更高版本中可用。 – ravikanth

1

ReturnValue表示「訪問被拒絕」。

請試試管理提示。

另外,你可以通過「net helpmsg 5」來檢查返回值。

它對我來說工作得很好。

相關問題