ďťż

Ładny brzuch

Interesuje mnie jakim poleceniem zrestartowac komputer w delphi3.
Znalazłam polecenie :"Win32Check(ExitWindowsEx(EWX_REBOOT, 0));" ale jak uruchamiam program to wyskakuje błąd: klient nie ma wymaganych uprawnień

Justyna



http://www. ks-eksper...sp?T...=restart,delphi
http://www.ks-eksper...sp?T...=restart,delphi

Ps. przycisk szukaj się kłania to tak na przyszłość;)

Asdef

Ty Asdef nie bądź taki mądry. Po to są forum żeby przycisku Szukaj nie używać

Peace on earth, war on net...

Użyłam procedury:
procedure TForm1.Button1Click(Sender: TObject);
var h_Token : THandle;
tp : TTokenPrivileges;
pvs : PTokenPrivileges;
retval: Cardinal;
begin
if not OpenProcessToken( GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, h_Token) then exit;
if not LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid) then exit;
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
pvs := nil;
if not AdjustTokenPrivileges(h_Token, false, tp, 0, pvs, retval) then exit;
ExitWindowsEx(EWX_REBOOT,0);
end;

ale delphi czepia sie linijki: if not AdjustTokenPrivileges(h_Token, false, tp, 0, pvs, retval) then exit; - a konkretnie zmiennej pvs -
wyskakuje błąd :Types of actual and formal var parameters must be identical.
Próbowałam pozmieniać typy ale to nic nie dało.
Pozakomentowaniu tej linijki nie działa, a procedury Win32Check(ExitWindowsEx(EWX_REBOOT, 0)) tez nie dzialaja

Justyna



Przywileje użytkownika? Rozumiem, że to rodzina NT. No więc użyj funkcji:

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);
Win32Check(ExitWindowsEx(EWX_REBOOT, 0));
end;

U mnie działa, mam win2000 sp4, a jeśli chcesz restartować na win 9x, to najlepiej najpierw wykryj system, na jakim działa program:

procedure wylaczaj;
var
OS:TOsVersionInfo;
begin
OS.dwOSVersionInfoSize:=SizeOf(os);
GetVersionEx(os);
case os.dwMinorVersion of
10: {win98}Win32Check(ExitWindowsEx(EWX_REBOOT, 0));
90: {winME}Win32Check(ExitWindowsEx(EWX_REBOOT, 0));
0: {win2000}SetPrivilege;//wywołanie funkcji, którą podałem wcześniej
1: {winXP}WinExec('shutdown.exe -r -f -t 0', SW_HIDE);
end;
end;

(formatowanie kodu automatycznie jest usuwane przy dodawaniu posta, więc tyle będzie do zrobienia :) )

No i to na tyle :)

____________o^o____________ (to mój rower :) )

Wyjdź. Oni i tak cię znajdą.

dzięki wreszcie mi to działa:D

Justyna

cytat:kredzik napisał:

Ty Asdef nie bądź taki mądry. Po to są forum żeby przycisku Szukaj nie używać

Nie no... teraz mnie zatkało...
POGIĘŁO CIĘ??? (//nie wycinajcie tego, proszę. :>)
PO TO JEST PRZYCISK SZUKAJ, ŻEBY NA FORUM NIE POWTARZAŁY SIĘ CIŚGLE TE SAME TEMATY!!! Skoro na forum już raz udzielono odpowiedzi na dane pytanie, po jaką cholerę (//tego też nie wycinajcie, proszę ;) )zadawać je ponownie?!!! Rozumiem że ktoś nie obyty w korzystaniu z forów może napisać mimo wszystko nowy temat, ale żeby najeżdzać na osobę która uprzejmie informuje go o pomyłce??!! Człowieku, daj sobie siana, ok?
I zalecam Ci lekturę podstawowych zasad netetykiety, jeśli chodzi o szukanie informacji na forach, znajdziesz tam zapis o korzystaniu z archiwów i nieponawianiu pytań na które już raz udzielono odpowiedzi. Amen.

PS - tak, wiem - netetykieta mówi też o nieobrażaniu współforumowiczów i nienadużywaniu Capsa, ale nie mogłem się powstrzymać ^_^'

"Człowieka można zniszczyć ale nie pokonać"
Ducha nie można ani zniszczyć ani pokonać.
Ducha X - nawet nie pytaj.
;)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •