![Powershell 脚本用于检测热点何时被使用并编辑注册表](https://linux22.com/image/725413/Powershell%20%E8%84%9A%E6%9C%AC%E7%94%A8%E4%BA%8E%E6%A3%80%E6%B5%8B%E7%83%AD%E7%82%B9%E4%BD%95%E6%97%B6%E8%A2%AB%E4%BD%BF%E7%94%A8%E5%B9%B6%E7%BC%96%E8%BE%91%E6%B3%A8%E5%86%8C%E8%A1%A8.png)
我们遇到过这种情况,许多销售代表使用 iPhone 作为热点。这本身不是问题。但是,为了防止过度使用数据,我们希望他们在使用 iPhone 时将 Wifi 点设置为计量。同样,听起来很简单 - 对吧?进入微软,他们已锁定切换计量连接的能力到管理员帐户,因此标准用户无法使用。WTF!
没有什么大问题我可以编写脚本 — — 或者我是这么认为的!
我想要做的是检测 iPhone 何时用作热点,并更改注册表值以使其被计量。
我想到了这个:
$wlan = Netsh.exe wlan show interfaces
$regpath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\DefaultMediaCost"
$keyname = "WiFi"
$regVal = "2"
if ($wlan_.SSID -like '*iPhone*')
{Set-ItemProperty -Path $regpath -Name $keyname -Value $regval
WRITE-HOST "Set Reg Key Value"
}
else
{Set-ItemProperty -Path $regpath -Name $keyname -Value "1"
Write-Host "No change Made"
}
总体来说一切正常,而且在某种程度上确实有效。但是,我似乎无法为 IF 语句传递正确的信息
$wlan_.SSID -like '*iPhone*'
最终结果总是 False。
我尝试了 SSID、NAME、Profile - Netsh 命令返回的所有信息,但不知何故,命令返回的信息不包括这些信息。如果运行变量,您可以看到以下信息:
$wlan
There is 1 interface on the system:
Name : Wi-Fi
Description : Intel(R) Dual Band Wireless-AC 7265
GUID : ############################
Physical address : ################
State : connected
SSID : User iPhone
BSSID : ###########################
Network type : Infrastructure
Radio type : 802.11n
Authentication : WPA2-Personal
Cipher : CCMP
Connection mode : Profile
Channel : 1
Receive rate (Mbps) : 144.4
Transmit rate (Mbps) : 144.4
Signal : 99%
Profile : User iPhone
Hosted network status : Not available
我假设我遗漏了一些非常明显的东西但我认为会返回存储在那里的信息?
$wlan_.xxxxx
但事实并非如此
PS C:\WINDOWS\system32> $wlan_.SSID -like '*iPnone'
False
PS C:\WINDOWS\system32> $wlan_.name
PS C:\WINDOWS\system32> $wlan_.name -like '*iPnone'
False
PS C:\WINDOWS\system32> $wlan_.name -like 'Wi-Fi'
False
我尝试过其他信息,但没有返回真实结果,即使我知道它是正确的 - 所以我假设它正在解析信息。
任何想法都非常适用。
回答一些显而易见的问题 - 我们所有的用户都使用 iPhone,并且都被命名为“用户 iPhone”,它的目的不是捕捉所有人,而是捕捉大多数人。
答案1
要转换 netsh 字符串输出,我建议使用 cmdlet ConvertFrom-StringData
。它要求使用等号将属性与值分隔开,因此您需要一个 RegEx 来替换:
## Q:\Test\2018\08\03\sf_924794.ps1
$netSh = (Netsh.exe wlan show interfaces | Where-Object {$_ -like '* : *'}) -join "`r`n"
$Wlan = $netsh.Trim() -split '(?m)(?=^Name\b)' -ne '' | ForEach-Object {
[pscustomobject] ($_ -replace '(?m)^(.+?) +: (.+?)$','$1=$2' | ConvertFrom-StringData)
}
$Wlan | Format-Table -AutoSize
$Wlan
示例输出:
> $Wlan | Format-Table -AutoSize
Transmit rate (Mbps) Hosted network status Network type BSSID Physical address Name Description
-------------------- --------------------- ------------ ----- ---------------- ---- -----------
144.4 Not available Infrastructure ########################### ################ Wi-Fi Intel(R) Dual Band ...
> $Wlan
Transmit rate (Mbps) : 144.4
Hosted network status : Not available
Network type : Infrastructure
BSSID : ###########################
Physical address : ################
Name : Wi-Fi
Description : Intel(R) Dual Band Wireless-AC 7265
Authentication : WPA2-Personal
Receive rate (Mbps) : 144.4
Channel : 1
Cipher : CCMP
Radio type : 802.11n
Profile : User iPhone
Signal : 99%
Connection mode : Profile
State : connected
SSID : User iPhone
GUID : ############################
它们看起来非常相似,但是从不同的顺序(由于哈希表)你会看到它现在是一个具有你可以根据需要访问的属性的对象。
答案2
事实上,它将整个输出作为字符串返回,这使得这项工作变得容易 100 倍,因为我只需在字符串中搜索我需要的文本,而不必将其限制为一个对象!
最终结果是:
$wlan = Netsh.exe wlan show interfaces
然后如果 ($wlan -like 'iPhone')
在我的例子中,这对我有用。
非常感谢您的帮助,我感觉自己像个白痴,我没有意识到它是字符串!