これはユーザーの間では一般的ではないかもしれませんが、確かに知ることができる唯一の方法は、を使用したSQLログインごとにパスワードを強制的に変更することですCHECK_POLICY = ON
。これによりALTER LOGIN
、空白のパスワードを使用して一連のコマンドが生成されます。クエリを更新して、すべてに共通のパスワードを与えるか、個々のパスワードを使用して各コマンドを手動で更新できます。ポリシーに準拠していることを確認してください。もちろん、パスワードポリシーが期待どおりに複雑で、有効になっていることを確認する必要があります(コントロールパネル>管理ツール>ローカルセキュリティポリシー>アカウントポリシー>パスワードポリシー>パスワードは複雑さの要件を満たす必要があります)。
SELECT N'ALTER LOGIN ' + QUOTENAME(name)
+ N' WITH PASSWORD = N'''' MUST_CHANGE, CHECK_POLICY = ON;'
FROM sys.sql_logins
--WHERE is_policy_checked = 0;
Steve Jonesがしばらく前にこれについて書いています。-以下で明らかにしたことによりis_policy_checked = 1
、ハッシュが作成されたパスワードでログインが作成された可能性があるため、パスワードが実際の現在のポリシーを満たしているとは言えません(この場合、プレーンテキストのパスワードはオンにした場合)またはローカルの複雑性ポリシーが無効になっている間(それでもにつながりますis_policy_checked = 1
)。
私がうまくいくと思った別のアプローチは、現在とですべてのログインのコピーを作成し、失敗したすべてのログインを書き留めることです。ただし、これは機能しません -を使用しても、すでにハッシュされたパスワードの検証は実行されません。後世のコードを含めますが、仕様上、ポリシーを確認することはできません。password_hash
CHECK_POLICY = ON
CHECK_POLICY = ON
SELECT N'BEGIN TRY
CREATE LOGIN ' + QUOTENAME(N'copy_of_' + name)
+ N' WITH PASSWORD = '
+ CONVERT(NVARCHAR(255), password_hash, 1)
+ ' HASHED, CHECK_POLICY = ON;
DROP LOGIN ' + QUOTENAME(N'copy_of_' + name) + ';
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 15118
PRINT N''' + REPLACE(name, '''', '''''')
+ N' was not complex enough.'';
END CATCH'
FROM sys.sql_logins;
個人的にはバグだと思います。構文でハッシュ化されたパスワードを使用してログインを作成でき、そのパスワードが複雑性ポリシーを満たす必要があると規定できる場合、ポリシーが実際にはチェックされなかったというエラーまたは警告が生成されます。
更新:この動作に対してバグを報告しました。