我有以下正規表示式用於在 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 正確匹配了所提到的帶有元音變音的字元與您的正規表示式相匹配,因此,如果您使用它來建立帳戶,則在奇怪的情況下該帳戶可能仍會失敗,請務必小心。