BOOL CheckPassword_LogonUser(
IN PCTSTR pszDomainName,
IN PCTSTR pszUserName,
IN PCTSTR pszPassword,
OUT PHANDLE phToken
)
{
_ASSERTE(pszUserName != NULL);
_ASSERTE(pszPassword != NULL);
HANDLE hToken;
TCHAR szDomainName[DNLEN + 1];
TCHAR szUserName[UNLEN + 1];
TCHAR szPassword[PWLEN + 1];
if (pszDomainName == NULL)
{
BYTE bSid[8 + 4 * SID_MAX_SUB_AUTHORITIES];
ULONG cbSid = sizeof(bSid);
ULONG cchDomainName = countof(szDomainName);
SID_NAME_USE Use;
if (!LookupAccountName(NULL, pszUserName, (PSID)bSid, &cbSid,
szDomainName, &cchDomainName, &Use))
return FALSE;
}
else
lstrcpyn(szDomainName, pszDomainName, countof(szDomainName));
lstrcpyn(szUserName, pszUserName, countof(szUserName));
lstrcpyn(szPassword, pszPassword, countof(szPassword));
if (!LogonUser(szUserName, szDomainName, szPassword,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
&hToken))
return FALSE;
if (phToken == NULL)
_VERIFY(CloseHandle(hToken));
else
*phToken = hToken;
return TRUE;
}
Как заставить работать код в Builder'е
Код:
непонятно что такое countof, на MSDN'не не нашёл, и что такое _ASSERTE и _VERIFY. Возможно отработка исключения.
Цитата: Tramp
Помогите пожалуйста:
непонятно что такое countof, на MSDN'не не нашёл, и что такое _ASSERTE и _VERIFY. Возможно отработка исключения.
Код:
BOOL CheckPassword_LogonUser(
IN PCTSTR pszDomainName,
IN PCTSTR pszUserName,
IN PCTSTR pszPassword,
OUT PHANDLE phToken
)
{
_ASSERTE(pszUserName != NULL);
_ASSERTE(pszPassword != NULL);
HANDLE hToken;
TCHAR szDomainName[DNLEN + 1];
TCHAR szUserName[UNLEN + 1];
TCHAR szPassword[PWLEN + 1];
if (pszDomainName == NULL)
{
BYTE bSid[8 + 4 * SID_MAX_SUB_AUTHORITIES];
ULONG cbSid = sizeof(bSid);
ULONG cchDomainName = countof(szDomainName);
SID_NAME_USE Use;
if (!LookupAccountName(NULL, pszUserName, (PSID)bSid, &cbSid,
szDomainName, &cchDomainName, &Use))
return FALSE;
}
else
lstrcpyn(szDomainName, pszDomainName, countof(szDomainName));
lstrcpyn(szUserName, pszUserName, countof(szUserName));
lstrcpyn(szPassword, pszPassword, countof(szPassword));
if (!LogonUser(szUserName, szDomainName, szPassword,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
&hToken))
return FALSE;
if (phToken == NULL)
_VERIFY(CloseHandle(hToken));
else
*phToken = hToken;
return TRUE;
}
IN PCTSTR pszDomainName,
IN PCTSTR pszUserName,
IN PCTSTR pszPassword,
OUT PHANDLE phToken
)
{
_ASSERTE(pszUserName != NULL);
_ASSERTE(pszPassword != NULL);
HANDLE hToken;
TCHAR szDomainName[DNLEN + 1];
TCHAR szUserName[UNLEN + 1];
TCHAR szPassword[PWLEN + 1];
if (pszDomainName == NULL)
{
BYTE bSid[8 + 4 * SID_MAX_SUB_AUTHORITIES];
ULONG cbSid = sizeof(bSid);
ULONG cchDomainName = countof(szDomainName);
SID_NAME_USE Use;
if (!LookupAccountName(NULL, pszUserName, (PSID)bSid, &cbSid,
szDomainName, &cchDomainName, &Use))
return FALSE;
}
else
lstrcpyn(szDomainName, pszDomainName, countof(szDomainName));
lstrcpyn(szUserName, pszUserName, countof(szUserName));
lstrcpyn(szPassword, pszPassword, countof(szPassword));
if (!LogonUser(szUserName, szDomainName, szPassword,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
&hToken))
return FALSE;
if (phToken == NULL)
_VERIFY(CloseHandle(hToken));
else
*phToken = hToken;
return TRUE;
}
непонятно что такое countof, на MSDN'не не нашёл, и что такое _ASSERTE и _VERIFY. Возможно отработка исключения.
_ASSERTE - что-то в роде блока if else(), т.е. если у тебя pszUserName == NULL, то прога вывалиться с ошибкой. - очень хорошо для отладки.
_VERIFY - тоже самое, проверяет успешно ли выполнена операция. в данном случае CloseHandle()
countof - функция подсчитывающая кол-во символов в нужной переменной, является самописной. (пологаю)
код скорее всего был написано на MS C++, т.к. в борланде (по крайней мере в 6м), _ASSERTE и _VERIFY нету.
ЗЫ: делай выводы и переписывай код, может тогда заработает.
NeO_u и kot_ спасибо разобрался!:)
Цитата:
Метод с использованием функции LogonUser весьма прост, но требует наличия TCB-привилегии у вызывающего.
не кто не в курсе, что за TCB-привелегии?
А вот что у меня получилось: ;)
Код:
[COLOR="Green"]#define countof( array ) ( sizeof( array )/sizeof( array[0] ) )[/COLOR]
bool CheckPassword_LogonUser(
const AnsiString DomainName,
const AnsiString UserName,
const AnsiString Password
)
{
const char* pszDomainName = DomainName.c_str();
const char* pszUserName = UserName.c_str();
const char* pszPassword = Password.c_str();
if (pszUserName == NULL) return false;
if (pszPassword == NULL) return false;
PHANDLE phToken;
HANDLE hToken;
TCHAR szDomainName[128];
TCHAR szUserName[128];
TCHAR szPassword[128];
if (pszDomainName == NULL)
{
BYTE bSid[8 + 4 * SID_MAX_SUB_AUTHORITIES];
ULONG cbSid = sizeof(bSid);
ULONG cchDomainName = countof(szDomainName);
SID_NAME_USE Use;
if (!LookupAccountName(NULL, pszUserName, (PSID)bSid, &cbSid,
szDomainName, &cchDomainName, &Use))
return false;
}
else
lstrcpyn(szDomainName, pszDomainName, countof(szDomainName));
lstrcpyn(szUserName, pszUserName, countof(szUserName));
lstrcpyn(szPassword, pszPassword, countof(szPassword));
if (!LogonUser(szUserName, szDomainName, szPassword,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
&hToken))
return false;
if (phToken == NULL)
{
try
{
CloseHandle(hToken);
}
catch(...)
{
return false;
}
}
else
*phToken = hToken;
return true;
}
[COLOR="#008000"]#undef countof( array )[/COLOR]
bool CheckPassword_LogonUser(
const AnsiString DomainName,
const AnsiString UserName,
const AnsiString Password
)
{
const char* pszDomainName = DomainName.c_str();
const char* pszUserName = UserName.c_str();
const char* pszPassword = Password.c_str();
if (pszUserName == NULL) return false;
if (pszPassword == NULL) return false;
PHANDLE phToken;
HANDLE hToken;
TCHAR szDomainName[128];
TCHAR szUserName[128];
TCHAR szPassword[128];
if (pszDomainName == NULL)
{
BYTE bSid[8 + 4 * SID_MAX_SUB_AUTHORITIES];
ULONG cbSid = sizeof(bSid);
ULONG cchDomainName = countof(szDomainName);
SID_NAME_USE Use;
if (!LookupAccountName(NULL, pszUserName, (PSID)bSid, &cbSid,
szDomainName, &cchDomainName, &Use))
return false;
}
else
lstrcpyn(szDomainName, pszDomainName, countof(szDomainName));
lstrcpyn(szUserName, pszUserName, countof(szUserName));
lstrcpyn(szPassword, pszPassword, countof(szPassword));
if (!LogonUser(szUserName, szDomainName, szPassword,
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,
&hToken))
return false;
if (phToken == NULL)
{
try
{
CloseHandle(hToken);
}
catch(...)
{
return false;
}
}
else
*phToken = hToken;
return true;
}
[COLOR="#008000"]#undef countof( array )[/COLOR]