Click here to Skip to main content
15,920,053 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
GeneralRe: Problems occuring when compiling C++ Programs using visual C++ 6 Pin
Joseph Marzbani12-Apr-08 2:54
Joseph Marzbani12-Apr-08 2:54 
GeneralRe: Problems occuring when compiling C++ Programs using visual C++ 6 Pin
CPallini12-Apr-08 4:42
mveCPallini12-Apr-08 4:42 
QuestionHow set the Form on the center of my screen ? Pin
Schehaider_Aymen11-Apr-08 23:44
Schehaider_Aymen11-Apr-08 23:44 
AnswerRe: How set the Form on the center of my screen ? Pin
ftbk11-Apr-08 23:57
ftbk11-Apr-08 23:57 
GeneralRe: How set the Form on the center of my screen ? Pin
Schehaider_Aymen12-Apr-08 0:08
Schehaider_Aymen12-Apr-08 0:08 
AnswerRe: How set the Form on the center of my screen ? Pin
Schehaider_Aymen12-Apr-08 0:41
Schehaider_Aymen12-Apr-08 0:41 
GeneralOnNewWindow2 multithread Pin
ftbk11-Apr-08 23:29
ftbk11-Apr-08 23:29 
Questionlogonuser returns 1314 Pin
vineeshV11-Apr-08 23:24
vineeshV11-Apr-08 23:24 
when i try to impersonate the process to a different user,the logonUser call fails with error no 1314 (privilage not held by the client ) in windows 2000 series
it was working in xp series of os

Please find sample code below



#define SECURITY_WIN32
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
#include <sspi.h>
#include <lm.h>
#include <lmcons.h>
#include <userenv.h>


#ifndef SEC_I_COMPLETE_NEEDED
#include <issperr.h>
#endif

typedef struct _AUTH_SEQ {
BOOL fInitialized;
BOOL fHaveCredHandle;
BOOL fHaveCtxtHandle;
CredHandle hcred;
struct _SecHandle hctxt;
} AUTH_SEQ, *PAUTH_SEQ;


// Function pointers
ACCEPT_SECURITY_CONTEXT_FN _AcceptSecurityContext = NULL;
ACQUIRE_CREDENTIALS_HANDLE_FN _AcquireCredentialsHandle = NULL;
COMPLETE_AUTH_TOKEN_FN _CompleteAuthToken = NULL;
DELETE_SECURITY_CONTEXT_FN _DeleteSecurityContext = NULL;
FREE_CONTEXT_BUFFER_FN _FreeContextBuffer = NULL;
FREE_CREDENTIALS_HANDLE_FN _FreeCredentialsHandle = NULL;
INITIALIZE_SECURITY_CONTEXT_FN _InitializeSecurityContext = NULL;
QUERY_SECURITY_PACKAGE_INFO_FN _QuerySecurityPackageInfo = NULL;
QUERY_SECURITY_CONTEXT_TOKEN_FN _QuerySecurityContextToken = NULL;


#define CheckAndLocalFree(ptr) \
if (ptr != NULL) \
{ \
LocalFree(ptr); \
ptr = NULL; \
}

#pragma comment(lib, "netapi32.lib")

LPVOID RetrieveTokenInformationClass(
HANDLE hToken,
TOKEN_INFORMATION_CLASS InfoClass,
LPDWORD lpdwSize)
{
LPVOID pInfo = NULL;
BOOL fSuccess = FALSE;

__try
{
*lpdwSize = 0;



GetTokenInformation(
hToken,
InfoClass,
NULL,
*lpdwSize, lpdwSize);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
_tprintf(_T("GetTokenInformation failed with %d\n"),
GetLastError());
__leave;
}


pInfo = LocalAlloc(LPTR, *lpdwSize);
if (pInfo == NULL)
{
_tprintf(_T("LocalAlloc failed with %d\n"), GetLastError());
__leave;
}

if (!GetTokenInformation(
hToken,
InfoClass,
pInfo,
*lpdwSize, lpdwSize))
{
_tprintf(_T("GetTokenInformation failed with %d\n"),
GetLastError());
__leave;
}

fSuccess = TRUE;
}
__finally
{

if (fSuccess == FALSE)
{
CheckAndLocalFree(pInfo);
}
}

return pInfo;
}

