Если задаю ip компьютера на котором запускаю то себя он выключает, а если компьютера из сети то не выключает (Причем сеть нормальная, данные передаются и принимаются другими прогами)! В чем может быть проблема? Или предложите другое решение проблемы на c++.
«Мы можем что-то изменить и своими силами. »
«Начнешь с себя, примером ближнему поможешь. »
Форумчанин
Регистрация: 28.01.2010
Сообщений: 224
// Для включения/перезагрузки компьютера вызовите
// функцию ExitWindowsEx
// выключить компьютер
ExitWindowsEx(EWX_SHUTDOWN, 0);
// перезагрузить компьютер
ExitWindowsEx(EWX_REBOOT, 0);
// завершить сеанс пользователя
ExitWindowsEx(EWX_LOGOFF, 0);
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
учу английский.
Форумчанин
Регистрация: 04.04.2009
Сообщений: 480
А какой заголовочный файл надо добавить чтобы компилятор ее понял? И как работать с удаленной (в локальной сети) машиной?
Программа на С# для выключения компьютера
«Мы можем что-то изменить и своими силами. »
«Начнешь с себя, примером ближнему поможешь. »
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
Это winapi функция, и на сколько я помню, она не позволяет выключать удаленный компьютер.
Для начала попробуйте выключить сетевой компьютер из командной строки (команда shutdown), чтобы точно знать в чем проблема. Если получится — проблема в вашей программе, если нет — то есть много вариантов, конфигурация сети, недостаток прав, и т.п.
Если из командной строки удастся выключить, как вариант (но не самый лучший) можно использовать функцию
system(«shutdown [параметры]»);
Но это будет не кроссплатформенный вариант
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
учу английский.
Форумчанин
Регистрация: 04.04.2009
Сообщений: 480
Да, действительно нет прав. А как их настроить?
«Мы можем что-то изменить и своими силами. »
«Начнешь с себя, примером ближнему поможешь. »
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
Да, действительно нет прав. А как их настроить?
bool SetProcessPrivileges(wchar_t *privileges)
SetProcessPrivileges(SE_SHUTDOWN_NAME);
учу английский.
Форумчанин
Регистрация: 04.04.2009
Сообщений: 480
bool SetProcessPrivileges(wchar_t *privileges)
SetProcessPrivileges(SE_SHUTDOWN_NAME);
Вылезли следующие предупреждения
И видимо поэтому не заработало
Хотя функция выполняется и выходит из выполнение return true
Отписался в разделе операционные системы по поводу как я пытаюсь сменить права и что при этом получается вот в этой теме
«Мы можем что-то изменить и своими силами. »
«Начнешь с себя, примером ближнему поможешь. »
Последний раз редактировалось iukash; 11.11.2010 в 11:53 .
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
Регистрация: 13.11.2011
Сообщений: 82
Надо сперва получить SeShutdownPrivelage потом EWX_REBOOT
Пишем программу выключения компьютера на C#
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;
Регистрация: 13.11.2011
Сообщений: 82
WinExec(‘shutdown -s -t 0’); WinExec(‘shutdown -r -t 0’);
Первая строка для того чтобы выключить, вторая для перезагрузки.
Если надо это сделать на удаленном компе то делайте клиент сервер.
Источник: www.programmersforum.ru
Как выключить компьютер?
Есть много разных способов выключить компьютер. Рассмотрим несколько из них.
Первый вариант самый простой и более распространён:
ExitWindowsEx(EWX_SHUTDOWN, 0);
Второй способ менее распространён, но так же работоспособный:
WinExec(«shutdown -s -t 0», SW_HIDE);
Более сложный с передачей привилегий, если варианты выше не работают:
HANDLE hToken; TOKEN_PRIVILEGES* NewState; // Здесь открываем процесс программы с получением ее структуры привилегий OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, // Выделяем виртуальную память для структуры NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES)); // Количество привилегий которые хотим получить NewState->PrivilegeCount = 1; // Здесь получаем UID привилегия на выполнение выключение LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, Privileges[0].Luid); // Устанавливаем атрибут доступа к привилегий NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Собственно навязываем привилегию на процесс AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL); // Освобождаем память которую выделили free (NewState); CloseHandle (hToken); // И вот сама функция выключения ExitWindowsEx(EWX_LOGOFF, 0);
Источник: cubook.pro
Урок 33 — Автовыключатель компьютера
В этом уроке мы создадим программу под названием «рубильник», она будет выключать наш компьютер по расписанию.
Итак, нам потребуется: 4 Label, 2 Button, DateTimePicker (Win32) и Timer. Располагаем эти компоненты так как на рисунке:
Определимся со свойствами, свойство Kind у DateTimePicker установим в dtkTime, и свойство Enabled у Timer выставляем в False.
Для выключения компьютера служит функция ExitWindowsEx();, но если её написать вот так просто, то ничего не произойдет, она так работала только в Windows98, в более современных системах она работает только когда есть особые привилегия у использующей её программы. Как сделать эти привилегия мы сейчас и узнаем. Для начала создадим процедуру выключения, в разделе Private Form1 объявим процедуру:
. private < Private declarations >Procedure PowerOFF; .
Нажмем комбинацию клавиш Shift + Ctrl + C и Delphi сам создаст шаблон для процедуры, его нужно наполнить кодом:
procedure TForm1.PowerOFF; var TTokenHd: THandle; TTokenPvg: TTokenPrivileges; cbtpPrevious: DWORD; rTTokenPvg: TTokenPrivileges; pcbtpPreviousRequired: DWORD; tpResult: Boolean; const SE_SHUTDOWN_NAME = ‘SeShutdownPrivilege’; begin //=========== Получаем привилегии ==============// begin if Win32Platform = VER_PLATFORM_WIN32_NT then begin tpResult := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TTokenHd); if tpResult then begin tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, TTokenPvg.Privileges[0].Luid); TTokenPvg.PrivilegeCount := 1; TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; cbtpPrevious := SizeOf(rTTokenPvg); pcbtpPreviousRequired := 0; if tpResult then Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg, cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired); end; end; //=============================================// ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0); //Выключаем компьютер; end;
Все процедура выключения готова, получилась она довольно громадной, зато везде работает. Теперь займемся таймером, создаем его обработчик события и пишем код:
procedure TForm1.Timer1Timer(Sender: TObject); var a,b: String; begin Label3.Caption:= TimeToStr(GetTime); //Получаем текущее время Label4.Caption:= TimeToStr(DateTimePicker1.Time — GetTime); //Вычисляем сколько времени осталось до выключения a:= TimeToStr(GetTime); //Присваиваем текущее время b:= TimeToStr(DateTimePicker1.Time); //Присваиваем время выключения if a = b then //Если текущее время равно времени выключения то PowerOFF; //выполняем процедуру выключения end;
Помните в начале урока мы выключили таймер, сделано это для того, чтобы можно было сначала настроить время а потом запустить таймер. Давайте сделаем управление таймером. Создадим обработчик события OnClick на кнопке «Старт»:
procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=True; //Включаем таймер end;
Ну и также выключим ,если например ошиблись во времени или передумали, в обработчике на кнопке «Стоп»:
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=False; end;
Вот у нас получилась такая программа, осталось изменить свойство Caption у Form1 на «Рубильник» и готово! Будьте осторожней с ней 🙂
Удачи!
Встретимся в следующем уроке!
Что такое «token», «tHandle», с чем его едят? Где можна найти информацию по таким вещам? Уж больно занятные вещи(ИМХО).
Источник: thedelphi.ru