Czasami potrzebujemy fragmentu kodu, który umożliwi autoryzację użytkownika, który ma zablokowane konto - np. wtedy, kiedy loguje się do portalu typu self-service i chciałby sprawdzić, dlaczego ma zablokowane konto.
Przy próbie bindowania do AD extended error widzi rozróżnienie między kontem z zalokowanym, zablokowanym i złym hasłem. Niestety, tego błędu nie zobaczymy, jeśli użyjemy klas DirectoryServices czy ADSI - oba te interfejsy próbują się bindować dopiero przy podłączeniu do określonego obiektu i wyrzucają błąd PermissionDenied. Można oczywiście użyć klas novella do obslugi AD, ale niestety pod Windowsem nie wspierają TLS-a przy dostepie do LDAP-a.
Można tez użyc interopa i dllki advapi32.dll, co jest pokazane poniżej:
using System.Runtime.InteropServices;
(..)// w klasie
[DllImport("advapi32.dll", CharSet = CharSet.Auto,SetLastError=true)]
public static extern bool LogonUser(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
public const int LOGON32_LOGON_NETWORK = 3;
(..) // i w kodzie
IntPtr token = IntPtr.Zero;
bool res = LogonUser(
textBoxUserName.Text,
textBoxDomainName.Text,
textBoxPassword.Text,
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
ref token);
label1.Text= Marshal.GetLastWin32Error().ToString()+" : "+res.ToString();
Marshal.GetLastWin32Error() powinien nam zwrócić różne kody błędu przy różnych próbach dostępu do AD.