Здравствуйте! Есть проблемка такая: Админский пароль пустой. invoke LogonUser,SADD("Администратор"),0,0,0,addr hToken Возвращает ошибку типа: "Не разрешены пустые пароли" и т.д.. Если кто-нибудь знает, как их разрешить, пожалуйста пишите?
Вообщето все дело в локальной политике безопасности. В XP, по моему, по умолчанию невозможно програмно логиниться с пустым паролем (да и по сети тоже). Естественно эту политику можно изменить, но с другой стороны для ее изменения тебе нужны права админа Первый способ - ручками: В настройках локальных политиках безопасности меняешь соответствующий параметр... Второй через реестр: (соответственно можно и програмно) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] "limitblankpassworduse"==dword:00000000 Вроде бы так... (знания чисто теоретические, вполне возможно ошибаюсь)
Невозможно программно залогиниться - навряд ли, winlogon логинит юзера именно программно. Но там вроде msgina.dll замешана, она ещё Ctrl-Alt-Del обработчик содержит. Её наверное стоит посмотреть. НО через LogonUser с пустым паролем не получается. 2 Avoidik Да вроде бы NULL и указатель на пустую строку эта функция воспринимает одинаков, разве нет?
addr db 0 не помогает. Но winlogon логиниться же с пустым паролем, может напрямую надо Lsa функции вызывать, ведь должна же быть функция, типа LsaLogonUser или что-то подобное.
есть такая LsaLogonUser см. http://pluralsight.com/blogs/keith/archive/2005/01/27/5486.aspx опытные люди говорят - одна из самых сложных для программера функций в винде но функциональность у LsaLogonUser и просто LogonUser принципиально разная и применяются они в разных ситуациях
Определена в secur32.inc LsaLogonUser PROTO WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD Вот такой у нее прототипчик, а что все это значит только? А еще есть, определенная в ntoskrnl.inc: LsaLogonUser proto stdcall WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD, WORD
NullSessi0n >> Невозможно программно залогиниться - навряд ли, winlogon логинит юзера именно программно. Неужели аппаратно?? >> Но там вроде msgina.dll замешана, она ещё Ctrl-Alt-Del обработчик содержит. Её наверное стоит посмотреть Для текущей задачи - не стоит. Она использует в своей реализации LogonUser или LsaLogonUser asmasm >> Ты бы лучше привел пример её вызова. В MSDN есть. Например, в статье Keith Brown "Security Briefs: Exploring S4U Kerberos Extensions in Windows Server 2003" http://msdn.microsoft.com/msdnmag/issues/03/04/SecurityBriefs/ Правда, тут довольно специфичный пример, но всё-таки.
Я раскопал в отладчике, что функция LogonUser только подготавливает аргументы для функции LsaLogonUser и именно последняя принимает решение дать токен или не дать, но с пустым паролем она не его дает, но все же как тогда winlogon делает это?
Winlogon регистрирует от имени system, но пробовал запускать процесс с помощью at, но результаты те же самые.
именно LsaLogonUser сказали же тебе по-русски - мсдн http://msdn.microsoft.com/msdnmag/issues/03/04/SecurityBriefs/default. aspx?fig=true#fig1 #define UNICODE #define _UNICODE #include <windows.h> #include <ntsecapi.h> #include <stdio.h> #pragma comment(lib, "secur32.lib") // some simple error handling functions void _err(const wchar_t* fcn, DWORD err = GetLastError()) { wchar_t msg[256]; if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, err, 0, msg, sizeof msg / sizeof *msg, 0)) { wsprintf(msg, L"hr = 0x%08X", err); } wprintf(L"%s failed: %s\n", fcn, msg); exit(1); } void _nterr(const wchar_t* fcn, NTSTATUS s) { _err(fcn, LsaNtStatusToWinError(s)); } void _checknterr(const wchar_t* fcn, NTSTATUS s) { if (s) { _nterr(fcn, s); } else { wprintf(L"%s succeeded.\n", fcn); } } // helper for initializing Kernel type ANSI strings // from string literals void _si(LSA_STRING* a, const char* b) { a->Length = (USHORT)(strlen(b) * sizeof(*b)); a->MaximumLength = (USHORT)(a->Length + sizeof(*b)); a->Buffer = const_cast<char*>(b); } HANDLE _s4uLogon(const wchar_t* pszUserPrincipalName) { // connect to the Local Security Authority // this will allow us to get a token via S4U2Self // (note we aren't in the TCB so we won't be able // to use the resulting token to open Kernel objects) HANDLE hlsa; _checknterr(L"LsaConnectUntrusted", LsaConnectUntrusted(&hlsa)); // look up the Kerb authentication provider's index LSA_STRING pkgName; _si(&pkgName, MICROSOFT_KERBEROS_NAME_A); ULONG authnPkg; _checknterr(L"LsaLookupAuthenticationPackage", LsaLookupAuthenticationPackage(hlsa, &pkgName, &authnPkg)); const DWORD cchUPN = lstrlen(pszUserPrincipalName); const DWORD cbUPN = cchUPN * sizeof(wchar_t); // KERB_S4U_LOGON must be passed as a single // contiguous buffer that includes all strings, // otherwise LsaLogonUser will complain const DWORD cbLogon = sizeof(KERB_S4U_LOGON) + cbUPN; KERB_S4U_LOGON* s4uLogon = (KERB_S4U_LOGON*)calloc(cbLogon, 1); s4uLogon->MessageType = KerbS4ULogon; s4uLogon->ClientUpn.Buffer = (wchar_t*)((char*)s4uLogon + sizeof *s4uLogon); CopyMemory(s4uLogon->ClientUpn.Buffer, pszUserPrincipalName, cbUPN); s4uLogon->ClientUpn.Length = (USHORT)cbUPN; s4uLogon->ClientUpn.MaximumLength = (USHORT)cbUPN; // this information is copied into the resulting token // note that SourceName is an 8 character ASCII buffer TOKEN_SOURCE tokenSource; AllocateLocallyUniqueId(&tokenSource.SourceIdentifier); strcpy(tokenSource.SourceName, "test"); LSA_STRING originName; _si(&originName, "MSDN S4U Logon Sample"); // finally, the call to LsaLogonUser, // asking for a Network style logon // using the S4U2Self Kerb extension void* profile = 0; DWORD cbProfile = 0; LUID logonId; HANDLE htok; QUOTA_LIMITS quotaLimits; NTSTATUS subStatus; _checknterr(L"LsaLogonUser", LsaLogonUser(hlsa, &originName, Network, authnPkg, s4uLogon, cbLogon, 0, &tokenSource, &profile, &cbProfile, &logonId, &htok, "aLimits, &subStatus)); // clean up free(s4uLogon); LsaFreeReturnBuffer(profile); LsaClose(hlsa); return htok; } void main() { HANDLE htok = _s4uLogon(L"alice@esec.com"); } ты не с той проблемой воюешь забей на LsaLogonUser у тебя не идет LogonUserA/W потому что полиси рестрикшн! разбирайся с ней ЗЫ: а winlogon действительно использует именно LsaLogonUser потому что логонится на самом деле такой зомби по имени INTERACTIVE_LOGON а потом он уже переимперсонируется в настоящего юзера нахрена так - спроси у билли