Форум: "Система";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
ВнизВыключение компьютера Найти похожие ветки
← →
Потерянный (2001-12-03 11:24) [0]Делаю так
ExitWindowsEx( EWX_FORCE ,1);
ExitWindowsEx( EWX_SHUTDOWN ,1);
Под Win9x всё нормально, а под NT просто выходит из Windows
Ну и как его выключить?
← →
Dimka Maslov (2001-12-03 13:27) [1]
function ExitWindows(uFlags: UINT): BOOL;
var
ProcessHandle: THandle;
TokenHandle: THandle;
Luid: Int64;
Tkp: TTokenPrivileges;
BufferNeeded: DWORD;
begin
if Win32Platform=VER_PLATFORM_WIN32_NT then begin
ProcessHandle:=GetCurrentProcess;
OpenProcessToken(ProcessHandle, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
LookupPrivilegeValue(nil, "SeShutdownPrivilege", Luid);
Tkp.PrivilegeCount:=1;
Tkp.Privileges[0].Luid:=Luid;
Tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(TokenHandle, FALSE, Tkp, 0, nil, BufferNeeded);
end;
Result:=ExitWindowsEx(uFlags, $FFFF);
end;
← →
Потерянный (2001-12-04 09:06) [2]Спасибо.
А если под Win2000?
Пробовал не выключает компьютер ни с EWX_SHUTDAWN ни с EWX_POWEROFF
← →
Searcher (2001-12-04 22:16) [3]2Потеряный
Код, который точно работает под Win2000. (Похоже он не сильно отличается от кода Dimka Maslov, но попробуй..)
procedure shutdown;
var
hToken:THandle;
tkp,PrevState:_TOKEN_PRIVILEGES;
k:DWORD;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil, "SeShutdownPrivilege", tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(PrevState), PrevState, k);
ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0);
end;
← →
Zyv (2001-12-06 13:51) [4]Маленькое добавление к коду Searcher.
В функцию ExitWindowsEx под NT/2000 лучше не вставлять флаг EWX_FORCE, т.к. такое завершение оборвет все процессы на полуслове. Можно закрыть все корректно: ExitWindowsEx(EWX_SHUTDOWN Or EWX_POWEROFF, 0).
А вот под 9X, если не вставить EWX_FORCE, то получим на экран модальное окно с сообщением, что к компьютеру подключены пользователи и т.д., после чего "программное выключение компьютера" превращается в ручное.
Исходя из изложенного, я делаю так:
function SetPrivilege(PrivilegeName: string; Enable: boolean): Boolean;
var tpPrev, Tp : TTokenPrivileges;
Token : THandle;
dwRetLen : DWord;
begin
Result := False;
If Not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, Token) Then Exit;
Tp.PrivilegeCount := 1;
If LookupPrivilegeValue(Nil, PChar(privilegeName), Tp.Privileges[0].LUID) Then
Begin
If Enable Then Tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
Else Tp.Privileges[0].Attributes := 0;
dwRetLen := 0;
Result := AdjustTokenPrivileges(Token, False, Tp, SizeOf(tpPrev), tpPrev, dwRetLen);
End;
CloseHandle(Token);
end;
// вызывающая процедура
begin
...
If Win32Platform = VER_PLATFORM_WIN32_WINDOWS Then
Begin
ExitWindowsEx(EWX_FORCE Or EWX_SHUTDOWN Or EWX_POWEROFF, 0);
End;
If Win32Platform = VER_PLATFORM_WIN32_NT Then
Begin
SetPrivilege("SeShutdownPrivilege", True);
ExitWindowsEx(EWX_SHUTDOWN Or EWX_POWEROFF, 0);
End;
...
end;
← →
Zyv (2001-12-06 13:59) [5]Кстати, сам хочу спросить мастеров: вышеприведенный пример работает прекрасно на 9X/Me/2000, но как можно снять питание под NT???
Без флага EWX_POWEROFF выключение заканчивается на сообщении: "Теперь можно выключить питание компьютера", а с этим флагом питание вроде бы снимается, все гаснет, но через секунду - перезагрузка.
Вообще, можно ли научить NT понимать ATX-ное питание?
← →
Wizard_Ex (2001-12-06 19:39) [6]Есть какая то заплатка, вроде
А так NT ATX не знает что ето, она уже седая(но рульная до сих)
← →
Потерянный (2001-12-11 09:50) [7]Мои благодарности всем откликнувшимся.
(Под ХР тоже работает)
← →
Zyv (2001-12-11 11:09) [8]И под NT тоже. Заплатку, о которой говорил Wizard_Ex, я совершенно неожиданно нашел в ServicePack 4 и выше. Если SP распаковать, то там найдется файл hal.dll.softex. Его нужно положить вместо штатного hal.dll в NT и прописать ключ реестра
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"PowerdownAfterShutdown"="1"
После этого "рульная до сих" NT тоже выключается.
Удачи всем.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c