15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как программно залогиниться в сеть под Win95/Win98

В Windows 95 или Windows 98 чтобы залогиниться в сеть программы могут вызывать 16-битный LAN Менеджер API NetWkstaSetUID2().

Когда пользователь нажимает кнопку Cancel или клавишу ESC в диалоговом окне ввода пароля для входа в сеть Microsoft, то система позволяет пользователю войти как неавторизованному пользователю. Это позволяет проводить различную локальную работу без возможности доступа к сети. Чтобы получить доступ к сети, пользователю необходимо завершить сеанс и залогиниться заново через диалог ввода сетевого пароля.

Чтобы не заставлять пользователя завершать сеанс и логиниться по-новой, доступ к сети можно получить при помощи функции NetWkstaSetUID2(). Функцию NetWkstaSetUID2() можно импортировать из NetAPI.lib, которая доступна в Windows for Workgroups SDK. Эту 16-битную функцию можно вызывать только из 16-битных приложений. Чтобы вызвать эту функцию из 32-битных приложений, ознакомьтесь со следующей статьёй из Microsoft Knowledge Base:

Q155763 Как вызывать 16-битный код из 32-битного под Windows 95

 

ЗАМЕЧАНИЕ: Windows for Workgroups SDK больше не поддерживается Microsoft

NetWkstaSetUID2() больше не используется для авторизации полномочий пользователя. Функция позволяет осуществить полный вход в сеть, модифицируя состояние системы. Информацию об авторизации можно найти в следующей статье из Microsoft Knowledge Base:

Q180548 Как программно осуществить вход в сеть в WinNT и Win95

 

В Windows 95, после вызова NetWkstaSetUID2() для входа в сеть, необходимо для завершения сеанса опять вызвать NetWkStaSetUID2() до того, как система завершит сеанс локально. Чтобы сделать это, процесс, вызывающий NetWkstaSetUID2() может создать окно верхнего уровня, которое будет оставаться резидентным на протяжении всего сеанса. Когда пользователь завершает сеанс, система посылает сообщение WM_ENDSESSION всем окнам верхнего уровня. Приняв сообщение WM_ENDSESSION, процесс должен вызвать NetWkstaSetUID2(), чтобы разлогинится из сети. Это будет означать, что пользователь разлогинился из сети до того, как система завершила сеанс локально. В Windows 98эта процедура необязательна.

Следующий код демонстрирует использование NetWkstaSetUID2() для входа в сеть и выхода из сети в Windows 95 и Windows 98. Это 16-битное приложение Windows, которое должно быть откомпилировано в 16-битном компиляторе:

