Доброго времени суток. У меня такой вопрос, можно залогинить комп по сети(то есть удалено)? Если да то подскажите в каком направлении искать инфу, может куски исходников и тд... Ответа типо "загугли" не принимаются =) пробовал ничего не вышло. Заранее спасибо.
Глянь ка сюды: Как программно залогиниться в сеть под 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): /*++ 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
И сюды: Как программно осуществить вход в сеть в 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): /*++ Module Name: SSPLogon.c Abstract: This module implements the network logon type by interfacing with the Windows NT Lan Man Security Support Provider (NTLMSSP) for the purpose of validating the provided users credentials. Автор: David Mowers (DaveMo) January 14, 1998 Необходимы следующие модули из примера SockAuth: security.c (modify according to comment below) collect.c Revision History: --*/ #define SECURITY_WIN32 #include <windows.h> #include <sspi.h> // // Небольшое изменение в GenClientContext, чтобы можно было // передавать пользовательские данные авторизации. // BOOL GenClientContext ( DWORD dwKey, SEC_WINNT_AUTH_IDENTITY *pAuthIdentity, BYTE *pIn, DWORD cbIn, BYTE *pOut, DWORD *pcbOut, BOOL *pfDone); /* В security.c, для функции GenClientContext, сделайте следующие изменения: ss = g_pFuncs->AcquireCredentialsHandle ( NULL, // principal PACKAGE_NAME, SECPKG_CRED_OUTBOUND, NULL, // LOGON id pAuthIdentity, // auth data NULL, // get key fn NULL, // get key arg &pAS->_hcred, &Lifetime ); */ static PBYTE g_pClientBuf = NULL; static PBYTE g_pServerBuf = NULL; static DWORD g_cbMaxMessage = 0; BOOL SSPLogonUser( LPTSTR DomainName, LPTSTR UserName, LPTSTR Password ) { BOOL done = FALSE; DWORD cbOut, cbIn; char szUser[80]; DWORD cbUser = 80; SEC_WINNT_AUTH_IDENTITY AuthIdentity; if(!InitSession(0)) { return(FALSE); } if(!InitSession(1)) { return(FALSE); } if (!InitPackage (&g_cbMaxMessage)) { return(FALSE); } g_pClientBuf = (PBYTE) malloc(g_cbMaxMessage); g_pServerBuf = (PBYTE) malloc(g_cbMaxMessage); ZeroMemory( &AuthIdentity, sizeof(AuthIdentity) ); if ( DomainName != NULL ) { AuthIdentity.Domain = DomainName; AuthIdentity.DomainLength = lstrlen(DomainName); } if ( UserName != NULL ) { AuthIdentity.User = UserName; AuthIdentity.UserLength = lstrlen(UserName); } if ( Password != NULL ) { AuthIdentity.Password = Password; AuthIdentity.PasswordLength = lstrlen(Password); } #ifdef UNICODE AuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; #else AuthIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI; #endif // // Подготовка клиентского сообщения (negotiate). // cbOut = g_cbMaxMessage; if (!GenClientContext ( 0, &AuthIdentity, NULL, 0, g_pClientBuf, &cbOut, &done)) { return(FALSE); } cbIn = cbOut; // // Подготовка сообщения сервера (challenge). // cbOut = g_cbMaxMessage; if (!GenServerContext ( 1, g_pClientBuf, cbIn, g_pServerBuf, &cbOut, &done)) { // // Наиболее вероятный отказ: AcceptServerContext с сообщением // SEC_E_LOGON_DENIED в случе неправильного имени или пароля // // Неожиданный Результат: Вход будет удачным, если имя // неправильно, а гостевой аккаунт присутствует в указанно // домене. // return(FALSE); } cbIn = cbOut; // // Подготовка клиентского сообщения (authenticate). // cbOut = g_cbMaxMessage; if (!GenClientContext ( 0, &AuthIdentity, g_pServerBuf, cbIn, g_pClientBuf, &cbOut, &done)) { return(FALSE); } cbIn = cbOut; // // Подготовка сообщения сервера (authentication). // cbOut = g_cbMaxMessage; if (!GenServerContext ( 1, g_pClientBuf, cbIn, g_pServerBuf, &cbOut, &done)) { return(FALSE); } TermSession(0); TermSession(1); TermPackage(); free(g_pClientBuf); free(g_pServerBuf); return(TRUE); } int main( int argc, char *argv[] ) { if(argc<4) { printf( "Usage: %s <domain> <user> <password>\n", argv[0]); exit(0); } if(SSPLogonUser( argv[1], argv[2], argv[3])) { printf("SSP Logon Succeeded!\n"); exit(1); } else { printf("SSP Logon Failed!\n"); exit(0); } }
probka спс.2-й пример я видел оч понравился, 1-й даже не смотрел потому что надо залогинить НТ и выше. Спс большое!!!