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 kodzieIntPtr 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.
Remember Me