Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.032 c
3-40915
inspirion
2003-10-20 09:21
2003.11.13
резервное копирование


3-40983
Vlad
2003-10-16 13:03
2003.11.13
подскажите с UDF


6-41778
FFF
2003-09-19 08:40
2003.11.13
Привет всем, подскажите пож-ста возможно ли подключить и принтер


6-41781
DSA
2003-09-11 16:44
2003.11.13
Генерация POST сообщений


3-40998
Denius
2003-10-15 18:25
2003.11.13
Кто работал с TDBF? Хелп, плиз, нарыть по нему доков...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский