仅添加真实 MAC 地址
Adding only real MAC address
在工作日期间,我有现场技术人员外出,他们偶尔需要向我们在 AD 中的无线访问组添加一个 MAC 地址。我们不完全支持他们自己进入 AD,我们一直在使用脚本让他们以正确的方式添加 MAC 地址。
我已经承担起完全防止白痴这件事的责任,而且我几乎就在那里减去一个明显的问题。我无法阻止他们添加值大于 'f'.
的 MAC 地址
Write-Host "MAC Address must be entered as lowercase and without colons. EX: 14d6aa6ac9be" -ForegroundColor Yellow
$MACUserName = Read-Host -Prompt 'Please Input the MAC Address of the Device to be added to AD and press Enter'
$MACUserName = $MACUserName -replace '[\W]', ''
If ($MACUserName.Length -ne 12 -or $MACUserName -notmatch '[A-Za-z0-9]') {
Write-Host "MAC Address: " -ForegroundColor Red -NoNewline; Write-Host $MACUserName -ForegroundColor White -NoNewline; Write-Host " is not the correct length or contains invalid characters. Please verify MAC address" -ForegroundColor Red
Pause
Single-Device}
这是我目前为止所做的一切,显然这不仅仅是这一部分,但现在这是我住的地方。
我可以去掉所有可能输入的冒号,我的 -notmatch 部分包含所有可能的值。
如果我将 -notmatch '[A-Za-z0-9]'
更改为 -notmatch '[A-Fa-f0-9]'
它仍然允许我添加带有 z 和诸如此类的假 MAC 地址。我该如何限制此部分接受的字符?
我认为您应该能够为此利用 .NET PhysicalAddress Class。您可以创建一个函数来解析用户的输入:
function ParseMAC {
param([string]$mac)
try {
[pscustomobject]@{
ParsedMAC = [PhysicalAddress]::Parse($mac.ToUpper())
UserInput = $mac
}
}
catch {
Write-Warning 'Invalid MAC Address!'
}
}
$z = Read-Host 'Please Input the MAC Address of the Device to be added to AD and press Enter'
$mac = ParseMac $z
工作原理示例:
PS /> ParseMac 01-23-45-67-89-AB
ParsedMAC UserInput
--------- ---------
0123456789AB 01-23-45-67-89-AB
PS /> ParseMac 001122334455
ParsedMAC UserInput
--------- ---------
001122334455 001122334455
PS /> ParseMac f0:e1:d2:c3:b4:a5
ParsedMAC UserInput
--------- ---------
F0E1D2C3B4A5 f0:e1:d2:c3:b4:a5
PS /> ParseMac 00112233445z
WARNING: Invalid MAC Address!
来自 备注 的 PhysicalAddress.Parse(String)
的有效格式:
001122334455
00-11-22-33-44-55
0011.2233.4455
00:11:22:33:44:55
F0-E1-D2-C3-B4-A5
f0-e1-d2-c3-b4-a5
使用 .NET API.
为您的问题提供最佳解决方案
至于你试过的:
'[A-Fa-f0-9]'
匹配到指定范围内的一个个字符,也就是说输入字符串中有一个个这样的字符使表达式计算为 $true
- 即使存在这些范围之外的其他字符。
因此您必须确保组成输入字符串的所有个字符都在预期范围内:
-notmatch '^[a-f0-9]+$'
或者,反转逻辑并查找至少一个 无效 字符:
-match '[^a-f0-9]'
注:
-match
/ -notmatch
运算符默认执行子串匹配;因此,为了匹配 整个 字符串,需要开始和结束锚点 ^
和 $
。
[a-f]
足以匹配 小写和大写字母,因为 -match
/ -notmatch
是大小写-默认情况下 insensitive,因为 PowerShell 通常如此。如果需要 case-sensitive 匹配,请使用 -cmatch
/ -cnotmatch
在工作日期间,我有现场技术人员外出,他们偶尔需要向我们在 AD 中的无线访问组添加一个 MAC 地址。我们不完全支持他们自己进入 AD,我们一直在使用脚本让他们以正确的方式添加 MAC 地址。 我已经承担起完全防止白痴这件事的责任,而且我几乎就在那里减去一个明显的问题。我无法阻止他们添加值大于 'f'.
的 MAC 地址Write-Host "MAC Address must be entered as lowercase and without colons. EX: 14d6aa6ac9be" -ForegroundColor Yellow
$MACUserName = Read-Host -Prompt 'Please Input the MAC Address of the Device to be added to AD and press Enter'
$MACUserName = $MACUserName -replace '[\W]', ''
If ($MACUserName.Length -ne 12 -or $MACUserName -notmatch '[A-Za-z0-9]') {
Write-Host "MAC Address: " -ForegroundColor Red -NoNewline; Write-Host $MACUserName -ForegroundColor White -NoNewline; Write-Host " is not the correct length or contains invalid characters. Please verify MAC address" -ForegroundColor Red
Pause
Single-Device}
这是我目前为止所做的一切,显然这不仅仅是这一部分,但现在这是我住的地方。
我可以去掉所有可能输入的冒号,我的 -notmatch 部分包含所有可能的值。
如果我将 -notmatch '[A-Za-z0-9]'
更改为 -notmatch '[A-Fa-f0-9]'
它仍然允许我添加带有 z 和诸如此类的假 MAC 地址。我该如何限制此部分接受的字符?
我认为您应该能够为此利用 .NET PhysicalAddress Class。您可以创建一个函数来解析用户的输入:
function ParseMAC {
param([string]$mac)
try {
[pscustomobject]@{
ParsedMAC = [PhysicalAddress]::Parse($mac.ToUpper())
UserInput = $mac
}
}
catch {
Write-Warning 'Invalid MAC Address!'
}
}
$z = Read-Host 'Please Input the MAC Address of the Device to be added to AD and press Enter'
$mac = ParseMac $z
工作原理示例:
PS /> ParseMac 01-23-45-67-89-AB
ParsedMAC UserInput
--------- ---------
0123456789AB 01-23-45-67-89-AB
PS /> ParseMac 001122334455
ParsedMAC UserInput
--------- ---------
001122334455 001122334455
PS /> ParseMac f0:e1:d2:c3:b4:a5
ParsedMAC UserInput
--------- ---------
F0E1D2C3B4A5 f0:e1:d2:c3:b4:a5
PS /> ParseMac 00112233445z
WARNING: Invalid MAC Address!
来自 备注 的 PhysicalAddress.Parse(String)
的有效格式:
001122334455
00-11-22-33-44-55
0011.2233.4455
00:11:22:33:44:55
F0-E1-D2-C3-B4-A5
f0-e1-d2-c3-b4-a5
至于你试过的:
'[A-Fa-f0-9]'
匹配到指定范围内的一个个字符,也就是说输入字符串中有一个个这样的字符使表达式计算为 $true
- 即使存在这些范围之外的其他字符。
因此您必须确保组成输入字符串的所有个字符都在预期范围内:
-notmatch '^[a-f0-9]+$'
或者,反转逻辑并查找至少一个 无效 字符:
-match '[^a-f0-9]'
注:
-match
/-notmatch
运算符默认执行子串匹配;因此,为了匹配 整个 字符串,需要开始和结束锚点^
和$
。[a-f]
足以匹配 小写和大写字母,因为-match
/-notmatch
是大小写-默认情况下 insensitive,因为 PowerShell 通常如此。如果需要 case-sensitive 匹配,请使用-cmatch
/-cnotmatch