![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выключить блок АТХ под Windows XP [D6, Win2k, WinXP]
@lexey © (2002-09-23 22:44:00)Вот так я пытаюсь перезагрузить или выключить компьютер в Windows XP. Работает на ура! НО! Не могу выключить блок ATX!!!
Кто знает прошу помощи. Заранее спасибо!
procedureShutdown(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;
biocron (2002-10-08 09:43:00) [1]ЕСть компонент AHM юзай его, там есть перезагрузка, работает под 2000 и 98, и скорее всего будет под XP
vidiv (2002-10-08 09:05:00) [2]А я видал где-то код на асме, там блок просто берет и выключается, как будто из розетки выдернули, если кто знает дайте...
Udjin (2002-10-02 16:43:00) [3]Можно и так
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;
han_malign (2002-10-02 10:11:00) [4]
;[ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon ]
;" PowerdownAfterShutdown "="1"
http://www.wintoun.fromru.com
Vladimir Gorkov (2002-10-02 08:14:00) [5]Вот полностью рабочий код под все ОС.
Другое дело если имеется ввиду именно NT 4.0 то там нужно менять hal.dll
#define chINITSTRUCT(structure, fInitSize) \
(ZeroMemory(&(structure), sizeof(structure)), \
fInitSize ? (*(int*) &(structure) = sizeof(structure)) : 0)
#define STRICT
//#include
#include
//---------------------------------------------------------------------------
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 );
}
Song (2002-09-27 08:38:00) [6]2@lexey © (26.09.02 23:10)
А я Вам говорю, что работает.
@lexey (2002-09-26 23:10:00) [7]NeyroSpace, а не подскажешь какая? И где найти ее заголовочный файл?
Заранее спасибо!
Song, помоему я получил все привелегии. И еще раз повторяю функция ExitWindowsEx() не станет работать в NT.
NeyroSpace (2002-09-25 17:35:00) [8]Есть API библ. для управлением питанием (винч, монитор, комп)
Song (2002-09-25 13:58:00) [9]Чтобы работал надо получить соответтсвующие привелегии. Подробности в FAQ.
@lexey (2002-09-24 23:59:00) [10]ExitWindowsEx работает только в Win32, а под NT или XP не работает, много раз пробовал.
Song (2002-09-24 09:04:00) [11]Чтобы выключить локальную машину надо использовать ExitWindowsEx()