我有以下的正则expression式在PowerShell脚本中validationWindows用户名。
$fqusername -imatch '^\w+[\\]\w+$'
这在我自己的环境中工作得很好,但是我正计划将其发布以供更广泛的使用,并且要确保为其他人正确validation。
那么,不完全。 你会错过一些事情。
域名部分:
\w+匹配单词字符。 这是好的,直到人没有使用NETBIOS名称,但使用域名(完全支持),以便匹配STACKOVERFLOW\Zypher …但不是STACKOVERFLOW.COM\Zypher因为. 将甩掉匹配。
用户部分:
而Goyuix已经说明了什么字符是不允许的。 那些含糊其辞的是所有其他人物都是允许的。 一个非常常见的例子是-字符。 因此,只需使用破折号作为示例STACKOVERFLOW\Zypher-SO不会匹配。
此外, <user>@<domain>也是用户帐户的有效表示法。
你想要完成什么,可能比正则expression式更好。
你可能会很好,虽然有几件事要注意:
首先,根据此 TechNet文章,以下是用户名中不允许使用的字符列表。 这里是在PowerShell中:
'( ; : " <> * + = \\ | ? , )' -imatch '\w'
它返回false,所以你的\w应该没问题。
其次,作为一种可能的改进,您可以考虑将\w括在圆括号中,以便分组和简单提取匹配的域或用户名部分。 注意:它会(非常轻微地)减慢匹配并使用(非常轻微)更多的内存。
第三,根据MS KB第938447条,某些字符在用户名/对象中被视为相同。 一个快速testing显示PowerShell正确地匹配提到的字符与元音变音匹配您的正则expression式,所以要小心,如果您使用它来创build帐户,该帐户可能仍然在奇怪的情况下失败。