PSID GetUserSidFromWellKnownRid(DWORD Rid)
{
PUSER_MODALS_INFO_2 umi2;
NET_API_STATUS nas;

UCHAR SubAuthorityCount;
PSID pSid = NULL;

BOOL bSuccess = FALSE; // assume failure

nas = NetUserModalsGet(NULL, 2, (LPBYTE *)&umi2);

if (nas != NERR_Success)
{
printf("NetUserModalsGet failed with error code : [%d]\n",
nas);
SetLastError(nas);
return NULL;
}

SubAuthorityCount = *GetSidSubAuthorityCount
(umi2->usrmod2_domain_id);

//
// Allocate storage for new Sid. account domain Sid + account Rid
//

pSid = (PSID)LocalAlloc(LPTR,
GetSidLengthRequired((UCHAR)(SubAuthorityCount + 1)));

if (pSid != NULL)
{
if (InitializeSid(
pSid,
GetSidIdentifierAuthority(umi2->usrmod2_domain_id),
(BYTE)(SubAuthorityCount+1)
))
{
DWORD SubAuthIndex = 0;

//
// Copy existing subauthorities from account domain Sid into
// new Sid
//

for (; SubAuthIndex < SubAuthorityCount ; SubAuthIndex++)
{
*GetSidSubAuthority(pSid, SubAuthIndex) =
*GetSidSubAuthority(umi2->usrmod2_domain_id,
SubAuthIndex);
}

//
// Append Rid to new Sid
//

*GetSidSubAuthority(pSid, SubAuthorityCount) = Rid;
}
}

NetApiBufferFree(umi2);

return pSid;
}

BOOL IsGuest(HANDLE hToken)
{
BOOL fGuest = FALSE;
PSID pGuestSid = NULL;
PSID pUserSid = NULL;
TOKEN_USER *pUserInfo = NULL;
DWORD dwSize = 0;

pGuestSid = GetUserSidFromWellKnownRid(DOMAIN_USER_RID_GUEST);
if (pGuestSid == NULL)
return fGuest;

//
// Get user information
//

pUserInfo = (TOKEN_USER *)RetrieveTokenInformationClass(hToken,
TokenUser, &dwSize);
if (pUserInfo != NULL)
{
if (EqualSid(pGuestSid, pUserInfo->User.Sid))
fGuest = TRUE;
}

CheckAndLocalFree(pUserInfo);
CheckAndLocalFree(pGuestSid);

return fGuest;
}

///////////////////////////////////////////////////////////////////////////////


void UnloadSecurityDll(HMODULE hModule) {

if (hModule)
FreeLibrary(hModule);

_AcceptSecurityContext = NULL;
_AcquireCredentialsHandle = NULL;
_CompleteAuthToken = NULL;
_DeleteSecurityContext = NULL;
_FreeContextBuffer = NULL;
_FreeCredentialsHandle = NULL;
_InitializeSecurityContext = NULL;
_QuerySecurityPackageInfo = NULL;
_QuerySecurityContextToken = NULL;
}


///////////////////////////////////////////////////////////////////////////////


HMODULE LoadSecurityDll() {

HMODULE hModule;
BOOL fAllFunctionsLoaded = FALSE;
TCHAR lpszDLL[MAX_PATH];
OSVERSIONINFO VerInfo;

//
// Find out which security DLL to use, depending on
// whether we are on Windows NT or Windows 95, Windows 2000, WindowsXP, or Windows Server 2003
// We have to use security.dll on Windows NT 4.0.
// All other operating systems, we have to use Secur32.dll
//
VerInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (!GetVersionEx (&VerInfo)) // If this fails, something has gonewrong
{
return FALSE;
}

if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&
VerInfo.dwMajorVersion == 4 &&
VerInfo.dwMinorVersion == 0)
{
lstrcpy (lpszDLL, _T("security.dll"));
}
else
{
lstrcpy (lpszDLL, _T("secur32.dll"));
}


hModule = LoadLibrary(lpszDLL);
if (!hModule)
return NULL;

