Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как же выключить компьютер в 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. Пробуйте, у меня работает безотказно.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
15 января 2006, 01:13:44
Отправь мне пожалуйта этот кодик с NtShutDown, попробую разобраться:
NoviksPlavnik@mail.ru
2.
Аноним
+1 / -0
Мне нравитсяМне не нравится
5 декабря 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.
Аноним
+0 / -2
Мне нравитсяМне не нравится
1 октября 2004, 16:43:31
Я тоже столкнулся как-то раз с этой проблемой. ExitWindowsEx работает безотказно... Вот только поскольку WindowsXP построена на ядре NT для выключения компьютера необходимо иметь соответствующие привилигии. Т.е. перед использованием ExitWindowsEx необходимо получить эти привелегии. На C++ делается так:

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...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог