我是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()}
而不是启用/停用的呼叫只输出以下内容(请参阅下面的行'禁用以太网'):
我做错了吗?就像我说我是powershell世界的全新,所以我不会感到惊讶...感谢您的时间和帮助:))
答案 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
时,会产生性能影响。您可能在示例中没有注意到它,但最好将-Filter
与Get-WmiObject
cmdlet一起使用。