__try {

_AcceptSecurityContext = (ACCEPT_SECURITY_CONTEXT_FN)
GetProcAddress(hModule, "AcceptSecurityContext");
if (!_AcceptSecurityContext)
__leave;

#ifdef UNICODE
_AcquireCredentialsHandle = (ACQUIRE_CREDENTIALS_HANDLE_FN)
GetProcAddress(hModule, "AcquireCredentialsHandleW");
#else
_AcquireCredentialsHandle = (ACQUIRE_CREDENTIALS_HANDLE_FN)
GetProcAddress(hModule, "AcquireCredentialsHandleA");
#endif
if (!_AcquireCredentialsHandle)
__leave;


_CompleteAuthToken = (COMPLETE_AUTH_TOKEN_FN)
GetProcAddress(hModule, "CompleteAuthToken");

_DeleteSecurityContext = (DELETE_SECURITY_CONTEXT_FN)
GetProcAddress(hModule, "DeleteSecurityContext");
if (!_DeleteSecurityContext)
__leave;

_FreeContextBuffer = (FREE_CONTEXT_BUFFER_FN)
GetProcAddress(hModule, "FreeContextBuffer");
if (!_FreeContextBuffer)
__leave;

_FreeCredentialsHandle = (FREE_CREDENTIALS_HANDLE_FN)
GetProcAddress(hModule, "FreeCredentialsHandle");
if (!_FreeCredentialsHandle)
__leave;

#ifdef UNICODE
_InitializeSecurityContext = (INITIALIZE_SECURITY_CONTEXT_FN)
GetProcAddress(hModule, "InitializeSecurityContextW");
#else
_InitializeSecurityContext = (INITIALIZE_SECURITY_CONTEXT_FN)
GetProcAddress(hModule, "InitializeSecurityContextA");
#endif
if (!_InitializeSecurityContext)
__leave;

#ifdef UNICODE
_QuerySecurityPackageInfo = (QUERY_SECURITY_PACKAGE_INFO_FN)
GetProcAddress(hModule, "QuerySecurityPackageInfoW");
#else
_QuerySecurityPackageInfo = (QUERY_SECURITY_PACKAGE_INFO_FN)
GetProcAddress(hModule, "QuerySecurityPackageInfoA");
#endif
if (!_QuerySecurityPackageInfo)
__leave;


_QuerySecurityContextToken = (QUERY_SECURITY_CONTEXT_TOKEN_FN)
GetProcAddress(hModule, "QuerySecurityContextToken");
if (!_QuerySecurityContextToken)
__leave;

fAllFunctionsLoaded = TRUE;

} __finally {

if (!fAllFunctionsLoaded) {
UnloadSecurityDll(hModule);
hModule = NULL;
}

}

return hModule;
}


///////////////////////////////////////////////////////////////////////////////


BOOL GenClientContext(PAUTH_SEQ pAS, PSEC_WINNT_AUTH_IDENTITY
pAuthIdentity,
PVOID pIn, DWORD cbIn, PVOID pOut, PDWORD pcbOut, PBOOL pfDone) {

/*++

Routine Description:

Optionally takes an input buffer coming from the server and returns
a buffer of information to send back to the server. Also returns
an indication of whether or not the context is complete.

Return Value:

Returns TRUE if successful; otherwise FALSE.

--*/

SECURITY_STATUS ss;
TimeStamp tsExpiry;
SecBufferDesc sbdOut;
SecBuffer sbOut;
SecBufferDesc sbdIn;
SecBuffer sbIn;
ULONG fContextAttr;

if (!pAS->fInitialized) {

ss = _AcquireCredentialsHandle(NULL, _T("NTLM"),
SECPKG_CRED_OUTBOUND, NULL, pAuthIdentity, NULL, NULL,
&pAS->hcred, &tsExpiry);
if (ss < 0) {
fprintf(stderr, "AcquireCredentialsHandle failed with %08X\n",
ss);
return FALSE;
}

pAS->fHaveCredHandle = TRUE;
}

// Prepare output buffer
sbdOut.ulVersion = 0;
sbdOut.cBuffers = 1;
sbdOut.pBuffers = &sbOut;

sbOut.cbBuffer = *pcbOut;
sbOut.BufferType = SECBUFFER_TOKEN;
sbOut.pvBuffer = pOut;

// Prepare input buffer
if (pAS->fInitialized) {
sbdIn.ulVersion = 0;
sbdIn.cBuffers = 1;
sbdIn.pBuffers = &sbIn;

sbIn.cbBuffer = cbIn;
sbIn.BufferType = SECBUFFER_TOKEN;
sbIn.pvBuffer = pIn;
}

ss = _InitializeSecurityContext(&pAS->hcred,
pAS->fInitialized ? &pAS->hctxt : NULL, NULL, 0, 0,
SECURITY_NATIVE_DREP, pAS->fInitialized ? &sbdIn : NULL,
0, &pAS->hctxt, &sbdOut, &fContextAttr, &tsExpiry);
if (ss < 0) {
// <winerror.h>
fprintf(stderr, "InitializeSecurityContext failed with %08X\n",
ss);
return FALSE;
}

pAS->fHaveCtxtHandle = TRUE;

// If necessary, complete token
if (ss == SEC_I_COMPLETE_NEEDED || ss ==
SEC_I_COMPLETE_AND_CONTINUE) {

if (_CompleteAuthToken) {
ss = _CompleteAuthToken(&pAS->hctxt, &sbdOut);
if (ss < 0) {
fprintf(stderr, "CompleteAuthToken failed with %08X\n",
ss);
return FALSE;
}
}
else {
fprintf (stderr, "CompleteAuthToken not supported.\n");
return FALSE;
}
}

*pcbOut = sbOut.cbBuffer;

if (!pAS->fInitialized)
pAS->fInitialized = TRUE;

*pfDone = !(ss == SEC_I_CONTINUE_NEEDED
|| ss == SEC_I_COMPLETE_AND_CONTINUE );

return TRUE;
}


