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

Вниз

Как выключить блок АТХ под Windows XP   Найти похожие ветки 

 
@lexey ©   (2002-09-23 22:44) [0]

Вот так я пытаюсь перезагрузить или выключить компьютер в Windows XP. Работает на ура! НО! Не могу выключить блок ATX!!!
Кто знает прошу помощи. Заранее спасибо!

procedure Shutdown(Name:String; // Имя машины (\\SERVER)
msg:String; // Сообщение
Delay:Integer; // Задержка перед рестартом
CloseAll,
Restart:Boolean);
var
ph:THandle;
tp,prevst:TTokenPrivileges;
results:Cardinal;
begin
OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph);
LookupPrivilegeValue(nil,"SeShutdownPrivilege",tp.Privileges[0].Luid);
tp.PrivilegeCount:=1;
tp.Privileges[0].Attributes:=2;
AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,results);
InitiateSystemShutdown(PChar(name),PChar(msg),Delay,CloseAll,Restart);
end;


 
Song ©   (2002-09-24 09:04) [1]

Чтобы выключить локальную машину надо использовать ExitWindowsEx()


 
@lexey ©   (2002-09-24 23:59) [2]

ExitWindowsEx работает только в Win32, а под NT или XP не работает, много раз пробовал.


 
Song ©   (2002-09-25 13:58) [3]

Чтобы работал надо получить соответтсвующие привелегии. Подробности в FAQ.


 
NeyroSpace ©   (2002-09-25 17:35) [4]

Есть API библ. для управлением питанием (винч, монитор, комп)


 
@lexey ©   (2002-09-26 23:10) [5]

NeyroSpace, а не подскажешь какая? И где найти ее заголовочный файл?
Заранее спасибо!
Song, помоему я получил все привелегии. И еще раз повторяю функция ExitWindowsEx() не станет работать в NT.


 
Song ©   (2002-09-27 08:38) [6]

2@lexey © (26.09.02 23:10)
А я Вам говорю, что работает.


 
Vladimir Gorkov   (2002-10-02 08:14) [7]

Вот полностью рабочий код под все ОС.
Другое дело если имеется ввиду именно NT 4.0 то там нужно менять hal.dll



#define chINITSTRUCT(structure, fInitSize) \
(ZeroMemory(&(structure), sizeof(structure)), \
fInitSize ? (*(int*) &(structure) = sizeof(structure)) : 0)

#define STRICT

//#include <vcl\Condefs.h>
#include <windows.h>
//---------------------------------------------------------------------------
void ShowLastError();

int WINAPI WinMain (HINSTANCE , HINSTANCE , PSTR , int )
{
bool result;
LUID Luid; // address of locally unique identifier
HANDLE hToken;

HANDLE hProcess = GetCurrentProcess();

// Нужно сперва определить операционную систему.
// Если это NT то необходимо будет этому процессу получить привилегии
// для завершения работы системы. А если это клон 95 то можно сразу
// вызывать функцию завершения.
OSVERSIONINFO VerInfo; \
chINITSTRUCT(VerInfo, TRUE); \
GetVersionEx(&VerInfo); \
// Если это NT то получить права доступа
if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{

result = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
if (!result)
{
ShowLastError();
return 0;
}

result = LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Luid);
if (!result)
{
ShowLastError();
return 0;
}

LUID_AND_ATTRIBUTES Privileges[1];

Privileges[0].Luid = Luid;
Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0] = Privileges[0];

result = AdjustTokenPrivileges(

hToken, // handle to token that contains privileges
false, // flag for disabling all privileges
&tp, // pointer to new privilege information
NULL, // size, in bytes, of the PreviousState buffer
NULL, // receives original state of changed privileges
NULL // receives required size of the PreviousState buffer
);

if (!result)
{
ShowLastError();
return 0;
}
} // if (VerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)

result = ExitWindowsEx (EWX_POWEROFF, NULL);

if (!result)
{
ShowLastError();
} // if (!result)

return 0;
}

//--------------------------------------------------------------------
void ShowLastError()
{
LPVOID lpMsgBuf;

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );

// Display the string.
MessageBox( NULL, (LPTSTR)lpMsgBuf, "Error", MB_OK|MB_ICONINFORMATION );

// Free the buffer.
LocalFree( lpMsgBuf );

}



 
han_malign   (2002-10-02 10:11) [8]

;[ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon ]

;" PowerdownAfterShutdown "="1"

http://www.wintoun.fromru.com


 
Udjin ©   (2002-10-02 16:43) [9]

Можно и так

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;


 
vidiv   (2002-10-08 09:05) [10]

А я видал где-то код на асме, там блок просто берет и выключается, как будто из розетки выдернули, если кто знает дайте...


 
biocron ©   (2002-10-08 09:43) [11]

ЕСть компонент AHM юзай его, там есть перезагрузка, работает под 2000 и 98, и скорее всего будет под XP



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
14-59383
Феликс
2002-10-22 21:10
2002.11.18
Вот бы пример.


4-59494
nona
2002-10-07 21:58
2002.11.18
Помогите мне плиз!


1-59243
pheonix_ash
2002-11-06 22:30
2002.11.18
Как скомпилировать проект так чтобы exe потом *.bpl не просил


1-59200
Lexey
2002-11-06 11:36
2002.11.18
Какие продукты Borland являются бесплатными???


3-59017
ACampball
2002-10-28 15:32
2002.11.18
Восстановление подключения к IB в BDE