用于验证域\用户名的 PowerShell Regex

用于验证域\用户名的 PowerShell Regex

我有以下正则表达式,用于在 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 正确匹配了带有变音符号的上述字符,这些字符与您的正则表达式匹配,因此如果您使用它来创建帐户,请务必小心,因为帐户在奇怪的情况下仍可能会失败。

相关内容