/*++

      Copyright (c) 1998  Microsoft Corporation

      Module Name:

         Logon.c

      Description:

         Demonstrates use of NetWkStaSetUID2 API to log on and
       log off of Windows 95 or Windows 98

         Следующую библиотеку необходимо импортировать:
         NetAPI.lib

   --*/ 
   #define INCL_NETWKSTA
   #define INCL_NETERRORS

   #include <windows.h>
   #include <lan.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <ctype.h>
 
   #define BUFFSIZE 1000
 
   char buffer[BUFFSIZE];


   void Usage()
   {
      MessageBox(NULL,"Usage: Logon <UserName> <Domain> <password>",
                                                    "Input Error",MB_OK);
   
      exit(1);
   }

   void FatalMessage(LPSTR szMessage)
   {
      MessageBox(NULL,szMessage,"Error",MB_OK);
      exit(1);
   }

   int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpszCmdLine, int nCmdShow)    
   {
      char     lpszNewCmdLine[256];
      char     szMsg[512];
      char far *  lpszdomain;
      char far *  lpszusername;
      char far *  lpszpass;
      char far *  argv[3];
      int      i = 0;
      int      argc = 1;
      int      res  = 0;
      unsigned short ta;
      struct user_logon_info_1  *pUsrLogon  
                           = (struct user_logon_info_1 *)  &buffer;
      struct user_logoff_info_1 *pUsrLogoff
                           = (struct user_logoff_info_1 *) &buffer;
   

      // Скопируйте командную строку в строковую переменную, а затем
      // преобразуйте символы новой строки к верхнему регистру.
      // Для NetWkStaSetUID2 необходимо, чтобы имя пользователя,
      // пароль, и домен были заглавными буквами. Но это не значит,
      // что пароли Windows NT должны быть только заглавными символами.
      // Windows NT domains that support LAN Manager logons
      // maintain a separate uppercase version of the Windows NT password 
      // for logging on from Windows 3.x, Windows 95, and Windows 98 
      // machines.
   
      lstrcpy(lpszNewCmdLine,lpszCmdLine);
   
      while (TRUE)
      { 
         if (lpszNewCmdLine[i] == '\0')
            break;

         lpszNewCmdLine[i] = (char)toupper(lpszNewCmdLine[i]);
         i++;
      }


      // Устанавливаем указатели argv: argv[0] это первый параметр,
      // так как имя .exe не находится в lpszCmdline.
   
      argv[0] = (char far *)lpszNewCmdLine;
               
      for (i=1;i>0;i++)
      {   
         if (lpszNewCmdLine[i] == '\0')
         break;
         if (lpszNewCmdLine[i] == ' ')
         { 
             lpszNewCmdLine[i] = '\0';
             // Предыдущий argc является индексом для нового argv;
             // поэтому используем его, а затем включаем его.
            argv[argc++] = (char far *) &(lpszNewCmdLine[i+1]);
            if (argc > 3)
               Usage();
         }   
      }

      if (argc != 3) Usage();
   
      lpszusername = argv[0];
      lpszdomain = argv[1];
      lpszpass = argv[2];

   
      res=NetWkstaSetUID2((char far *)NULL,
                     (char far *)lpszdomain,
                     (char far *)lpszusername,
                     (char far *)lpszpass,
                     (char far *)"",
                     0,
                     1,
                     (char far *) buffer,
                     sizeof(buffer),
                     (unsigned short far *) &ta);
               
      if((res != NERR_Success) && 
         (res != NERR_UnableToAddName_W))
      {
         NetWkstaSetUID2(NULL, NULL, NULL, NULL, NULL, 3, 1,
                         (char far *) &buffer, sizeof(buffer), &ta);
         wsprintf(szMsg,"Logon Error: %u", res);
           FatalMessage(szMsg);
      }
   
      else
      {
         switch(pUsrLogon->usrlog1_code)
         {
         case NERR_Success:
            wsprintf( (LPSTR)szMsg,"Logon successful. Return code: %u\n"
                              "Press Ok to logoff",
                                       pUsrLogon->usrlog1_code);
            MessageBox(NULL, szMsg, "Success", MB_OK);  
            break;
         default:
            /* See NETERR.H for details on return codes */  
            NetWkstaSetUID2(NULL, NULL, NULL, NULL, NULL, 3, 1,
                            (char far *) &buffer, sizeof(buffer), &ta);
            wsprintf(szMsg, "Logon Error. Return code: %u\n", res);
            FatalMessage(szMsg);
         }
      } 

      res = NetWkstaSetUID2(NULL, NULL, NULL, NULL, NULL, 3, 1,
                            (char far *) &buffer, sizeof(buffer), &ta);
      if((res != NERR_Success) && (res != NERR_UnableToDelName_W))
      {
         wsprintf(szMsg,"Error on logoff: %u\n", res);
         FatalMessage(szMsg);
      }
      else
      {
         wsprintf(szMsg, "Logoff successful.\n");
         MessageBox(NULL, szMsg, "Success", MB_OK);
      }
      return 0;
   } 

 


Для получения дополнительной информации, ознакомьтесь со следующей статьёй из Microsoft Knowledge Base:

Q155763 Как вызывать 16-битный код из 32-битного под Windows 95