Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2010, 20:31   #1
iukash
учу английский...
Форумчанин
 
Аватар для iukash
 
Регистрация: 04.04.2009
Сообщений: 480
По умолчанию Как программно выключить компьютер Windows

Операционки windows 2000 и xp. Делаю так используя Qt
Цитата:
QProcess::startDetached(tr("shutdow n -s -f -c \"Запланированная остановка\" -t 10 -m 192.168.0.85"));
Если задаю ip компьютера на котором запускаю то себя он выключает, а если компьютера из сети то не выключает (Причем сеть нормальная, данные передаются и принимаются другими прогами)! В чем может быть проблема? Или предложите другое решение проблемы на c++.
"Мы можем что-то изменить и своими силами..."
"Начнешь с себя, примером ближнему поможешь..."
iukash вне форума Ответить с цитированием
Старый 09.11.2010, 21:00   #2
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

// Для включения/перезагрузки компьютера вызовите
// функцию ExitWindowsEx

// выключить компьютер
ExitWindowsEx(EWX_SHUTDOWN, 0);
// перезагрузить компьютер
ExitWindowsEx(EWX_REBOOT, 0);
// завершить сеанс пользователя
ExitWindowsEx(EWX_LOGOFF, 0);
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 10.11.2010, 10:33   #3
iukash
учу английский...
Форумчанин
 
Аватар для iukash
 
Регистрация: 04.04.2009
Сообщений: 480
По умолчанию

А какой заголовочный файл надо добавить чтобы компилятор ее понял? И как работать с удаленной (в локальной сети) машиной?
"Мы можем что-то изменить и своими силами..."
"Начнешь с себя, примером ближнему поможешь..."
iukash вне форума Ответить с цитированием
Старый 10.11.2010, 10:42   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

<windows.h>
Это winapi функция, и на сколько я помню, она не позволяет выключать удаленный компьютер.
Для начала попробуйте выключить сетевой компьютер из командной строки (команда shutdown), чтобы точно знать в чем проблема. Если получится - проблема в вашей программе, если нет - то есть много вариантов, конфигурация сети, недостаток прав, и т.п.
Если из командной строки удастся выключить, как вариант (но не самый лучший) можно использовать функцию
Код:
system("shutdown [параметры]");
Но это будет не кроссплатформенный вариант
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 10.11.2010, 11:26   #5
iukash
учу английский...
Форумчанин
 
Аватар для iukash
 
Регистрация: 04.04.2009
Сообщений: 480
По умолчанию

Да, действительно нет прав. А как их настроить?
"Мы можем что-то изменить и своими силами..."
"Начнешь с себя, примером ближнему поможешь..."
iukash вне форума Ответить с цитированием
Старый 10.11.2010, 17:33   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от iukash Посмотреть сообщение
Да, действительно нет прав. А как их настроить?
Код:
bool SetProcessPrivileges(wchar_t *privileges)
{
	HANDLE processToken;
	TOKEN_PRIVILEGES tp;

	if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&processToken))
		return false;
	
	if(!LookupPrivilegeValue(NULL,privileges,&tp.Privileges[0].Luid))
		return false;

	tp.PrivilegeCount=1;
	tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

	AdjustTokenPrivileges(processToken,false,&tp,0,0,0);
	if(GetLastError()!=ERROR_SUCCESS)
		return false;

	return true;
}
Код:
SetProcessPrivileges(SE_SHUTDOWN_NAME);
counter вне форума Ответить с цитированием
Старый 11.11.2010, 11:44   #7
iukash
учу английский...
Форумчанин
 
Аватар для iukash
 
Регистрация: 04.04.2009
Сообщений: 480
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
Код:
bool SetProcessPrivileges(wchar_t *privileges)
{
	HANDLE processToken;
	TOKEN_PRIVILEGES tp;

	if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&processToken))
		return false;
	
	if(!LookupPrivilegeValue(NULL,privileges,&tp.Privileges[0].Luid))
		return false;

	tp.PrivilegeCount=1;
	tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

	AdjustTokenPrivileges(processToken,false,&tp,0,0,0);
	if(GetLastError()!=ERROR_SUCCESS)
		return false;

	return true;
}
Код:
SetProcessPrivileges(SE_SHUTDOWN_NAME);
Вылезли следующие предупреждения
Цитата:
mainwindow.cpp: In constructor 'MainWindow::MainWindow(QWidget*)':

mainwindow.cpp:15: warning: deprecated conversion from string constant to 'wchar_t*'
И видимо поэтому не заработало
Хотя функция выполняется и выходит из выполнение return true
Отписался в разделе операционные системы по поводу как я пытаюсь сменить права и что при этом получается вот в этой теме
"Мы можем что-то изменить и своими силами..."
"Начнешь с себя, примером ближнему поможешь..."

Последний раз редактировалось iukash; 11.11.2010 в 11:53.
iukash вне форума Ответить с цитированием
Старый 11.11.2010, 20:14   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

читни-ка

http://www.sysman.ru/index.php?showtopic=3863
http://www.rtfm.4hack.com/articles.php?id1=7&id2=1
http://www.imho.ws/showthread.php?t=92241
http://sysadmins.ru/topic7821.html
counter вне форума Ответить с цитированием
Старый 23.11.2011, 06:42   #9
ProgMaster
Новичок
Джуниор
 
Аватар для ProgMaster
 
Регистрация: 13.11.2011
Сообщений: 82
Сообщение

Надо сперва получить SeShutdownPrivelage потом EWX_REBOOT
Код:
function MyExitWindows(Flags: UINT): boolean;
var
 TokenPriv: TTokenPrivileges;
 TokenHandle: THandle;
begin

 Result:=false;
 if (Win32Platform = VER_PLATFORM_WIN32_NT) and
 ((Flags and (EWX_POWEROFF or EWX_REBOOT or EWX_SHUTDOWN)) <> 0) then
 begin
 if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,
 TokenHandle) then
 if LookupPrivilegeValue(nil,'SeShutdownPrivilege',
 TokenPriv.Privileges[0].LUID) then
 begin
 TokenPriv.PrivilegeCount:=1;
 TokenPriv.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
 if not AdjustTokenPrivileges(TokenHandle,false,TokenPriv,0,
 TTokenPrivileges(nil^),DWORD(nil^)) then exit;
 end;
 end;
 Result:=ExitWindowsEx(Flags,0);
end;
ProgMaster вне форума Ответить с цитированием
Старый 23.11.2011, 09:07   #10
ProgMaster
Новичок
Джуниор
 
Аватар для ProgMaster
 
Регистрация: 13.11.2011
Сообщений: 82
Сообщение

Или
Код:
WinExec('shutdown -s -t 0');
WinExec('shutdown -r -t 0');
Первая строка для того чтобы выключить, вторая для перезагрузки.
Если надо это сделать на удаленном компе то делайте клиент сервер.
ProgMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выключить удаленный компьютер _SERGEYX_ Работа с сетью в Delphi 1 23.12.2008 10:09
Можно ли мгновенно выключить компьютер? The_Darkness Win Api 59 17.07.2008 00:15
как выключить/перезагрузить компьютер motaro Паскаль, Turbo Pascal, PascalABC.NET 1 28.03.2008 02:01
Как выключить удалённый компьютер c помощью Server Socket. muravey Работа с сетью в Delphi 3 09.11.2007 08:09