Ureader.com  
Microsoft software help and Community
   home   |   control panel login   |   archive   |  
 
platform
active.directory
adsi
adsi.iis-admin
base
com_ole
complus_mts
component_svcs
database
directx
gdi
graphics_mm
internet.client
internet.server
internet.server.isapi-dev
localization
mapi
messaging
msi
mslayerforunicode
multimedia
networking
networking.ipv6
sdk_install
security
shell
telephony.tapi_2
telephony.tapi_3
telephony.tsp
telephony.wte
tools
ui
ui_shell
win_base_svcs
win16
  
 
date: Tue, 19 Aug 2008 06:07:10 -0700 (PDT),    group: microsoft.public.platformsdk.security        back       


LogonUser failed with ERROR_PRIVILEGE_NOT_HELD in winnt machines   
Hi,

I have been trying to create a process with different user credentials
in Windows NT machine using LogonUser and CreateProcessAsUser Win32
API function calls.
While calling the function LogonUser, it fails with the error
ERROR_PRIVILEGE_NOT_HELD 1314 or A required privilege is not held by
the client.

I have set the following privileges

SeTcbPrivilege
SeTakeOwnershipPrivilege
SeChangeNotifyPrivilege
SeIncreaseQuotaPrivilege
SeAssignPrimaryTokenPrivilege
SeCreateTokenPrivilege

to the calling process

I have given the code snippet here

DWORD				dwSize;
    HANDLE				hToken;
    LPVOID				lpvEnv;
    PROCESS_INFORMATION pi = {0};
    STARTUPINFO         si = {0};
    WCHAR               szUserProfile[1024] = L"";

	RunAs runAs;

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

	//CAccessToken cAccessToken;
	//cAccessToken.EnablePrivilege(
	this->LogMessage("Started opening the process token.");

	// Getting the token of the current process
	if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY, &hToken) )
	{
		LUID_AND_ATTRIBUTES la, la1, la2;
		LUID_AND_ATTRIBUTES la3, la4, la5;

		this->LogMessage("OpenProcessToken Succeded");

		ZeroMemory(&la, sizeof(la));
		ZeroMemory(&la1, sizeof(la1));
		ZeroMemory(&la2, sizeof(la2));
		ZeroMemory(&la3, sizeof(la3));
		ZeroMemory(&la4, sizeof(la4));
		ZeroMemory(&la5, sizeof(la5));

		// Looking up the Act as operating system privilege for the current
process
		if( LookupPrivilegeValue(NULL, L"SeTakeOwnershipPrivilege",
&la.Luid) )
		{
			this->LogMessage("LookupPrivilegeValue SeTakeOwnershipPrivilege
Succeded");
			la.Attributes = SE_PRIVILEGE_ENABLED;
		}
		else
		{
			string errorMsg = DisplayError(L"LookupPrivilegeValue
SeTakeOwnershipPrivilege Failed");
			CloseHandle(hToken);
			this->LogMessage(errorMsg);
			return false;
		}
		if( LookupPrivilegeValue(NULL, L"SeTcbPrivilege", &la1.Luid) )
		{
			this->LogMessage("LookupPrivilegeValue SeTcbPrivilege Succeded");
			la1.Attributes = SE_PRIVILEGE_ENABLED;
		}
		else
		{
			string errorMsg = DisplayError(L"LookupPrivilegeValue
SeTcbPrivilege  Failed");
			CloseHandle(hToken);
			this->LogMessage(errorMsg);
			return false;
		}
		if( LookupPrivilegeValue(NULL, L"SeChangeNotifyPrivilege",
&la2.Luid) )
		{
			this->LogMessage("LookupPrivilegeValue SeChangeNotifyPrivilege
Succeded");
			la2.Attributes = SE_PRIVILEGE_ENABLED;
		}
		else
		{
			string errorMsg = DisplayError(L"LookupPrivilegeValue
SeChangeNotifyPrivilege Failed");
			CloseHandle(hToken);
			this->LogMessage(errorMsg);
			return false;
		}


		if( LookupPrivilegeValue(NULL, L"SeIncreaseQuotaPrivilege",
&la3.Luid) )
		{
			this->LogMessage("LookupPrivilegeValue SeIncreaseQuotaPrivilege
Succeded");
			la3.Attributes = SE_PRIVILEGE_ENABLED;
		}
		else
		{
			string errorMsg = DisplayError(L"LookupPrivilegeValue
SeIncreaseQuotaPrivilege  Failed");
			CloseHandle(hToken);
			this->LogMessage(errorMsg);
			return false;
		}
		if( LookupPrivilegeValue(NULL, L"SeAssignPrimaryTokenPrivilege",
&la4.Luid) )
		{
			this->LogMessage("LookupPrivilegeValue
SeAssignPrimaryTokenPrivilege Succeded");
			la4.Attributes = SE_PRIVILEGE_ENABLED;
		}
		else
		{
			string errorMsg = DisplayError(L"LookupPrivilegeValue
SeAssignPrimaryTokenPrivilege Failed");
			CloseHandle(hToken);
			this->LogMessage(errorMsg);
			return false;
		}

		if( LookupPrivilegeValue(NULL, L"SeCreateTokenPrivilege",
&la5.Luid) )
		{
			this->LogMessage("LookupPrivilegeValue SeCreateTokenPrivilege
Succeded");
			la5.Attributes = SE_PRIVILEGE_ENABLED;
		}
		else
		{
			string errorMsg = DisplayError(L"LookupPrivilegeValue
SeCreateTokenPrivilege  Failed");
			CloseHandle(hToken);
			this->LogMessage(errorMsg);
			return false;
		}


		DWORD privilegeSize = 1;
		TOKEN_PRIVILEGES tp, tp1, tp2, tp3, tp4, tp5;

		tp.PrivilegeCount = privilegeSize;
		tp.Privileges[0].Attributes = la.Attributes;
		tp.Privileges[0].Luid = la.Luid;
		if(!AdjustTokenPrivileges(hToken, FALSE, &tp,
sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
		{
			string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
Failed");
			this->LogMessage(errorMsg);
			CloseHandle(hToken);
			return false;
		}

		tp1.PrivilegeCount = privilegeSize;
		tp1.Privileges[0].Attributes = la1.Attributes;
		tp1.Privileges[0].Luid = la1.Luid;
		if(!AdjustTokenPrivileges(hToken, FALSE, &tp1,
sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
		{
			string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
Failed");
			this->LogMessage(errorMsg);
			CloseHandle(hToken);
			return false;
		}

		tp2.PrivilegeCount = privilegeSize;
		tp2.Privileges[0].Attributes = la2.Attributes;
		tp2.Privileges[0].Luid = la2.Luid;
		if(!AdjustTokenPrivileges(hToken, FALSE, &tp2,
sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
		{
			string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
Failed");
			this->LogMessage(errorMsg);
			CloseHandle(hToken);
			return false;
		}
		tp3.PrivilegeCount = privilegeSize;
		tp3.Privileges[0].Attributes = la3.Attributes;
		tp3.Privileges[0].Luid = la3.Luid;
		if(!AdjustTokenPrivileges(hToken, FALSE, &tp3,
sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
		{
			string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
Failed");
			this->LogMessage(errorMsg);
			CloseHandle(hToken);
			return false;
		}
		tp4.PrivilegeCount = privilegeSize;
		tp4.Privileges[0].Attributes = la4.Attributes;
		tp4.Privileges[0].Luid = la4.Luid;
		if(!AdjustTokenPrivileges(hToken, FALSE, &tp4,
sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
		{
			string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
Failed");
			this->LogMessage(errorMsg);
			CloseHandle(hToken);
			return false;
		}
		tp5.PrivilegeCount = privilegeSize;
		tp5.Privileges[0].Attributes = la5.Attributes;
		tp5.Privileges[0].Luid = la5.Luid;

		//Adjusting the privileges for the current process
		if(!AdjustTokenPrivileges(hToken, FALSE, &tp5,
sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
		{
			string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
Failed");
			this->LogMessage(errorMsg);
			CloseHandle(hToken);
			return false;
		}
	}
	else
	{
		string errorMsg = DisplayError(L"OpenProcessToken Failed");
		this->LogMessage(errorMsg);
		CloseHandle(hToken);
		return false;
	}

	if( !LogonUser(wUserName, wDomainName, wpassword,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken) )
	{
		string errorMsg = DisplayError(L"LogonUser Failed");
		this->LogMessage(errorMsg);
		CloseHandle(hToken);
		return false;
	}

Now this logonuser fails with the error 1314.

Any suggestions........

Thanks
date: Tue, 19 Aug 2008 06:07:10 -0700 (PDT)   author:   tsgd84

Re: LogonUser failed with ERROR_PRIVILEGE_NOT_HELD in winnt machines   
Try "Act as Part of Operating System" privilege.

CAC

On Aug 19, 2:07 pm, tsgd84  wrote:
> Hi,
>
> I have been trying to create a process with different user credentials
> in Windows NT machine using LogonUser and CreateProcessAsUser Win32
> API function calls.
> While calling the function LogonUser, it fails with the error
> ERROR_PRIVILEGE_NOT_HELD 1314 or A required privilege is not held by
> the client.
>
> I have set the following privileges
>
> SeTcbPrivilege
> SeTakeOwnershipPrivilege
> SeChangeNotifyPrivilege
> SeIncreaseQuotaPrivilege
> SeAssignPrimaryTokenPrivilege
> SeCreateTokenPrivilege
>
> to the calling process
>
> I have given the code snippet here
>
> DWORD                           dwSize;
>     HANDLE                              hToken;
>     LPVOID                              lpvEnv;
>     PROCESS_INFORMATION pi = {0};
>     STARTUPINFO         si = {0};
>     WCHAR               szUserProfile[1024] = L"";
>
>         RunAs runAs;
>
>         ZeroMemory(&pi, sizeof(pi));
>         ZeroMemory(&si, sizeof(si));
>     si.cb = sizeof(STARTUPINFO);
>
>         //CAccessToken cAccessToken;
>         //cAccessToken.EnablePrivilege(
>         this->LogMessage("Started opening the process token.");
>
>         // Getting the token of the current process
>         if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
> TOKEN_QUERY, &hToken) )
>         {
>                 LUID_AND_ATTRIBUTES la, la1, la2;
>                 LUID_AND_ATTRIBUTES la3, la4, la5;
>
>                 this->LogMessage("OpenProcessToken Succeded");
>
>                 ZeroMemory(&la, sizeof(la));
>                 ZeroMemory(&la1, sizeof(la1));
>                 ZeroMemory(&la2, sizeof(la2));
>                 ZeroMemory(&la3, sizeof(la3));
>                 ZeroMemory(&la4, sizeof(la4));
>                 ZeroMemory(&la5, sizeof(la5));
>
>                 // Looking up the Act as operating system privilege for the current
> process
>                 if( LookupPrivilegeValue(NULL, L"SeTakeOwnershipPrivilege",
> &la.Luid) )
>                 {
>                         this->LogMessage("LookupPrivilegeValue SeTakeOwnershipPrivilege
> Succeded");
>                         la.Attributes = SE_PRIVILEGE_ENABLED;
>                 }
>                 else
>                 {
>                         string errorMsg = DisplayError(L"LookupPrivilegeValue
> SeTakeOwnershipPrivilege Failed");
>                         CloseHandle(hToken);
>                         this->LogMessage(errorMsg>                         return false;
>                 }
>                 if( LookupPrivilegeValue(NULL, L"SeTcbPrivilege", &la1.Luid) )
>                 {
>                         this->LogMessage("LookupPrivilegeValue SeTcbPrivilege Succeded");
>                         la1.Attributes = SE_PRIVILEGE_ENABLED;
>                 }
>                 else
>                 {
>                         string errorMsg = DisplayError(L"LookupPrivilegeValue
> SeTcbPrivilege  Failed");
>                         CloseHandle(hToken);
>                         this->LogMessage(errorMsg>                         return false;
>                 }
>                 if( LookupPrivilegeValue(NULL, L"SeChangeNotifyPrivilege",
> &la2.Luid) )
>                 {
>                         this->LogMessage("LookupPrivilegeValue SeChangeNotifyPrivilege
> Succeded");
>                         la2.Attributes = SE_PRIVILEGE_ENABLED;
>                 }
>                 else
>                 {
>                         string errorMsg = DisplayError(L"LookupPrivilegeValue
> SeChangeNotifyPrivilege Failed");
>                         CloseHandle(hToken);
>                         this->LogMessage(errorMsg>                         return false;
>                 }
>
>                 if( LookupPrivilegeValue(NULL, L"SeIncreaseQuotaPrivilege",
> &la3.Luid) )
>                 {
>                         this->LogMessage("LookupPrivilegeValue SeIncreaseQuotaPrivilege
> Succeded");
>                         la3.Attributes = SE_PRIVILEGE_ENABLED;
>                 }
>                 else
>                 {
>                         string errorMsg = DisplayError(L"LookupPrivilegeValue
> SeIncreaseQuotaPrivilege  Failed");
>                         CloseHandle(hToken);
>                         this->LogMessage(errorMsg>                         return false;
>                 }
>                 if( LookupPrivilegeValue(NULL, L"SeAssignPrimaryTokenPrivilege",
> &la4.Luid) )
>                 {
>                         this->LogMessage("LookupPrivilegeValue
> SeAssignPrimaryTokenPrivilege Succeded");
>                         la4.Attributes = SE_PRIVILEGE_ENABLED;
>                 }
>                 else
>                 {
>                         string errorMsg = DisplayError(L"LookupPrivilegeValue
> SeAssignPrimaryTokenPrivilege Failed");
>                         CloseHandle(hToken);
>                         this->LogMessage(errorMsg>                         return false;
>                 }
>
>                 if( LookupPrivilegeValue(NULL, L"SeCreateTokenPrivilege",
> &la5.Luid) )
>                 {
>                         this->LogMessage("LookupPrivilegeValue SeCreateTokenPrivilege
> Succeded");
>                         la5.Attributes = SE_PRIVILEGE_ENABLED;
>                 }
>                 else
>                 {
>                         string errorMsg = DisplayError(L"LookupPrivilegeValue
> SeCreateTokenPrivilege  Failed");
>                         CloseHandle(hToken);
>                         this->LogMessage(errorMsg>                         return false;
>                 }
>
>                 DWORD privilegeSize = 1;
>                 TOKEN_PRIVILEGES tp, tp1, tp2, tp3, tp4, tp5;
>
>                 tp.PrivilegeCount = privilegeSize;
>                 tp.Privileges[0].Attributes = la.Attributes;
>                 tp.Privileges[0].Luid = la.Luid;
>                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp,
> sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
>                 {
>                         string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
> Failed");
>                         this->LogMessage(errorMsg>                         CloseHandle(hToken);
>                         return false;
>                 }
>
>                 tp1.PrivilegeCount = privilegeSize;
>                 tp1.Privileges[0].Attributes = la1.Attributes;
>                 tp1.Privileges[0].Luid = la1.Luid;
>                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp1,
> sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
>                 {
>                         string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
> Failed");
>                         this->LogMessage(errorMsg>                         CloseHandle(hToken);
>                         return false;
>                 }
>
>                 tp2.PrivilegeCount = privilegeSize;
>                 tp2.Privileges[0].Attributes = la2.Attributes;
>                 tp2.Privileges[0].Luid = la2.Luid;
>                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp2,
> sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
>                 {
>                         string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
> Failed");
>                         this->LogMessage(errorMsg>                         CloseHandle(hToken);
>                         return false;
>                 }
>                 tp3.PrivilegeCount = privilegeSize;
>                 tp3.Privileges[0].Attributes = la3.Attributes;
>                 tp3.Privileges[0].Luid = la3.Luid;
>                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp3,
> sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
>                 {
>                         string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
> Failed");
>                         this->LogMessage(errorMsg>                         CloseHandle(hToken);
>                         return false;
>                 }
>                 tp4.PrivilegeCount = privilegeSize;
>                 tp4.Privileges[0].Attributes = la4.Attributes;
>                 tp4.Privileges[0].Luid = la4.Luid;
>                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp4,
> sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
>                 {
>                         string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
> Failed");
>                         this->LogMessage(errorMsg>                         CloseHandle(hToken);
>                         return false;
>                 }
>                 tp5.PrivilegeCount = privilegeSize;
>                 tp5.Privileges[0].Attributes = la5.Attributes;
>                 tp5.Privileges[0].Luid = la5.Luid;
>
>                 //Adjusting the privileges for the current process
>                 if(!AdjustTokenPrivileges(hToken, FALSE, &tp5,
> sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL))
>                 {
>                         string errorMsg = DisplayError(L"AdjustTokenPrivileges SE_TCB_NAME
> Failed");
>                         this->LogMessage(errorMsg>                         CloseHandle(hToken);
>                         return false;
>                 }
>         }
>         else
>         {
>                 string errorMsg = DisplayError(L"OpenProcessToken Failed");
>                 this->LogMessage(errorMsg);
>                 CloseHandle(hToken);
>                 return false;
>         }
>
>         if( !LogonUser(wUserName, wDomainName, wpassword,
> LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken) )
>         {
>                 string errorMsg = DisplayError(L"LogonUser Failed");
>                 this->LogMessage(errorMsg);
>                 CloseHandle(hToken);
>                 return false;
>         }
>
> Now this logonuser fails with the error 1314.
>
> Any suggestions........
>
> Thanks
date: Sat, 30 Aug 2008 02:33:04 -0700 (PDT)   author:   unknown

Google
 
Web ureader.com


    COPYRIGHT 2007, YARDI TECHNOLOGY LIMITED, ALL RIGHT RESERVE  |   contact us