Проверка имени пользователя и пароля в .NET

Опубликовано Vladimir - пт, 17.10.2008 - 10:18

Добавить комментарий

Содержимое данного поля является приватным и не предназначено для показа.

Filtered HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <p> <br><b><i> <img src alt height width>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.

Для проверки имени пользователя Windows единственный надежный способ залогиниться под ним. Для этого используем функцию API:

using System.Runtime.InteropServices;

namespace SetRights
{
  class LoginHelper
  {
   [DllImport("advapi32.dll", SetLastError = true)]
   private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
   int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

   [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
   public static extern bool CloseHandle(IntPtr handle);

   const int LOGON32_PROVIDER_DEFAULT = 0;
   //этот параметр вызывает LogonUser, чтобы создать первичный токен
   const int LOGON32_LOGON_INTERACTIVE = 2;

   static public void ValidateUser(string userName, string domainName, string password)
    {
      IntPtr tokenHandle = new IntPtr(0);
 
      tokenHandle = IntPtr.Zero;
      //Вызов LogonUser, чтобы получить дескриптор для доступа          
      bool returnValue = LogonUser(userName, domainName, password,
      LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);
 
     if (false == returnValue)
     {
      int ret = Marshal.GetLastWin32Error();
      throw new System.ComponentModel.Win32Exception(ret);
     }

     // освобождаем токены
     if (tokenHandle != IntPtr.Zero)
      CloseHandle(tokenHandle);
    }
  }
}