Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.13;
Скачать: CL | DM;

Вниз

Shutdown XP   Найти похожие ветки 

 
M@D   (2003-09-01 22:53) [0]

Проблема такая, мне нужно выключить компьютер на котором установлен ХР, я достал вот этот код...

function TForm1.SetPrivilege(privilegeName: string; enable: 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(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;

function TForm1.WinExit(flags: integer): boolean;
begin
SetPrivilege("SeShutdownPrivilege", true);
ExitWindowsEx(flags, 0);
SetPrivilege("SeShutdownPrivilege", False);
result := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WinExit(ewx_shutdown);
end;


После нажатия на кнопку, из ОС выходит но компьютер до конца не выключается. Появляется надпись "Тепер питание компьютера можно выключить". А мне это вовсе не нужно! HELP! Заранее благодарен!


 
Anatoly Podgoretsky ©   (2003-09-01 23:11) [1]

Shutdown(EWX_SHUTDOWN or EWX_POWEROFF);

Подробности смотри здесь
http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N162


 
lipskiy ©   (2003-09-01 23:16) [2]

if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, "SeShutdownPrivilege", tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1; // one privelege to set
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;


 
lipskiy ©   (2003-09-01 23:17) [3]

Описательную часть забыл:
var
hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;


 
VID ©   (2003-09-02 09:47) [4]

Взято из UBPFD:

function GetWinVersion: String;
var VersionInfo : TOSVersionInfo;
OSName : String;
begin
VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
if Windows.GetVersionEx( VersionInfo ) then
begin
with VersionInfo do
begin
case dwPlatformId of
VER_PLATFORM_WIN32s : OSName := "Win32s";
VER_PLATFORM_WIN32_WINDOWS : OSName := "Windows 95";
VER_PLATFORM_WIN32_NT : OSName := "Windows NT";
end;
Result := OSName + " Version " + IntToStr( dwMajorVersion ) + "." + IntToStr( dwMinorVersion ) +
#13#10" (Build " + IntToStr( dwBuildNumber ) + ": " + szCSDVersion + ")";
end;
end
else Result := "";
end;

Procedure ShutDownWindows;
//Завершение работы Windows {Эту функцию лучше вызывать по таймеру через каждую секунду}
const SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
var hToken : THandle;
tkp : TTokenPrivileges;
tkpo : TTokenPrivileges;
zero : DWORD;
begin
if Pos( "Windows NT", GetWinVersion) = 1 then
begin
zero := 0;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, "Exit Error", "OpenProcessToken() Failed", MB_OK );
Exit;
end;
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
MessageBox( 0, "Exit Error", "OpenProcessToken() Failed", MB_OK );
Exit;
end;
if not LookupPrivilegeValue( nil, "SeShutdownPrivilege" , tkp.Privileges[ 0 ].Luid ) then
begin
MessageBox( 0, "Exit Error", "LookupPrivilegeValue() Failed", MB_OK );
Exit;
end;
tkp.PrivilegeCount := 1;
tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
if Boolean( GetLastError() ) then
begin
MessageBox( 0, "Exit Error", "AdjustTokenPrivileges() Failed", MB_OK );
Exit;
end
else ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end
else
begin
ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
end;
end;


 
stone ©   (2003-09-02 09:58) [5]


> из ОС выходит но компьютер до конца не выключается. Появляется
> надпись "Тепер питание компьютера можно выключить".


Это уже аппартная проблема (например, питание АТ, а не АТХ) либо может быть отключена функция ACPI в BIOS.


 
AndreySoft ©   (2003-09-02 09:58) [6]

>>AllА мне кажется прблема не в коде! Скорее всего проблема в том, что у него системный блок серии AT.
Код работает правильно, но выключить доконца комп не может.

>>M@D
Попробую стандартное завершение работы: Пуск->Завершение работы->Выключить компьютер
Если же в таком случае у тебя компьютер не выключится доконца, ну в смысле так и будет гореть надпись: "Теперь питание компьютера можно отключить", то никакой код тебе не поможет.


 
KSergey ©   (2003-09-02 10:11) [7]

[6] AndreySoft © (02.09.03 09:58)

Да он флаги пока не все поставил. Вот когда сделает как советует Подгорецкий и не сработает - можно будет делать такие выводы. А пока рано.



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
1-41515
Артем
2003-10-25 22:22
2003.11.13
ShellExecute


1-41632
Matrex
2003-10-25 21:29
2003.11.13
RichEdit


1-41347
Mistic
2003-10-29 22:10
2003.11.13
системное меню


3-41021
Vadim S
2003-10-15 17:58
2003.11.13
Ошибка при выполнении запроса MS SQL


3-41062
Карелин Артем
2003-10-23 17:14
2003.11.13
Как снять