Это может быть не очень популярно среди ваших пользователей, но я верю, что единственный способ узнать наверняка - принудительно менять пароль для каждого входа в 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;
Стив Джонс писал об этом некоторое время назад. Обратите внимание, что из-за того, что я раскрыл ниже, нельзя полагаться на 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;
Лично я считаю, что это ошибка. Если синтаксис позволяет мне создать логин, используя хешированный пароль, и я могу оговорить, что этот пароль должен соответствовать моей политике сложности, то это должно привести к ошибке или предупреждению о том, что политика фактически не проверялась.
ОБНОВЛЕНИЕ : я подал ошибку против этого поведения.