我有以下正则表达式,用于在 PowerShell 脚本中验证 Windows 用户名。
$fqusername -imatch '^\w+[\\]\w+$'
这在我自己的环境中运行良好,但我计划将其发布以供更广泛的使用,并希望确保它对其他人的验证正确。
答案1
嗯,不完全是。你会错过一些东西。
域部分:
\w+
按单词字符匹配。这是可以的,直到人们不使用 NETBIOS 名称而是使用域名(完全支持)这样才会匹配STACKOVERFLOW\Zypher
......但不是STACKOVERFLOW.COM\Zypher
因为.
会破坏匹配。
用户部分:
而 Goyuix 已经说明了哪些字符是不允许的。这暗示着所有其他字符都是允许的。一个非常常见的例子就是字符-
。因此,仅使用破折号作为示例STACKOVERFLOW\Zypher-SO
是不匹配的。
<user>@<domain>
对于用户帐户来说这也是一个有效的符号。
您想完成什么?可能有比正则表达式更好的方法。
答案2
您可能对此没有异议,但需要注意以下几点:
首先,根据这TechNet 文章中,以下是用户名中不允许使用的字符列表。PowerShell 中的内容如下:
'( ; : " <> * + = \\ | ? , )' -imatch '\w'
它返回 false,所以你\w
应该没事。
其次,作为一种可能的改进,您可以考虑将 括\w
在括号中,以便分组并轻松提取匹配的域或用户名部分。注意:它将(非常轻微地)减慢匹配速度并使用(非常轻微地)更多内存。
第三,根据 MS KB 文章938447某些字符在用户名/对象中被视为相等。快速测试显示 PowerShell 正确匹配了带有变音符号的上述字符,这些字符与您的正则表达式匹配,因此如果您使用它来创建帐户,请务必小心,因为帐户在奇怪的情况下仍可能会失败。