C# LogonUser-通知用户登录失败的原因

C# LogonUser-通知用户登录失败的原因,c#,authentication,active-directory,C#,Authentication,Active Directory,目前我们有以下代码: [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern bool LogonUser(string username, string domain, string password, int dwLogonType, int dwLogonProvider, out IntPtr phToken); bool is

目前我们有以下代码:

    [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern bool LogonUser(string username, string domain, string password, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
    bool isLoggedIn = LogonUser(...);
    if(isLoggedIn){
       // Some Code...
    } else {
       // Need to: 
       // If user entered incorrect password
       // If the user is locked/banned out of the system
    }

我们的active directory配置在x次登录尝试失败后将用户锁定。有没有办法检查登录失败是因为用户输入了错误的密码,还是因为尝试次数太多而被锁定?此外,是否有办法请求广告允许的尝试次数?似乎我们的管理员一直在更改这些号码,所以我不想在应用程序中硬编码它们

根据advapi32.dll的文档,您可以通过调用
GetLastError来获取登录失败的详细信息

ofc您必须为该方法添加外部程序。此外,我建议在有人发布代码时查看注释,以从错误中提取文本,这可能是您希望向用户显示的内容


此外,您还可以使用
FormatMessage
方法生成更好的错误。它在上面的文档中链接到,但这里有一个直接链接到它

根据advapi32.dll的文档,您可以通过调用
GetLastError

ofc您必须为该方法添加外部程序。此外,我建议在有人发布代码时查看注释,以从错误中提取文本,这可能是您希望向用户显示的内容

此外,您还可以使用
FormatMessage
方法生成更好的错误。它在上面的文档中链接到,但这里有一个直接链接到它

返回值 如果函数成功,则函数返回非零
如果函数失败,则返回零。要获取扩展错误信息,请调用GetLastError

根据文档,您应该检查最后一个错误。但是,不要在C#中p/invoke
GetLastError()
,您应该以托管方式执行此操作:

else
{
    // Need to: 
    // If user entered incorrect password
    // If the user is locked/banned out of the system

    var errorCode = Marshal.GetLastWin32Error();
    var exception = new Win32Exception(errorCode);

    // exception.Message should contain the information you need.
    // alternatively, you can switch on errorCode to provide your custom message
}
为了便于参考,您可以在此处查找错误代码:


备注
GetLastWin32Error从Kernel32.DLL公开Win32 GetLastError函数。此方法的存在是因为对GetLastError进行直接平台调用以获取此信息是不安全的。如果要访问此错误代码,必须调用GetLastWin32Error,而不是为GetLastError编写自己的平台调用定义并调用它。公共语言运行库可以对API进行内部调用,以覆盖操作系统维护的GetLastError

来源:

返回值 如果函数成功,则函数返回非零
如果函数失败,则返回零。要获取扩展错误信息,请调用GetLastError

根据文档,您应该检查最后一个错误。但是,不要在C#中p/invoke
GetLastError()
,您应该以托管方式执行此操作:

else
{
    // Need to: 
    // If user entered incorrect password
    // If the user is locked/banned out of the system

    var errorCode = Marshal.GetLastWin32Error();
    var exception = new Win32Exception(errorCode);

    // exception.Message should contain the information you need.
    // alternatively, you can switch on errorCode to provide your custom message
}
为了便于参考,您可以在此处查找错误代码:


备注
GetLastWin32Error从Kernel32.DLL公开Win32 GetLastError函数。此方法的存在是因为对GetLastError进行直接平台调用以获取此信息是不安全的。如果要访问此错误代码,必须调用GetLastWin32Error,而不是为GetLastError编写自己的平台调用定义并调用它。公共语言运行库可以对API进行内部调用,以覆盖操作系统维护的GetLastError


来源:

什么库提供了
LogonUser
?需要更多的信息来建议一个合理的方法。这当然可行。请检查我的代码编辑器什么库提供了
LogonUser
?需要更多的信息来建议一个合理的方法。这当然是可行的。请检查我的代码编辑器。您能否详细说明建议不要p/invoke GetLastError()的意思?我得到的错误代码似乎与正在发生的事情一致。我只需要一个if语句来说明发生了什么。为什么我们需要例外?@worldpart I更新了我的答案。您应该使用
errorCode
(请参阅新编辑的代码)创建一个新的
Win32Exception
,这允许您检索有关该错误代码的友好消息。然后,读一下我添加的评论。好的,有道理,谢谢;没有为异常而烦恼,只是切换了错误代码。您不必抛出异常。它只是让你知道错误代码的含义,但你可以随时在msdn上查找错误代码~是的,明白了;查找错误代码成功了;非常感谢。您能详细说明一下您建议不要p/invoke GetLastError()是什么意思吗?我得到的错误代码似乎与正在发生的事情一致。我只需要一个if语句来说明发生了什么。为什么我们需要例外?@worldpart I更新了我的答案。您应该使用
errorCode
(请参阅新编辑的代码)创建一个新的
Win32Exception
,这允许您检索有关该错误代码的友好消息。然后,读一下我添加的评论。好的,有道理,谢谢;没有为异常而烦恼,只是切换了错误代码。您不必抛出异常。它只是让你知道错误代码的含义,但你可以随时在msdn上查找错误代码~是的,明白了;查找错误代码成功了;非常感谢。