|
[ На главную ] -- [ Список участников ] -- [ Зарегистрироваться ] |
On-line: |
Программирование на CAVO / / Програмно выключить комп |
Страницы: 1 |
Автор | Сообщение |
rufix Группа: Участники Сообщений: 26 |
Добавлено: 11-01-2010 10:29 |
Есть в API функция для выключения компа InitiateSystemShutdown(String2Psz("My_PC"),String2Psz(""),1, True, True) Но при условии, что процесс имеет привилегию SE_SHUTDOWN_NAME. Цитирую из хелпа: To shut down the local computer, the calling process must have the SE_SHUTDOWN_NAME privilege. Не могу понять как это сделать. Или может быть есть другие способы решения этой проблемы. |
|
rufix Группа: Участники Сообщений: 26 |
Добавлено: 19-01-2010 05:56 |
В инете нашел следующее решение. Для меня, то что надо. Может кому-то еще пригодится. FUNCTION FabExitWindows( dwMode AS DWORD ) AS LOGIC // dwMode is like EWX_SHUTDOWN, EWX_REBOOT and so on LOCAL lRet AS LOGIC LOCAL ptrVI IS _winOSVERSIONINFO LOCAL hToken AS PTR LOCAL ptrTP IS _winTOKEN_PRIVILEGES // ptrVI.dwOSVersionInfoSize := _SIZEOF( _winOSVERSIONINFO ) GetVersionEx( @ptrVI ) IF ( ptrVI.dwPlatformId == VER_PLATFORM_WIN32_NT ) // With NT, we MUST set the Application privilege // open access privilege list. IF OpenProcessToken( GetCurrentProcess(), _OR( TOKEN_ADJUST_PRIVILEGES, TOKEN_QUERY ), @hToken ) ptrTP.PrivilegeCount := 1 // Ask the "shutdown" LUID LookupPrivilegeValue( NULL_PSZ, String2Psz( SE_SHUTDOWN_NAME ), @ptrTP.Privileges[1].Luid ) // Enable it ptrTP.Privileges[1].Attributes := SE_PRIVILEGE_ENABLED AdjustTokenPrivileges( hToken, FALSE, @ptrTP, 0, NULL_PTR, NULL_PTR ) lRet := ( GetLastError () == ERROR_SUCCESS ) ENDIF ELSE lRet := TRUE ENDIF // IF lRet lRet := ExitWindowsEx( dwmode, 0 ) ENDIF // RETURN lRet |
Страницы: 1 |
Программирование на CAVO / / Програмно выключить комп |