El código debería funcionar independientemente de si se ejecuta en una consola o en GUI.
Esta es la forma de asignar privilegios al proceso actual:
Código:
BOOL EnablePrivilege (PCSTR name, BOOL Enable = TRUE)
{
BOOL Result;
HANDLE hToken;
TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};
if(!Enable) priv.Privileges[0].Attributes = 0;
LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
AdjustTokenPrivileges (hToken, FALSE, &priv, sizeof priv, 0, 0);
Result = (GetLastError() == ERROR_SUCCESS);
CloseHandle (hToken);
return Result;
}
El uso para matar procesos sería el siguiente:
Código:
EnablePrivilege("SeDebugPrivilege", TRUE); // Nos asignamos privilegios debug
TerminateProcessW(L"cmd.exe"); //Matamos la consola, por ejemplo
EnablePrivilege("SeDebugPrivilege", FALSE); // Nos quitamos el privilegio, si queremos...
Si ejecutas como administrador debería ser capaz de matar "casi" cualquier proceso.
Saludos.