///////////////////////////////////////////////////////////////////////////////


BOOL GenServerContext(PAUTH_SEQ pAS, PVOID pIn, DWORD cbIn, PVOID pOut,
PDWORD pcbOut, PBOOL pfDone) {

/*++

Routine Description:

Takes an input buffer coming from the client and returns a buffer
to be sent to the client. Also returns an indication of whether or
not the context is complete.

Return Value:

Returns TRUE if successful; otherwise FALSE.

--*/

SECURITY_STATUS ss;
TimeStamp tsExpiry;
SecBufferDesc sbdOut;
SecBuffer sbOut;
SecBufferDesc sbdIn;
SecBuffer sbIn;
ULONG fContextAttr;

if (!pAS->fInitialized) {

ss = _AcquireCredentialsHandle(NULL, _T("NTLM"),
SECPKG_CRED_INBOUND, NULL, NULL, NULL, NULL, &pAS->hcred,
&tsExpiry);
if (ss < 0) {
fprintf(stderr, "AcquireCredentialsHandle failed with %08X\n",
ss);
return FALSE;
}

pAS->fHaveCredHandle = TRUE;
}

// Prepare output buffer
sbdOut.ulVersion = 0;
sbdOut.cBuffers = 1;
sbdOut.pBuffers = &sbOut;

sbOut.cbBuffer = *pcbOut;
sbOut.BufferType = SECBUFFER_TOKEN;
sbOut.pvBuffer = pOut;

// Prepare input buffer
sbdIn.ulVersion = 0;
sbdIn.cBuffers = 1;
sbdIn.pBuffers = &sbIn;

sbIn.cbBuffer = cbIn;
sbIn.BufferType = SECBUFFER_TOKEN;
sbIn.pvBuffer = pIn;

ss = _AcceptSecurityContext(&pAS->hcred,
pAS->fInitialized ? &pAS->hctxt : NULL, &sbdIn, 0,
SECURITY_NATIVE_DREP, &pAS->hctxt, &sbdOut, &fContextAttr,
&tsExpiry);
if (ss < 0) {
fprintf(stderr, "AcceptSecurityContext failed with %08X\n", ss);
return FALSE;
}

pAS->fHaveCtxtHandle = TRUE;

// If necessary, complete token
if (ss == SEC_I_COMPLETE_NEEDED || ss ==
SEC_I_COMPLETE_AND_CONTINUE) {

if (_CompleteAuthToken) {
ss = _CompleteAuthToken(&pAS->hctxt, &sbdOut);
if (ss < 0) {
fprintf(stderr, "CompleteAuthToken failed with %08X\n",
ss);
return FALSE;
}
}
else {
fprintf (stderr, "CompleteAuthToken not supported.\n");
return FALSE;
}
}

*pcbOut = sbOut.cbBuffer;

if (!pAS->fInitialized)
pAS->fInitialized = TRUE;

*pfDone = !(ss == SEC_I_CONTINUE_NEEDED
|| ss == SEC_I_COMPLETE_AND_CONTINUE);

return TRUE;
}


