Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.30;
Скачать: CL | DM;

Вниз

Работа с учетными записями   Найти похожие ветки 

 
aldapooh   (2003-08-22 14:22) [0]

Добрый день! Есть сеть, есть домен. Нужно сделать чтобы дельфовская программа перед запуском спрашивала логин и пароль пользователя и только если есть такая учетная запись программа запускалась.
Как лучше получить эту информацию? Любые вашт рекомендации и советы, ссылки и тд.
Спасибо!


 
Игорь Шевченко ©   (2003-08-22 14:23) [1]

Зачем ?


 
aldapooh   (2003-08-22 14:25) [2]

Хорошо, скажем так... Логин и пароль должны совпадать с теми которые заданы сисадмином, как я могу это проверить?


 
Игорь Шевченко ©   (2003-08-22 14:27) [3]

Ничего не понятно. Зачем нужно решение такой задачи ? (Кроме подбора паролей к имеющимся учетным записям) ?


 
aldapooh   (2003-08-22 14:37) [4]

Нет, мне не нужны ни пароли, ничего такого.
Есть база данных, там прописаны права для пользователей. А подключаюсь я к базе через ADO используя integrated security. На самом деле можно было бы кадый раз делать Log Off Log In в Винде, чтобы менять имя учетной записи, но так как делать это приходиться часто, то логично было бы сделать вход в программу с теми же параметрами что и в винду (Логин пароль домен), так вот как проверить может ли данный человек работать с программой или нет.
Очень не хочу попасть в орехи :)


 
Игорь Шевченко ©   (2003-08-22 14:40) [5]

Есть у меня подозрение, что integrated security не даст подключиться с другой учетной записью, кроме текущей..Или я ошибаюсь ?


 
aldapooh   (2003-08-22 14:43) [6]

ну так если я сделаю как хочу то флажок переставлю на "use a specific user name and password"
Вы мне лучше скажите вообще возможно ли то что я задумал...


 
Игорь Шевченко ©   (2003-08-22 14:50) [7]

Возможно. Через функции SSPI, точного названия функции не помню


 
aldapooh   (2003-08-22 14:53) [8]

ну спасибо и на том! если вдруг вспомните или советк какой дадите буду благодарен!


 
Игорь Шевченко ©   (2003-08-22 15:14) [9]

#define _WIN32_WINNT 0x500
#define UNICODE
#include <windows.h>
#include <stdio.h>
#define SECURITY_WIN32
#include <security.h>
#pragma comment(lib, "secur32.lib")

// brain-dead error routine that dumps the last error and exits
void _err(const wchar_t* pszFcn, DWORD nErr = GetLastError())
{
wchar_t szErr[256];
if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, nErr, 0,
szErr, sizeof szErr / sizeof *szErr, 0))
wprintf(L"%s failed: %s", pszFcn, szErr);
else wprintf(L"%s failed: 0x%08X", nErr);
exit(1);
}

