Du hast ja leider nicht geschrieben, welche Programmiersprache, ich schicke dir einfach die Delphi-Variante.
Fkt in C genauso: ExWindowsEx und AdjustTokenPrivileges sind Standard-API-Befehle. Beachten musst Du, dass die Funktion in Win98 false zurückgibt, da es dort keine Privilegien gibt. Also den Rückgabewert nicht auswerten, sonst fährt das Prog in Win2000 runter und unter Win9x nicht.
function SetPrivilege(sPrivilegeName : string; bEnabled : boolean): boolean;
var TPPrev,
TP : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token);
TP.PrivilegeCount := 1;
if LookupPrivilegeValue(Nil, PChar( sPrivilegeName ),TP.Privileges[ 0 ].LUID ) then begin
if (bEnabled) then begin
TP.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
end else begin
TP.Privileges[ 0 ].Attributes :=0;
end;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token,False,TP,SizeOf( TPPrev ),TPPrev,dwRetLen );
end;
CloseHandle( Token );
end;
begin
SetPrivilege( 'SeShutdownPrivilege', True );
ExitWindowsEx(EWX_POWEROFF,0);
end.