繁体   English   中英

以编程方式验证 Windows 密码策略?

[英]Validate Windows password policy programmatically?

我有一个批量创建用户的应用程序(我知道不典型,但不是我的决定),目前,密码验证只是使用正则表达式完成。 但具体要求可能会根据 PC 的设置而改变,对吧? 那么有没有办法根据 C# 中的 PC 密码策略测试给定的字符串? 我希望能够做类似的事情:

bool isPasswordGood = TestPasswordComplexity("notAgoodPassword");

这将取决于 Windows 中设置的安全策略。 这通常使用 GUI 来设置安全策略,但您实际上可以从命令行导出设置,如下所示:

secedit.exe /export /cfg C:\temp\MySecurityPolicy.inf

注意:您可能需要以管理员身份运行命令提示符才能允许此操作(右键单击命令提示符图标和 select以管理员身份运行)。

这应该将您的设置保存在文本文件中(此处为MySecurityPolicy.inf )。 该文件的第一部分应如下所示:

[Unicode]
Unicode=yes
[System Access]
MinimumPasswordAge = 0
MaximumPasswordAge = 365
MinimumPasswordLength = 12
PasswordComplexity = 0
PasswordHistorySize = 20
LockoutBadCount = 20
ResetLockoutCount = 10
LockoutDuration = 10
RequireLogonToChangePassword = 0
ForceLogoffWhenHourExpire = 1
NewAdministratorName = "LocalAdmin"
NewGuestName = "LocalGuest"
ClearTextPassword = 0
(...)

特别是我会想象第 6 行和第 7 行、 MinimumPasswordLengthPasswordComplexity会很有趣 - 这里有一些关于此的文档

一旦你了解了它是如何工作的,你应该能够创建一个简单的脚本或程序来读取这样的配置文件,并使用其中的信息来告知你的密码验证方法。 也许只阅读第 6 行和第 7 行就足够了?

我意识到这可能不如直接从 C# 查找策略设置好,但它至少会给您一个选择:现在,每当您需要检查要求时,运行一个脚本,将设置导出到已知文件,并从您的应用程序中重新评估它。

如果您也可以从您的应用程序运行导出过程(假设提升的权限要求不会造成麻烦),那么您应该能够自动化所有这些。 否则,您可能必须手动导出策略文件,并将其存储在您的应用程序可以读取的位置。

您想要的 API function 是NetValidatePasswordPolicy

它有以下三种运行模式:

  • NetValidateAuthentication :如果您正在验证用户; 因此 function 可以检查密码过期策略、错误登录尝试、帐户锁定、错误登录尝试等
  • NetValidatePasswordChange :如果用户正在更改他们的密码; 因此 function 可以检查锁定或密码策略

和你想要的模式:

  • NetValidatePasswordReset :您是重置用户密码的管理员; 仅检查密码复杂性。

我将尝试即时从另一种语言转码为 C#; 但你必须 P/Invoke 它。

/*
    Password reset.

    The result from NetValidatePasswordReset, this member can be one of the following values.

        NERR_Success                        The password passes the validation check.
        NERR_PasswordTooShort           Validation failed. The password does not meet policy requirements because it is too short.
        NERR_PasswordTooLong                Validation failed. The password does not meet policy requirements because it is too long.
        NERR_PasswordNotComplexEnough   Validation failed. The password does not meet policy requirements because it is not complex enough.
        NERR_PasswordFilterError        Validation failed. The password does not meet the requirements of the password filter DLL.
*/

UInt32 TestPasswordComplexity(String username, SecureString password)
{
   const UInt32 NetValidatePasswordReset = 3;

   NET_VALIDATE_PASSWORD_RESET_INPUT_ARG args = new NET_VALIDATE_PASSWORD_RESET_INPUT_ARG();
   args.UserAccountName = "Kjartan"; //some policies check that your password cannot contain your username

   PNET_VALIDATE_OUTPUT_ARG res;

   DWORD le = NetValidatePasswordPolicy(null, null, NetValidatePasswordReset, @args, {out}Pointer(res));

   if (le <> NERR_Success)
      throw new WindowsException(le); //

   return res.ValidationStatus;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM