Как же выключить компьютер в 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. Пробуйте, у меня работает безотказно.
Оставить комментарий
Комментарии
1.
15 января 2006, 01:13:44
Отправь мне пожалуйта этот кодик с NtShutDown, попробую разобраться:
NoviksPlavnik@mail.ru
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, Товарищи, это офигенно мощная штука!
Сначала получаем привелегию 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...
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...