///////////////////////////////////////////////////////////////////////////////


BOOL WINAPI SSPLogonUser(LPTSTR szDomain, LPTSTR szUser, LPTSTR
szPassword)
{

AUTH_SEQ asServer = {0};
AUTH_SEQ asClient = {0};
BOOL fDone = FALSE;
BOOL fResult = FALSE;
DWORD cbOut = 0;
DWORD cbIn = 0;
DWORD cbMaxToken = 0;
PVOID pClientBuf = NULL;
PVOID pServerBuf = NULL;
PSecPkgInfo pSPI = NULL;
HMODULE hModule = NULL;

SEC_WINNT_AUTH_IDENTITY ai;

__try {

hModule = LoadSecurityDll();
if (!hModule)
__leave;

// Get max token size
_QuerySecurityPackageInfo(_T("NTLM"), &pSPI);
cbMaxToken = pSPI->cbMaxToken;
_FreeContextBuffer(pSPI);

// Allocate buffers for client and server messages
pClientBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
cbMaxToken);
pServerBuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
cbMaxToken);

// Initialize auth identity structure
ZeroMemory(&ai, sizeof(ai));
#if defined(UNICODE) || defined(_UNICODE)
ai.Domain = szDomain;
ai.DomainLength = lstrlen(szDomain);
ai.User = szUser;
ai.UserLength = lstrlen(szUser);
ai.Password = szPassword;
ai.PasswordLength = lstrlen(szPassword);
ai.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
#else
ai.Domain = (unsigned char *)szDomain;
ai.DomainLength = lstrlen(szDomain);
ai.User = (unsigned char *)szUser;
ai.UserLength = lstrlen(szUser);
ai.Password = (unsigned char *)szPassword;
ai.PasswordLength = lstrlen(szPassword);
ai.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
#endif

// Prepare client message (negotiate) .
cbOut = cbMaxToken;
if (!GenClientContext(&asClient, &ai, NULL, 0, pClientBuf,
&cbOut,
&fDone))
__leave;

// Prepare server message (challenge) .
cbIn = cbOut;
cbOut = cbMaxToken;
if (!GenServerContext(&asServer, pClientBuf, cbIn, pServerBuf,
&cbOut, &fDone))
__leave;
// Most likely failure: AcceptServerContext fails withSEC_E_LOGON_DENIED
// in the case of bad szUser or szPassword.
// Unexpected Result: Logon will succeed if you pass in a badszUser and
// the guest account is enabled in the specified domain.
// Prepare client message (authenticate) .
cbIn = cbOut;
cbOut = cbMaxToken;
if (!GenClientContext(&asClient, &ai, pServerBuf, cbIn,
pClientBuf,
&cbOut,
&fDone))
__leave;

// Prepare server message (authentication) .
cbIn = cbOut;
cbOut = cbMaxToken;
if (!GenServerContext(&asServer, pClientBuf, cbIn, pServerBuf,
&cbOut,
&fDone))
__leave;

fResult = TRUE;

{
HANDLE hToken = NULL;

if (_QuerySecurityContextToken(&asServer.hctxt, &hToken) == 0)
{
if (IsGuest(hToken))
{
printf("Logged in as Guest\n");
fResult = FALSE;
}
else
printf("Logged in as the desired user\n");
CloseHandle(hToken);
}
}


} __finally {

// Clean up resources
if (asClient.fHaveCtxtHandle)
_DeleteSecurityContext(&asClient.hctxt);

if (asClient.fHaveCredHandle)
_FreeCredentialsHandle(&asClient.hcred);

if (asServer.fHaveCtxtHandle)
_DeleteSecurityContext(&asServer.hctxt);

if (asServer.fHaveCredHandle)
_FreeCredentialsHandle(&asServer.hcred);

if (hModule)
UnloadSecurityDll(hModule);

HeapFree(GetProcessHeap(), 0, pClientBuf);
HeapFree(GetProcessHeap(), 0, pServerBuf);

}

return fResult;
}

//--------------------------------------------------------------------
// The GetConsoleInput function gets an array of characters from the
// keyboard, while printing only asterisks to the screen.

