Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
ВнизShut down the computer (2k, XP) Найти похожие ветки
← →
KADAN (2003-10-07 21:29) [0]Думаю, из названия темы ясно, что мне нужно. Никак не могу разобраться с функцией AdjustTokenPrivilegies, или как она там звучит... в общем помогите мне выключить комп из w2k и XP.
← →
Ihor Osov'yak (2003-10-08 01:15) [1]
function SetPrivilege(Privilege: PChar;
EnablePrivilege: Boolean;
out PreviousState: Boolean): DWORD;
var
Token: THandle;
NewState: TTokenPrivileges;
Luid: TLargeInteger;
PrevState: TTokenPrivileges;
Return: DWORD;
begin
PreviousState := True;
if ((GetVersion() and $80000000) <> 0) then
begin
// Win9x
Result := ERROR_SUCCESS;
exit;
end;
// NT4, W2K, XP
if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then
begin
Result := GetLastError();
exit;
end;
try
if not LookupPrivilegeValue(nil, Privilege, Luid) then
begin
Result := GetLastError();
exit;
end;
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := Luid;
if EnablePrivilege then
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
NewState.Privileges[0].Attributes := 0;
if not AdjustTokenPrivileges(Token, False, NewState,
SizeOf(TTokenPrivileges), PrevState, Return) then
Result := GetLastError()
else
begin
Result := ERROR_SUCCESS;
PreviousState :=
(PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0);
end;
finally
CloseHandle(Token);
end;
end;
procedure doShutdownNT;
var
oldFl: boolean;
begin
SetPrivilege("SeShutdownPrivilege", true, oldFl);
ExitWindowsEx(EWX_REBOOT, 0);
SetPrivilege("SeShutdownPrivilege", oldFl, oldFl);
end;
← →
Ihor Osov'yak (2003-10-08 01:17) [2]сорри
EWX_REBOOT -> EWX_SHUTDOWN :-)
← →
NAlexey (2003-10-08 08:54) [3]>Ihor Osov"yak ©
А вот интересно, если запустить это с например гостевой учетной записи, сработает?
← →
Игорь Шевченко (2003-10-08 10:14) [4]NAlexey © (08.10.03 08:54)
Не сработает, если только кто-то сдуру не назначил гостевой записи привилегию SE_SHUTDOWN_NAME. А если назначил - гнать таких в три шеи.
← →
doomin (2003-10-08 10:55) [5]http://www.dragonsoft.spb.ru/file_rep/delphi/winexit.zip
компонента, в ней все работает на всех ОС. Если надо для гостя, то нужно использовать runas для того чтобы запускать процесс от имени пользователя, имеющего права
← →
FireHack (2003-10-08 12:03) [6]А вот еще вдогонку для любой оси:
function isWin9x:Bool; {True=Win9x}{False=NT}
asm
xor eax, eax
mov ecx, cs
xor cl, cl
jecxz @@quit
inc eax
@@quit:
end;
procedure ExitWindows(Flags:Cardinal);
var
Handle,Ph: THandle;
pid : DWORD;
luid : TLargeInteger;
priv : TOKEN_PRIVILEGES;
privres : TOKEN_PRIVILEGES;
begin
if not IsWin9x then
begin
pid:=GetCurrentProcessId;
ph := OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if OpenProcessToken(ph,TOKEN_ADJUST_PRIVILEGES,handle) then
if LookupPrivilegeValue(nil,"SeShutdownPrivilege",luid) then
begin
priv.PrivilegeCount:=1;
priv.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
priv.Privileges[0].Luid:=luid;
AdjustTokenPrivileges(handle,false,priv,0,nil,pid);
end;
end;
ExitWindowsEx(Flags ,0);
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c