Pregunta

Quiero crear un proceso en virtud de otro usuario. Así que uso LogonUser y CreateProcessAsUser. Pero mi problema es que CreatePtocessAsUser siempre devuelve el código de error 1314, lo que significa "Un gran privilegio necesario no es contenido por el cliente". Así que mi pregunta es, ¿qué estoy haciendo mal? O ¿cómo puedo dar los privilegios a la manija? (Creo que el mango debe tener los privilegios, o me equivoco?) Lo siento por mis errores inglés, pero mi conocimiento Inglés no es la mejor :)

de Plesase ayuda si alguien sabe cómo corregir mi solicitud.

Esta parte de mi código.

STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
TOKEN_PRIVILEGES tp;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo)); 
StartInfo.cb = sizeof(StartInfo); 
HANDLE handle = NULL;

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ALL_ACCESS, &handle)) printf("\nOpenProcessError");

if (!LookupPrivilegeValue(NULL,SE_TCB_NAME,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
printf("\nLookupPriv error");
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(handle, FALSE, &tp, 0, NULL, 0)) {
printf("\nAdjustToken error");
}

i = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &handle);
printf("\nLogonUser return  : %d",i);
i = GetLastError();
printf("\nLogonUser getlast : %d",i);
if (! ImpersonateLoggedOnUser(handle) ) printf("\nImpLoggedOnUser!");

i = CreateProcessAsUser(handle, "c:\\windows\\system32\\notepad.exe",NULL, NULL, NULL, true, 
CREATE_UNICODE_ENVIRONMENT |NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, 
&StartInfo, &ProcInfo);    
printf("\nCreateProcessAsUser return  : %d",i);
i = GetLastError();
printf("\nCreateProcessAsUser getlast : %d",i);

CloseHandle(handle); 
CloseHandle(ProcInfo.hProcess); 
CloseHandle(ProcInfo.hThread); 

Gracias de antemano!

¿Fue útil?

Solución

La cuenta local que ejecuta su aplicación debe tener estos privilegios activados en la política de seguridad local:

  • Actuar como parte del sistema operativo
  • Crear un objeto testigo
  • Iniciar sesión como un trabajo por lotes

Otros consejos

Después de buscar respuesta durante horas, finalmente me encontré en siguiente enlace de MSDN. Espero que pueda ayudar a alguien en el futuro.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c905c900-cae1-4081-b0c9-00f10238e7ad/createprocessasuser-failed?forum=clr

"Para resolver este problema, tendrá que elevar los derechos de la cuenta de llamadas CreateProcessAsUser con el " Reemplazar un testigo de proceso " derecha. Para ello, abra el Panel de control / Administrativo Herramientas / política de Seguridad local y agregar la cuenta de usuario a la "Sustituir un símbolo de nivel de proceso" correcto. (Puede que tenga que cerrar la sesión o incluso reiniciar para tener este cambio surta efecto.) "

Su código añade el privilegio SE_TCB_NAME a su ficha.

MSDN dice "Por lo general, el proceso que llama a la función CreateProcessAsUser debe tener los privilegios SE_ASSIGNPRIMARYTOKEN_NAME y SE_INCREASE_QUOTA_NAME."

he comprobado los enlaces, y funcionó bien. Marque esta

void main()
{

DWORD dwSessionId;
HANDLE hToken = NULL;

TOKEN_PRIVILEGES tp;
PROCESS_INFORMATION pi;
STARTUPINFOW si;

// Initialize structures.
ZeroMemory(&tp, sizeof(tp));
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);


LPTSTR lpszUsername = "user\0";
LPTSTR lpszDomain = ".";//"bgt\0";
LPTSTR lpszPassword = "password\0";

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
| TOKEN_ADJUST_PRIVILEGES , &hToken)) {

MyError();
}



// Look up the LUID for the TCB Name privilege.
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME, //SE_SHUTDOWN_NAME ,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
MyError();
}


tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) {

MyError();
}


if(LogonUser(lpszUsername,lpszDomain,lpszPassword,
LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) == 0)
{
MyError();
}
else
{
STARTUPINFO sInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&sInfo,0,sizeof(STARTUPINFO));
sInfo.cb = sizeof(STARTUPINFO);
sInfo.dwX = CW_USEDEFAULT;
sInfo.dwY = CW_USEDEFAULT;
sInfo.dwXSize = CW_USEDEFAULT;
sInfo.dwYSize = CW_USEDEFAULT;


bool bRet = CreateProcessAsUser(hToken,
"c:\\windows\\system32\\notepad.exe",
NULL,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&sInfo,
&ProcessInfo);

if(bRet == 0)
MyError();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top