void GetConsoleInput(TCHAR* strInput, int intMaxChars)
{
char ch;
char minChar = ' ';
minChar++;

ch = getch();
while (ch != '\r')
{
if (ch == '\b' && strlen(strInput) > 0)
{
strInput[strlen(strInput)-1] = '\0';
printf("\b \b");
}
else if (ch >= minChar && (int)strlen(strInput) <
intMaxChars)
{
strInput[strlen(strInput)+1] = '\0';
strInput[strlen(strInput)] = ch;
putch('*');
}
ch = getch();
}
putch('\n');
}










#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | \
GENERIC_EXECUTE | GENERIC_ALL)


BOOL GetLogonSID (HANDLE hToken, PSID *ppsid)
{
BOOL bSuccess = FALSE;
DWORD dwIndex;
DWORD dwLength = 0;
PTOKEN_GROUPS ptg = NULL;

// Verify the parameter passed in is not NULL.
if (NULL == ppsid)
goto Cleanup;

// Get required buffer size and allocate the TOKEN_GROUPS buffer.

if (!GetTokenInformation(
hToken, // handle to the access token
TokenGroups, // get information about the token's groups
(LPVOID) ptg, // pointer to TOKEN_GROUPS buffer
0, // size of buffer
&dwLength // receives required buffer size
))
{
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
goto Cleanup;

ptg = (PTOKEN_GROUPS)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, dwLength);

if (ptg == NULL)
goto Cleanup;
}

// Get the token group information from the access token.

if (!GetTokenInformation(
hToken, // handle to the access token
TokenGroups, // get information about the token's groups
(LPVOID) ptg, // pointer to TOKEN_GROUPS buffer
dwLength, // size of buffer
&dwLength // receives required buffer size
))
{
goto Cleanup;
}

// Loop through the groups to find the logon SID.

for (dwIndex = 0; dwIndex < ptg->GroupCount; dwIndex++)
if ((ptg->Groups[dwIndex].Attributes & SE_GROUP_LOGON_ID)
== SE_GROUP_LOGON_ID)
{
// Found the logon SID; make a copy of it.

dwLength = GetLengthSid(ptg->Groups[dwIndex].Sid);
*ppsid = (PSID) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, dwLength);
if (*ppsid == NULL)
goto Cleanup;
if (!CopySid(dwLength, *ppsid, ptg->Groups[dwIndex].Sid))
{
HeapFree(GetProcessHeap(), 0, (LPVOID)*ppsid);
goto Cleanup;
}
break;
}

bSuccess = TRUE;

Cleanup:

// Free the buffer for the token groups.

if (ptg != NULL)
HeapFree(GetProcessHeap(), 0, (LPVOID)ptg);

return bSuccess;
}

VOID FreeLogonSID (PSID *ppsid)
{
HeapFree(GetProcessHeap(), 0, (LPVOID)*ppsid);
}






BOOL StartInteractiveClientProcess (
LPTSTR lpszUsername, // client to log on
LPTSTR lpszDomain, // domain of client's account
LPTSTR lpszPassword, // client's password
LPTSTR lpCommandLine // command line to execute
)
{
HANDLE hToken;
HDESK hdesk = NULL;
HWINSTA hwinsta = NULL, hwinstaSave = NULL;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
PSID pSid = NULL;
STARTUPINFO si;
BOOL bResult = FALSE;
PHANDLE pH = 0;
TOKEN_PRIVILEGES tp;
LUID luid;
tp.PrivilegeCount =1;
LookupPrivilegeValue(NULL,"SeIncreaseQuotaPrivilage",&luid);
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Log the client on to the local computer.

if (!LogonUser(
lpszUsername,
lpszDomain,
lpszPassword,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hToken) )
{
int i = GetLastError();
printf("The error caught is [%d]",i);


goto Cleanup;
}

if (! ImpersonateLoggedOnUser(hToken) )
goto Cleanup;

// Initialize the STARTUPINFO structure.
// Specify that the process runs in the interactive desktop.

ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb= sizeof(STARTUPINFO);


if(DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityDelegation,TokenPrimary,pH)){}


bResult = CreateProcessAsUser(
pH, // client's access token
lpCommandLine, // file to execute
NULL, // command line
NULL, // pointer to process SECURITY_ATTRIBUTES
NULL, // pointer to thread SECURITY_ATTRIBUTES
FALSE, // handles are not inheritable
NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, // creation flags
NULL, // pointer to new environment block
NULL, // name of current directory
&si, // pointer to STARTUPINFO structure
&pi // receives information about new process
);

