Логин по сети

Тема в разделе "WASM.NETWORKS", создана пользователем H2RD, 18 мар 2008.

  1. H2RD

    H2RD Игорь

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    7
    Адрес:
    Львов
    Доброго времени суток.
    У меня такой вопрос, можно залогинить комп по сети(то есть удалено)?
    Если да то подскажите в каком направлении искать инфу, может куски исходников и тд...
    Ответа типо "загугли" не принимаются =) пробовал ничего не вышло.
    Заранее спасибо.
     
  2. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    Вот здесь необходимо раскрыть тему логина.
     
  3. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  4. H2RD

    H2RD Игорь

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    7
    Адрес:
    Львов
    Давайте будем раскручивать а то я норм инфы по функциям типа этого не видел
     
  5. probka

    probka New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    170
    Глянь ка сюды:

    Как программно залогиниться в сеть под 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-битном компиляторе:

    Код (Text):
    1. /*++
    2.  
    3.       Copyright (c) 1998  Microsoft Corporation
    4.  
    5.       Module Name:
    6.  
    7.          Logon.c
    8.  
    9.       Description:
    10.  
    11.          Demonstrates use of NetWkStaSetUID2 API to log on and
    12.        log off of Windows 95 or Windows 98
    13.  
    14.          Следующую библиотеку необходимо импортировать:
    15.          NetAPI.lib
    16.  
    17.    --*/
    18.    #define INCL_NETWKSTA
    19.    #define INCL_NETERRORS
    20.  
    21.    #include <windows.h>
    22.    #include <lan.h>
    23.    #include <stdio.h>
    24.    #include <stdlib.h>
    25.    #include <ctype.h>
    26.  
    27.    #define BUFFSIZE 1000
    28.  
    29.    char buffer[BUFFSIZE];
    30.  
    31.  
    32.    void Usage()
    33.    {
    34.       MessageBox(NULL,"Usage: Logon <UserName> <Domain> <password>",
    35.                                                     "Input Error",MB_OK);
    36.    
    37.       exit(1);
    38.    }
    39.  
    40.    void FatalMessage(LPSTR szMessage)
    41.    {
    42.       MessageBox(NULL,szMessage,"Error",MB_OK);
    43.       exit(1);
    44.    }
    45.  
    46.    int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    47.                    LPSTR lpszCmdLine, int nCmdShow)    
    48.    {
    49.       char     lpszNewCmdLine[256];
    50.       char     szMsg[512];
    51.       char far *  lpszdomain;
    52.       char far *  lpszusername;
    53.       char far *  lpszpass;
    54.       char far *  argv[3];
    55.       int      i = 0;
    56.       int      argc = 1;
    57.       int      res  = 0;
    58.       unsigned short ta;
    59.       struct user_logon_info_1  *pUsrLogon  
    60.                            = (struct user_logon_info_1 *)  &buffer;
    61.       struct user_logoff_info_1 *pUsrLogoff
    62.                            = (struct user_logoff_info_1 *) &buffer;
    63.    
    64.  
    65.       // Скопируйте командную строку в строковую переменную, а затем
    66.       // преобразуйте символы новой строки к верхнему регистру.
    67.       // Для NetWkStaSetUID2 необходимо, чтобы имя пользователя,
    68.       // пароль, и домен были заглавными буквами. Но это не значит,
    69.       // что пароли Windows NT должны быть только заглавными символами.
    70.       // Windows NT domains that support LAN Manager logons
    71.       // maintain a separate uppercase version of the Windows NT password
    72.       // for logging on from Windows 3.x, Windows 95, and Windows 98
    73.       // machines.
    74.    
    75.       lstrcpy(lpszNewCmdLine,lpszCmdLine);
    76.    
    77.       while (TRUE)
    78.       {
    79.          if (lpszNewCmdLine[i] == '\0')
    80.             break;
    81.  
    82.          lpszNewCmdLine[i] = (char)toupper(lpszNewCmdLine[i]);
    83.          i++;
    84.       }
    85.  
    86.  
    87.       // Устанавливаем указатели argv: argv[0] это первый параметр,
    88.       // так как имя .exe не находится в lpszCmdline.
    89.    
    90.       argv[0] = (char far *)lpszNewCmdLine;
    91.                
    92.       for (i=1;i>0;i++)
    93.       {  
    94.          if (lpszNewCmdLine[i] == '\0')
    95.          break;
    96.          if (lpszNewCmdLine[i] == ' ')
    97.          {
    98.              lpszNewCmdLine[i] = '\0';
    99.              // Предыдущий argc является индексом для нового argv;
    100.              // поэтому используем его, а затем включаем его.
    101.             argv[argc++] = (char far *) &(lpszNewCmdLine[i+1]);
    102.             if (argc > 3)
    103.                Usage();
    104.          }  
    105.       }
    106.  
    107.       if (argc != 3) Usage();
    108.    
    109.       lpszusername = argv[0];
    110.       lpszdomain = argv[1];
    111.       lpszpass = argv[2];
    112.  
    113.    
    114.       res=NetWkstaSetUID2((char far *)NULL,
    115.                      (char far *)lpszdomain,
    116.                      (char far *)lpszusername,
    117.                      (char far *)lpszpass,
    118.                      (char far *)"",
    119.                      0,
    120.                      1,
    121.                      (char far *) buffer,
    122.                      sizeof(buffer),
    123.                      (unsigned short far *) &ta);
    124.                
    125.       if((res != NERR_Success) &&
    126.          (res != NERR_UnableToAddName_W))
    127.       {
    128.          NetWkstaSetUID2(NULL, NULL, NULL, NULL, NULL, 3, 1,
    129.                          (char far *) &buffer, sizeof(buffer), &ta);
    130.          wsprintf(szMsg,"Logon Error: %u", res);
    131.            FatalMessage(szMsg);
    132.       }
    133.    
    134.       else
    135.       {
    136.          switch(pUsrLogon->usrlog1_code)
    137.          {
    138.          case NERR_Success:
    139.             wsprintf( (LPSTR)szMsg,"Logon successful. Return code: %u\n"
    140.                               "Press Ok to logoff",
    141.                                        pUsrLogon->usrlog1_code);
    142.             MessageBox(NULL, szMsg, "Success", MB_OK);  
    143.             break;
    144.          default:
    145.             /* See NETERR.H for details on return codes */  
    146.             NetWkstaSetUID2(NULL, NULL, NULL, NULL, NULL, 3, 1,
    147.                             (char far *) &buffer, sizeof(buffer), &ta);
    148.             wsprintf(szMsg, "Logon Error. Return code: %u\n", res);
    149.             FatalMessage(szMsg);
    150.          }
    151.       }
    152.  
    153.       res = NetWkstaSetUID2(NULL, NULL, NULL, NULL, NULL, 3, 1,
    154.                             (char far *) &buffer, sizeof(buffer), &ta);
    155.       if((res != NERR_Success) && (res != NERR_UnableToDelName_W))
    156.       {
    157.          wsprintf(szMsg,"Error on logoff: %u\n", res);
    158.          FatalMessage(szMsg);
    159.       }
    160.       else
    161.       {
    162.          wsprintf(szMsg, "Logoff successful.\n");
    163.          MessageBox(NULL, szMsg, "Success", MB_OK);
    164.       }
    165.       return 0;
    166.    }
    Для получения дополнительной информации, ознакомьтесь со следующей статьёй из Microsoft Knowledge Base
     
  6. probka

    probka New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    170
    И сюды:

    Как программно осуществить вход в сеть в WinNT и Win95
    Иногда бывает необходимо, чтобы приложение проверяло имя пользователя и пароль. Существует пара способов, чтобы проделать эту операцию, в зависимости от того, на какой платформе запущено приложение: Windows 95 или Windows NT.

    В данной статье описаны все общие способы проверки прав пользователя, а так же специальные требования для каждого из методов.

    API функция LogonUser доступна и документирована начиная с Windows NT 3.51, и обычно используется для проверки прав пользователя. К сожалению, есть некоторые ограничения на использование LogonUser. Первое и самое большое ограничение, это то, что процесс, вызывающий LogonUser должен иметь привелегию SE_TCB_NAME. SE_TCB_NAME очень серьёзная привелегия и не может предоставляться любому пользователю для управлением процессом авторизации. Рекомендуется вызывать LogonUser из сервиса, запущенного аккаунтом системы, так как системный аккаунт изначально имеет привелегию SE_TCB_NAME.

    Другая проблема LogonUser в том, эта API не включена в Windows 95.

    Однако, можно использовать Security Support Provider Interface (SSPI) чтобы осуществить вход в сеть с поддержкой авторизации. У этого метода есть преимущество, так как он не требует никаких специальных привелегий, а так же работает в Windows 95. Конечный результат использования сервисов SSPI для проверки прав пользователя идентичен вызову LogonUser с типом входа LOGON32_LOGON_NETWORK. Однако, при данно типе входа в сеть Вы не сможете получить доступ к удалённым сетевым ресурсам. Если Ваше приложение будет вызывать LogonUser с типом входа LOGON32_LOGON_INTERACTIVE, то нельзя будет работать с Windows NT, поэтому в данном случае применение SSPI как альтернативы для входа/авторизации не подойдёт.

    Приведённый ниже пример, показывает, как вызвать сервис SSPI для проверки прав пользователя. Это всего лишь модификация примера SOCKAUTH из Platform SDK, который использует сервис SSPI. Для компиляции нижеприведённого кода, необходимы два модуля из этого примера.

    Чтобы использовать этот пример в Windows 95, Вам необходимо загрузить пакет SSP для Windows 95. В Windows 95 пакет SSP называется Secur32.dll, в отличиет от Windows NT, где он называется Security.dll . Для этого необходимо в SECURITY.C изменить значение константы NT_DLL_NAME.

    Чтобы использовать данный метод в Windows 95, необходимо разрешить сервис безопасности NTLM (Control Panel -> Network -> Access Control, а затем указав User-level (на уровне пользователей)).

    Пример кода
    Код (Text):
    1. /*++
    2.  
    3.    Module Name:
    4.  
    5.        SSPLogon.c
    6.  
    7.    Abstract:
    8.  
    9.       This module implements the network logon type by
    10.       interfacing with the Windows NT Lan Man Security Support
    11.       Provider (NTLMSSP) for the purpose of validating
    12.       the provided users credentials.
    13.  
    14.  
    15.    Автор:
    16.  
    17.       David Mowers (DaveMo) January 14, 1998
    18.  
    19.    Необходимы следующие модули из примера SockAuth:
    20.  
    21.       security.c (modify according to comment below)
    22.       collect.c
    23.  
    24.    Revision History:
    25.  
    26.    --*/
    27.  
    28.    #define SECURITY_WIN32
    29.  
    30.    #include <windows.h>
    31.    #include <sspi.h>
    32.  
    33.    //
    34.    // Небольшое изменение в GenClientContext, чтобы можно было
    35.    // передавать пользовательские данные авторизации.
    36.    //
    37.    BOOL GenClientContext (
    38.       DWORD dwKey,
    39.       SEC_WINNT_AUTH_IDENTITY *pAuthIdentity,
    40.       BYTE *pIn,
    41.       DWORD cbIn,
    42.       BYTE *pOut,
    43.       DWORD *pcbOut,
    44.       BOOL *pfDone);
    45.  
    46.    /*
    47.  
    48.       В security.c, для функции GenClientContext,
    49.       сделайте следующие изменения:
    50.  
    51.       ss = g_pFuncs->AcquireCredentialsHandle (
    52.          NULL,   // principal
    53.          PACKAGE_NAME,
    54.          SECPKG_CRED_OUTBOUND,
    55.          NULL,   // LOGON id
    56.          pAuthIdentity,   // auth data
    57.          NULL,   // get key fn
    58.          NULL,   // get key arg
    59.          &pAS->_hcred,
    60.          &Lifetime
    61.          );
    62.    */
    63.  
    64.  
    65.    static PBYTE g_pClientBuf = NULL;
    66.    static PBYTE g_pServerBuf = NULL;
    67.    static DWORD g_cbMaxMessage = 0;
    68.  
    69.    BOOL
    70.    SSPLogonUser(
    71.       LPTSTR DomainName,
    72.       LPTSTR UserName,
    73.       LPTSTR Password
    74.       )
    75.    {
    76.  
    77.       BOOL done = FALSE;
    78.       DWORD cbOut, cbIn;
    79.       char szUser[80];
    80.       DWORD cbUser = 80;
    81.       SEC_WINNT_AUTH_IDENTITY AuthIdentity;
    82.  
    83.       if(!InitSession(0))
    84.       {
    85.          return(FALSE);
    86.       }
    87.  
    88.       if(!InitSession(1))
    89.       {
    90.          return(FALSE);
    91.       }
    92.  
    93.       if (!InitPackage (&g_cbMaxMessage))
    94.       {
    95.          return(FALSE);
    96.       }
    97.  
    98.       g_pClientBuf = (PBYTE) malloc(g_cbMaxMessage);
    99.       g_pServerBuf = (PBYTE) malloc(g_cbMaxMessage);
    100.  
    101.       ZeroMemory( &AuthIdentity, sizeof(AuthIdentity) );
    102.  
    103.       if ( DomainName != NULL )
    104.       {
    105.          AuthIdentity.Domain = DomainName;
    106.          AuthIdentity.DomainLength = lstrlen(DomainName);
    107.       }
    108.  
    109.       if ( UserName != NULL )
    110.       {
    111.          AuthIdentity.User = UserName;
    112.          AuthIdentity.UserLength = lstrlen(UserName);
    113.       }
    114.  
    115.       if ( Password != NULL )
    116.       {
    117.          AuthIdentity.Password = Password;
    118.          AuthIdentity.PasswordLength = lstrlen(Password);
    119.       }
    120.  
    121.    #ifdef UNICODE
    122.        AuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
    123.    #else
    124.       AuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
    125.    #endif
    126.  
    127.       //
    128.       // Подготовка клиентского сообщения (negotiate).
    129.       //
    130.       cbOut = g_cbMaxMessage;
    131.       if (!GenClientContext (
    132.          0,
    133.          &AuthIdentity,
    134.          NULL,
    135.          0,
    136.          g_pClientBuf,
    137.          &cbOut,
    138.          &done))
    139.       {
    140.          return(FALSE);
    141.       }
    142.  
    143.       cbIn = cbOut;
    144.       //
    145.       // Подготовка сообщения сервера (challenge).
    146.       //
    147.       cbOut = g_cbMaxMessage;
    148.       if (!GenServerContext (
    149.          1,
    150.          g_pClientBuf,
    151.          cbIn,
    152.          g_pServerBuf,
    153.          &cbOut,
    154.          &done))
    155.       {
    156.          //
    157.          // Наиболее вероятный отказ: AcceptServerContext с сообщением
    158.          // SEC_E_LOGON_DENIED в случе неправильного имени или пароля
    159.          //
    160.          // Неожиданный Результат: Вход будет удачным, если имя
    161.          // неправильно, а гостевой аккаунт присутствует в указанно
    162.          // домене.
    163.          //
    164.          return(FALSE);
    165.       }
    166.  
    167.       cbIn = cbOut;
    168.       //
    169.       // Подготовка клиентского сообщения (authenticate).
    170.       //
    171.       cbOut = g_cbMaxMessage;
    172.       if (!GenClientContext (
    173.          0,
    174.          &AuthIdentity,
    175.          g_pServerBuf,
    176.          cbIn,
    177.          g_pClientBuf,
    178.          &cbOut,
    179.          &done))
    180.       {
    181.          return(FALSE);
    182.       }
    183.  
    184.       cbIn = cbOut;
    185.       //
    186.       // Подготовка сообщения сервера (authentication).
    187.       //
    188.       cbOut = g_cbMaxMessage;
    189.       if (!GenServerContext (
    190.          1,
    191.          g_pClientBuf,
    192.          cbIn,
    193.          g_pServerBuf,
    194.          &cbOut,
    195.          &done))
    196.       {
    197.          return(FALSE);
    198.       }
    199.  
    200.       TermSession(0);
    201.       TermSession(1);
    202.  
    203.       TermPackage();
    204.  
    205.       free(g_pClientBuf);
    206.       free(g_pServerBuf);
    207.  
    208.       return(TRUE);
    209.    }
    210.  
    211.    int main( int argc, char *argv[] )
    212.    {
    213.  
    214.       if(argc<4)
    215.       {
    216.          printf(
    217.             "Usage: %s <domain> <user> <password>\n",
    218.             argv[0]);
    219.          exit(0);
    220.       }
    221.  
    222.       if(SSPLogonUser(
    223.          argv[1],
    224.          argv[2],
    225.          argv[3]))
    226.       {
    227.          printf("SSP Logon Succeeded!\n");
    228.          exit(1);
    229.       }
    230.       else
    231.       {
    232.          printf("SSP Logon Failed!\n");
    233.          exit(0);
    234.       }
    235.  
    236.    }
     
  7. H2RD

    H2RD Игорь

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    7
    Адрес:
    Львов
    probka
    спс.2-й пример я видел оч понравился, 1-й даже не смотрел потому что надо залогинить НТ и выше.
    Спс большое!!!