Hola de nuevo, con esto me corrijo a mi mismo. Lo de arriba solo funciona en win95/98.A ver si te sirve asi. Siguiendo las instrucciones de la página de Microsoft que habia puesto arriba, lo he hecho así en Windows 2000 y funciona, supongo que funcionará en Windows NT también, ya me contaras:
HANDLE ProcessHandle, TokenHandle;
LUID tmpLuid;
TOKEN_PRIVILEGES tkp, tkpNew;
DWORD dwBufferNeeded;
ProcessHandle = GetCurrentProcess();
OpenProcessToken(ProcessHandle,
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&TokenHandle);
LookupPrivilegeValue(NULL, "SeShutdownPrivilege", &tmpLuid);
tkp.PrivilegeCount = 1;
tkp.Privileges->Luid = tmpLuid;
tkp.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle,
false,
&tkp,
sizeof(tkpNew),
&tkpNew,
&dwBufferNeeded);
// Una conseguido el "permiso" ya podemos
// usar de forma normal esta función
ExitWindowsEx(EWX_POWEROFF, 0xFFFFFFFF);
###