problem z (przywilejem) privilege

0

Witam,
umieściłem co prawda pytanie w komentarzu, ale tam pewnie nie uzyskam odpowiedzi (albo nie za szybko:) ), więc wspomnę tutaj:
Temat poruszony w FAQ#355, wyłączanie systemu.
Średnio się na tym znam, więc proszę o pomoc.
Wygrzbałem z SDK, że trzeba zrobić
SE_PRIVILIGE_ENABLED dla SE_SHUTDOWN_NAME w AdjustTokenPiviliges ale niebardzo wiem jak zbudować składnię...
+
Win32Check(ExitWindowsEx(EWX_SHUTDOWN, 0));
w Win2000 powoduje błąd 1314 "klient nie ma wymaganego przywileju" czyli właśnie Shutdown_Name jak sądzę...

Proszę o niebicie :) Z góry dzięki za pomoc

0
function SetPrivilege: boolean;
var
   tpPrev, tp: TTokenPrivileges;
   hwnd: THandle;
   dwRetLen: DWord;
begin
   Result := False;
   OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hwnd);
   tp.PrivilegeCount := 1;
   if LookupPrivilegeValue(nil, pchar('SeShutdownPrivilege'), tp.Privileges[0].LUID) then
      begin
         tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
         dwRetLen := 0;
         Result := AdjustTokenPrivileges(hwnd, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen);
      end;
   CloseHandle(hwnd);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1