Errore CreateProcessAsUser 1314
-
16-09-2019 - |
Domanda
Voglio creare un processo con un altro utente. Quindi io uso LogonUser e CreateProcessAsUser. Ma il mio problema è che CreatePtocessAsUser restituisce sempre l'ErrorCode 1314, che significa "Un privilige richiesto non viene mantenuto dal client". Quindi la mia domanda è, che cosa sto facendo male? O come posso dare i privilegi alla maniglia? (Penso che la maniglia deve avere i privilegi, o mi sbaglio?) Ci dispiace per i miei errori in inglese, ma la mia conoscenza inglese non è la migliore :)
Plesase aiuto se qualcuno sa come risolvere la mia domanda.
Questa è una parte del mio codice.
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);
Grazie in anticipo!
Soluzione
L'account locale che esegue la vostra applicazione deve avere questi privilegi abilitati nella Criteri di protezione locali:
- Agire come parte del sistema operativo
- Crea un oggetto token
- Accesso come processo batch
Altri suggerimenti
Dopo aver cercato risposta per ore, ho finalmente trovato nel seguente link da MSDN. Spero che possa aiutare qualcuno in futuro.
"Per risolvere questo problema, è necessario elevare i diritti del conto chiamando CreateProcessAsUser con il " Sostituire un token di livello processo " a destra. Per fare ciò, aprire il Pannello di controllo / Amministrativo Strumenti / Criteri di protezione locali e aggiungere l'account utente al "Sostituzione di un token a livello di processo" giusto. (potrebbe essere necessario disconnettersi o addirittura riavviare per avere questo cambiamento abbia effetto.) "
Il tuo codice aggiunge il privilegio SE_TCB_NAME per il token.
MSDN dice: "In genere, il processo che chiama la funzione CreateProcessAsUser deve avere i privilegi SE_ASSIGNPRIMARYTOKEN_NAME e SE_INCREASE_QUOTA_NAME".
Ho controllato i collegamenti, e ha funzionato bene. Controllare questo
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();
}