Как же выключить компьютер в Windows XP ?
Я долго искал способ выключить компьютер в Windows XP:
Например: функция ExitWindows() вообще сдохла, а ExitWindowsEx() делает только LOGOFF.
И однажды нашёл на одном форуме:
Dim strComputer As String
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate, _
(Shutdown)}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery( _
"Select * from Win32_OperatingSystem")
For Each ObjOperatingSystem In colOperatingSystems
ObjOperatingSystem.Reboot ' Для перезагрузки
Next
и:
Dim strComputer As String
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate,(Shutdown)}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery( _
"Select * from Win32_OperatingSystem")
For Each ObjOperatingSystem In colOperatingSystems
ObjOperatingSystem.ShutDown 'Для выключения
Next
Примечание: Данный код работает и для VBScript:
P.S. Пробуйте, у меня работает безотказно.
Оставить комментарий
Оставлять комментарии могут только зарегистрированные пользователи.
Если вы не являетесь зарегистрированным пользователем, то вам необходимо зарегистрироваться. Регистрация бесплатна. Если вы уже зарегистрированы на CodeNet, то вам необходимо ввести логин и пароль в верхней (Alt-U) части страницы.
Комментарии
1. Agent Fire / 15 января 2006, 01:13:44

Отправь мне пожалуйта этот кодик с NtShutDown, попробую разобраться:

NoviksPlavnik@mail.ru
2. Мих мих / 05 декабря 2005, 20:54:11

Это же просто как два пальца обос...

Сначала получаем привелегию SeShutdownPrivilege функцией AdjustTokenPrivileges.
Затем на выбор:
"Нормально" выкл. комп - ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0);
Метод покруче - NtShutdownSystem(0); (Функция находится в ntdll.dll; вырубает комп без вопросов и примерно за 0,2 сек)
Можно еще отправить комп в спящий режим - NtInitiatePowerAction(3,2,3,0); (Но это уже не в ту степь; функция находится тоже в ntdll.dll)
Учите Native API, Товарищи, это офигенно мощная штука!
3. atDaemon / 01 октября 2004, 16:43:31+0 / -1

Я тоже столкнулся как-то раз с этой проблемой. ExitWindowsEx работает безотказно... Вот только поскольку WindowsXP построена на ядре NT для выключения компьютера необходимо иметь соответствующие привилигии. Т.е. перед использованием ExitWindowsEx необходимо получить эти привелегии. На C++ делается так:+0 / -1


OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
BOOL isNT=(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT);
if(isNT)
{
DWORD err;
HANDLE cp=NULL;
cp=OpenProcess(PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId());
if(cp==INVALID_HANDLE_VALUE)
{
err=GetLastError();
return FALSE;
}
HANDLE ot=NULL;
OpenProcessToken(cp,TOKEN_ADJUST_PRIVILEGES,&ot);
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
if(!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&(tp.Privileges[0].Luid)))
{
err=GetLastError();
return FALSE;
}
if(!AdjustTokenPrivileges(ot,FALSE,&tp,NULL,NULL,NULL))
{
err=GetLastError();
return FALSE;
}
}
Сначала делается проверка если выполнение происходит под WindowsNT (В том числе и 2к ХР и пр... %). Далее если Windows - NT то осуществляется открытие процесса и изменение привелегий... Подробнее об изменениях привелегий - MSDN DLL's processes and threads...