if (0 ==bResult)
bResult = GetLastError();



// End impersonation of client.

RevertToSelf();

if (bResult && pi.hProcess != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}

if (pi.hThread != INVALID_HANDLE_VALUE)
CloseHandle(pi.hThread);

Cleanup:

if (hwinstaSave != NULL)
SetProcessWindowStation (hwinstaSave);

// Free the buffer for the logon SID.

if (pSid)
FreeLogonSID(&pSid);

// Close the handles to the interactive window station and desktop.

if (hwinsta)
CloseWindowStation(hwinsta);

if (hdesk)
CloseDesktop(hdesk);

// Close the handle to the client's access token.
/*
if (hToken != INVALID_HANDLE_VALUE)
CloseHandle(hToken);
*/

return bResult;
}

void _tmain(int argc, TCHAR **argv)
{
TCHAR password[PWLEN+1];

if (argc != 3)
{
_tprintf(_T("Usage: %s DomainName UserName\n"), argv[0]);
return;
}

_tprintf(_T("Enter password for the specified user : "));
password[0] = 0;
GetConsoleInput(password, PWLEN);
_tprintf(_T("\n"));
// argv[1] - Domain Name
// argv[2] - User Name
if (SSPLogonUser(argv[1], argv[2], password))
{
_tprintf(_T("User Credentials are valid\n"));
}
else
_tprintf(_T("User Credentials are NOT valid\n"));

_tprintf(_T("Entering to start the application \n"));

if(StartInteractiveClientProcess(argv[2],argv[1],password,"c:\\Windows\\System32\\notepad.exe"))
_tprintf(_T("Entered\n"));




}



i add the user right "act as part of the os " in the local configuration but nothing going well ...


Please help me ....

vineesh

QuestionRe: logonuser returns 1314 Pin
David Crow24-Apr-08 10:43
David Crow24-Apr-08 10:43 
Generalwhich design is better to wrap another class instance Pin
George_George11-Apr-08 22:54
George_George11-Apr-08 22:54 
GeneralRe: which design is better to wrap another class instance Pin
Cedric Moonen11-Apr-08 23:49
Cedric Moonen11-Apr-08 23:49 
GeneralRe: which design is better to wrap another class instance Pin
George_George11-Apr-08 23:51
George_George11-Apr-08 23:51 
GeneralRe: which design is better to wrap another class instance Pin
Cedric Moonen12-Apr-08 1:20
Cedric Moonen12-Apr-08 1:20 
GeneralRe: which design is better to wrap another class instance Pin
George_George12-Apr-08 1:23
George_George12-Apr-08 1:23 
GeneralRe: which design is better to wrap another class instance Pin
CPallini12-Apr-08 1:48
mveCPallini12-Apr-08 1:48 
GeneralRe: which design is better to wrap another class instance Pin
George_George12-Apr-08 1:56
George_George12-Apr-08 1:56 
GeneralRe: which design is better to wrap another class instance Pin
CPallini12-Apr-08 2:33
mveCPallini12-Apr-08 2:33 
GeneralRe: which design is better to wrap another class instance Pin
George_George12-Apr-08 3:46
George_George12-Apr-08 3:46 
GeneralRe: which design is better to wrap another class instance Pin
Blake Miller14-Apr-08 5:56
Blake Miller14-Apr-08 5:56 
GeneralRe: which design is better to wrap another class instance Pin
George_George14-Apr-08 22:41
George_George14-Apr-08 22:41 
GeneralRe: which design is better to wrap another class instance Pin
Blake Miller15-Apr-08 7:03
Blake Miller15-Apr-08 7:03 
GeneralRe: which design is better to wrap another class instance Pin
George_George16-Apr-08 0:52
George_George16-Apr-08 0:52 
Generalre-entrancy pattern issue setbacks Pin
George_George11-Apr-08 22:24
George_George11-Apr-08 22:24 
QuestionHow can remove button of Property Sheet? Pin
Le@rner11-Apr-08 21:44
Le@rner11-Apr-08 21:44 
AnswerRe: How can remove button of Property Sheet? Pin
Blake Miller14-Apr-08 5:58
Blake Miller14-Apr-08 5:58 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.