// Upon success, returns a handle to a NETWORK logon session
// for the specified principal (it will *not* have network
// credentials). Call CloseHandle to dispose of it when
// you are finished.
HANDLE _logonUserWithSSPI(wchar_t* pszSSP,
DWORD grfDesiredAccessToToken,
wchar_t* pszAuthority,
wchar_t* pszPrincipal,
wchar_t* pszPassword) {

// the following code loads the SSPI interface DLL
// and initializes it, getting a table of function ptrs
HINSTANCE hdll = LoadLibrary(L"security.dll");
if (!hdll)
_err(L"LoadLibrary");
INIT_SECURITY_INTERFACE_W initSecurityInterface =
(INIT_SECURITY_INTERFACE_W)GetProcAddress(hdll,
SECURITY_ENTRYPOINT_ANSIW);
if (!initSecurityInterface)
_err(L"GetProcAddress");
PSecurityFunctionTable pSSPI = initSecurityInterface();

// here"s where we specify the credentials to verify
SEC_WINNT_AUTH_IDENTITY_EX authIdent = {
SEC_WINNT_AUTH_IDENTITY_VERSION,
sizeof authIdent,
pszPrincipal, lstrlenW(pszPrincipal),
pszAuthority, lstrlenW(pszAuthority),
pszPassword, lstrlenW(pszPassword),
SEC_WINNT_AUTH_IDENTITY_UNICODE,
0, 0
};

// get an SSPI handle for these credentials
CredHandle hcredClient;
TimeStamp expiryClient;
SECURITY_STATUS err =
pSSPI->AcquireCredentialsHandle(0, pszSSP, SECPKG_CRED_OUTBOUND,
0, &authIdent, 0, 0,
&hcredClient, &expiryClient);
if (err)
_err(L"AcquireCredentialsHandle for client", err);

// use the caller"s credentials for the server
CredHandle hcredServer;
TimeStamp expiryServer;
err = pSSPI->AcquireCredentialsHandle(0, pszSSP, SECPKG_CRED_INBOUND,
0, 0, 0, 0, &hcredServer,
&expiryServer);
if (err)
_err(L"AcquireCredentialsHandle for server", err);

CtxtHandle hctxClient;
CtxtHandle hctxServer;

// create two buffers:
// one for the client sending tokens to the server,
// one for the server sending tokens to the client
// (buffer size chosen based on current Kerb SSP setting
// for cbMaxToken - you may need to adjust this)
BYTE bufC2S[8000];
BYTE bufS2C[8000];
SecBuffer sbufC2S = { sizeof bufC2S, SECBUFFER_TOKEN, bufC2S };
SecBuffer sbufS2C = { sizeof bufS2C, SECBUFFER_TOKEN, bufS2C };
SecBufferDesc bdC2S = { SECBUFFER_VERSION, 1, &sbufC2S };
SecBufferDesc bdS2C = { SECBUFFER_VERSION, 1, &sbufS2C };

// don"t really need any special context attributes
DWORD grfRequiredCtxAttrsClient = ISC_REQ_CONNECTION;
DWORD grfRequiredCtxAttrsServer = ISC_REQ_CONNECTION;

// set up some aliases to make it obvious what"s happening
PCtxtHandle pClientCtxHandleIn = 0;
PCtxtHandle pClientCtxHandleOut = &hctxClient;
PCtxtHandle pServerCtxHandleIn = 0;
PCtxtHandle pServerCtxHandleOut = &hctxServer;
SecBufferDesc* pClientInput = 0;
SecBufferDesc* pClientOutput = &bdC2S;
SecBufferDesc* pServerInput = &bdC2S;
SecBufferDesc* pServerOutput = &bdS2C;
DWORD grfCtxAttrsClient = 0;
DWORD grfCtxAttrsServer = 0;
TimeStamp expiryClientCtx;
TimeStamp expiryServerCtx;

// since the caller is acting as the server, we need
// a server principal name so that the client will
// be able to get a Kerb ticket (if Kerb is used)
wchar_t szSPN[256];
ULONG cchSPN = sizeof szSPN / sizeof *szSPN;
GetUserNameEx(NameSamCompatible, szSPN, &cchSPN);

// perform the authentication handshake, playing the
// role of both client *and* server.
bool bClientContinue = true;
bool bServerContinue = true;
while (bClientContinue || bServerContinue) {
if (bClientContinue) {
sbufC2S.cbBuffer = sizeof bufC2S;
err = pSSPI->InitializeSecurityContext(
&hcredClient, pClientCtxHandleIn,
szSPN,
grfRequiredCtxAttrsClient,
0, SECURITY_NATIVE_DREP,
pClientInput, 0,
pClientCtxHandleOut,
pClientOutput,
&grfCtxAttrsClient,
&expiryClientCtx);
switch (err) {
case 0:
bClientContinue = false;
break;
case SEC_I_CONTINUE_NEEDED:
pClientCtxHandleIn = pClientCtxHandleOut;
pClientInput = pServerOutput;
break;
default:
_err(L"InitializeSecurityContext", err);
}
}

if (bServerContinue) {
sbufS2C.cbBuffer = sizeof bufS2C;
err = pSSPI->AcceptSecurityContext(
&hcredServer, pServerCtxHandleIn,
pServerInput,
grfRequiredCtxAttrsServer,
SECURITY_NATIVE_DREP,
pServerCtxHandleOut,
pServerOutput,
&grfCtxAttrsServer,
&expiryServerCtx);
switch (err) {
case 0:
bServerContinue = false;
break;
case SEC_I_CONTINUE_NEEDED:
pServerCtxHandleIn = pServerCtxHandleOut;
break;
default:
_err(L"AcceptSecurityContext", err);
}
}
}
// if everything has gone smoothly, we"ve now got a logon
// session for the client - let"s grab the token now
pSSPI->ImpersonateSecurityContext(pServerCtxHandleOut);
HANDLE htok;
if (!OpenThreadToken(GetCurrentThread(),
grfDesiredAccessToToken,
TRUE, &htok))
_err(L"OpenThreadToken");

// clean up
pSSPI->FreeCredentialsHandle(&hcredClient);
pSSPI->FreeCredentialsHandle(&hcredServer);
pSSPI->DeleteSecurityContext(pServerCtxHandleOut);
pSSPI->DeleteSecurityContext(pClientCtxHandleOut);

return htok;
}

// here"s an example of usage
void main() {
// use "NTLM" or "Kerberos"
HANDLE htok = _logonUserWithSSPI(L"Kerberos",
TOKEN_QUERY,
L"bar.com",
L"alice",
L"alice");
CloseHandle(htok);
}


 
aldapooh   (2003-08-23 10:07) [10]

супер пупер спасибо! большое спасибо!


 
aldapooh   (2003-08-23 13:39) [11]

вот кстати нашел CredUIPromptForCredentials и CredUIConfirmCredentials в MSDN. мне кажется эти функции тоже могут мне помочь в данной ситуации, или я ошибаюсь?


 
aldapooh   (2003-08-25 10:24) [12]

самый глупый вопрос на свете - в какой библиотеке эти функции я могу взять чтобы использовать в Delphi?



Страницы: 1 вся ветка

Текущий архив: 2003.10.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
1-98547
Замученный
2003-10-20 15:32
2003.10.30
Как начертить график


3-98513
Beton
2003-10-08 19:46
2003.10.30
Числа прописью


4-98939
w666w
2003-08-27 19:15
2003.10.30
Как установить 2 разных иконки для приложения (32х32) и (16х16)


3-98478
Geugenk
2003-10-07 19:52
2003.10.30
Помогите програмно создать фильтр


6-98759
Неумеха
2003-09-05 14:28
2003.10.30
Web-страницы через ShellExecute