Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/238: Рейтинг темы: голосов - 238, средняя оценка - 4.83
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696

Можно ли средствами C# выключать, перезагружать и блокировать компьютер

16.03.2010, 02:12. Показов 49418. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Можно ли средствами данного языка выключать, перезагружать и блокировать компьютер?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2010, 02:12
Ответы с готовыми решениями:

Можно ли средствами C++ выключать, перезагружать и блокировать компьютер
Можно ли средствами C++ выключать, перезагружать и блокировать компьютер

Как можно выключать компьютер?
почему все говорят что надо комп выключать чрез пуск?Почему если через конпку на компе-то комп испортится?:-|

Как часто можно выключать компьютер?
Хотелось-бы узнать мнение профессионалов по вопросу частоты выключения компьютера. Ходят разные мнения: одни говорят, что компьютер...

42
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
16.03.2010, 02:18
Лучший ответ Сообщение было отмечено как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System.Runtime.InteropServices;
 
    class reboot
    {
        //импортируем API функцию InitiateSystemShutdown
        [DllImport("advapi32.dll", EntryPoint = "InitiateSystemShutdownEx")]
        static extern int InitiateSystemShutdown(string lpMachineName, string lpMessage, int dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown);
        //импортируем API функцию AdjustTokenPrivileges
        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
        ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
        //импортируем API функцию GetCurrentProcess
        [DllImport("kernel32.dll", ExactSpelling = true)]
        internal static extern IntPtr GetCurrentProcess();
        //импортируем API функцию OpenProcessToken
        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
        //импортируем API функцию LookupPrivilegeValue
        [DllImport("advapi32.dll", SetLastError = true)]
        internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
        //импортируем API функцию LockWorkStation
        [DllImport("user32.dll", EntryPoint = "LockWorkStation")]
        static extern bool LockWorkStation();
        //объявляем структуру TokPriv1Luid для работы с привилегиями
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        internal struct TokPriv1Luid
        {
            public int Count;
            public long Luid;
            public int Attr;
        }
        //объявляем необходимые, для API функций, константые значения, согласно MSDN
        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
        internal const int TOKEN_QUERY = 0x00000008;
        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
        internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
        //функция SetPriv для повышения привилегий процесса
        private void SetPriv()
        {
            TokPriv1Luid tkp; //экземпляр структуры TokPriv1Luid 
            IntPtr htok = IntPtr.Zero;
            //открываем "интерфейс" доступа для своего процесса
            if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok))
            {
                //заполняем поля структуры
                tkp.Count = 1;
                tkp.Attr = SE_PRIVILEGE_ENABLED;
                tkp.Luid = 0;
                //получаем системный идентификатор необходимой нам привилегии
                LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tkp.Luid);
                //повышем привилигеию своему процессу
                AdjustTokenPrivileges(htok, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
            }
        }
        //публичный метод для перезагрузки/выключения машины
        public int halt(bool RSh, bool Force)
        {
            SetPriv(); //получаем привилегия
            //вызываем функцию InitiateSystemShutdown, передавая ей необходимые параметры
            return InitiateSystemShutdown(null, null, 0, Force, RSh);           
        }
        //публичный метод для блокировки операционной системы
        public int Lock()
        {
            if (LockWorkStation())
                return 1;
            else
                return 0;
        }
Собственно класс имеет два метода:
Lock() - вызов этого метода приведет к блокированию ос (но не выходу из системы!)
halt(bool RSh, bool Force) - вызов этого метода приводит к перезагрузке/выключению, вот возможные режимы:

C#
1
2
3
4
halt(true, false) //мягкая перезагрузка
halt(true, true) //жесткая перезагрузка
halt(false, false) //мягкое выключение
halt(false, true) //жесткое выключение
31
13 / 13 / 1
Регистрация: 02.02.2010
Сообщений: 102
16.03.2010, 02:32
Вот на самом деле интереснее вопрос с включением.
2
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
16.03.2010, 02:42  [ТС]
Да, меня тоже этот вопрос интересует. Понимаю, что это происходит по сети и вполне реализуемо, но как это сделать на C#?
0
92 / 79 / 9
Регистрация: 10.03.2010
Сообщений: 172
16.03.2010, 08:37
Включение ПК по сети реализуется в Bios мат. платы.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
16.03.2010, 16:20  [ТС]
Для включения компьютера надо же послать как-то какие-то данные на него. Как и какие?
0
92 / 79 / 9
Регистрация: 10.03.2010
Сообщений: 172
16.03.2010, 16:37
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от body90 Посмотреть сообщение
Для включения компьютера надо же послать как-то какие-то данные на него. Как и какие?
http://white55.narod.ru/wol.html
3
1 / 1 / 0
Регистрация: 30.05.2010
Сообщений: 16
30.05.2010, 23:31
А как это связать с кнопкой?

Добавлено через 5 минут
Цитата Сообщение от m0nax Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
using System.Runtime.InteropServices;
 
    class reboot
    {
        //импортируем API функцию InitiateSystemShutdown
        [DllImport("advapi32.dll", EntryPoint = "InitiateSystemShutdownEx")]
        static extern int InitiateSystemShutdown(string lpMachineName, string lpMessage, int dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown);
        //импортируем API функцию AdjustTokenPrivileges
        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
        ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
        //импортируем API функцию GetCurrentProcess
        [DllImport("kernel32.dll", ExactSpelling = true)]
        internal static extern IntPtr GetCurrentProcess();
        //импортируем API функцию OpenProcessToken
        [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
        internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
        //импортируем API функцию LookupPrivilegeValue
        [DllImport("advapi32.dll", SetLastError = true)]
        internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
        //импортируем API функцию LockWorkStation
        [DllImport("user32.dll", EntryPoint = "LockWorkStation")]
        static extern bool LockWorkStation();
        //объявляем структуру TokPriv1Luid для работы с привилегиями
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        internal struct TokPriv1Luid
        {
            public int Count;
            public long Luid;
            public int Attr;
        }
        //объявляем необходимые, для API функций, константые значения, согласно MSDN
        internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
        internal const int TOKEN_QUERY = 0x00000008;
        internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
        internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
        //функция SetPriv для повышения привилегий процесса
        private void SetPriv()
        {
            TokPriv1Luid tkp; //экземпляр структуры TokPriv1Luid 
            IntPtr htok = IntPtr.Zero;
            //открываем "интерфейс" доступа для своего процесса
            if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok))
            {
                //заполняем поля структуры
                tkp.Count = 1;
                tkp.Attr = SE_PRIVILEGE_ENABLED;
                tkp.Luid = 0;
                //получаем системный идентификатор необходимой нам привилегии
                LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tkp.Luid);
                //повышем привилигеию своему процессу
                AdjustTokenPrivileges(htok, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
            }
        }
        //публичный метод для перезагрузки/выключения машины
        public int halt(bool RSh, bool Force)
        {
            SetPriv(); //получаем привилегия
            //вызываем функцию InitiateSystemShutdown, передавая ей необходимые параметры
            return InitiateSystemShutdown(null, null, 0, Force, RSh);           
        }
        //публичный метод для блокировки операционной системы
        public int Lock()
        {
            if (LockWorkStation())
                return 1;
            else
                return 0;
        }
Собственно класс имеет два метода:
Lock() - вызов этого метода приведет к блокированию ос (но не выходу из системы!)
halt(bool RSh, bool Force) - вызов этого метода приводит к перезагрузке/выключению, вот возможные режимы:

C#
1
2
3
4
halt(true, false) //мягкая перезагрузка
halt(true, true) //жесткая перезагрузка
halt(false, false) //мягкое выключение
halt(false, true) //жесткое выключение
А как связать это с кнопкой?
1
 Аватар для IICuX
87 / 87 / 26
Регистрация: 04.01.2010
Сообщений: 270
30.05.2010, 23:42
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
{
    halt(false, false);
}
2
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
31.05.2010, 00:09
chelovek1,
скорее всего нужно весь код прописать в коде формы, а на кнопку нужно написать вызов метода halt и включить в него соответствующие параметры:

C#
1
2
3
4
halt(true, false) //мягкая перезагрузка
halt(true, true) //жесткая перезагрузка
halt(false, false) //мягкое выключение
halt(false, true) //жесткое выключение
2
1 / 1 / 0
Регистрация: 30.05.2010
Сообщений: 16
31.05.2010, 00:23
Цитата Сообщение от IICuX Посмотреть сообщение
C#
1
2
3
4
private void button1_Click(object sender, EventArgs e)
{
    halt(false, false);
}
Ругается, говорит:
Error 1: The name 'halt' does not exist in the current context
0
 Аватар для IICuX
87 / 87 / 26
Регистрация: 04.01.2010
Сообщений: 270
31.05.2010, 00:33
Цитата Сообщение от chelovek1 Посмотреть сообщение
Ругается, говорит:
Error 1: The name 'halt' does not exist in the current context
вы в ваш класс метод halt не добавили, добавьте его
1
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
31.05.2010, 06:55
Лучший ответ Сообщение было отмечено как решение

Решение

Еще пример выключения
C#
1
2
var p = new ProcessStartInfo("cmd", "/r shutdown -f -s -t 0") { CreateNoWindow = true };
Process.Start(p);
4
49 / 49 / 3
Регистрация: 15.11.2009
Сообщений: 372
31.05.2010, 11:08
HIMen, а можете объяснить код ?
0
 Аватар для IICuX
87 / 87 / 26
Регистрация: 04.01.2010
Сообщений: 270
31.05.2010, 14:18
Цитата Сообщение от Helios1.618 Посмотреть сообщение
HIMen, а можете объяснить код ?
запускаете командную строку с заданными параметрами выключения комьютера.
1
1 / 1 / 0
Регистрация: 30.05.2010
Сообщений: 16
31.05.2010, 15:39
Цитата Сообщение от IICuX Посмотреть сообщение
вы в ваш класс метод halt не добавили, добавьте его
Извиняюсь конечно (совсем новичок), но можете показать..
0
 Аватар для IICuX
87 / 87 / 26
Регистрация: 04.01.2010
Сообщений: 270
31.05.2010, 17:08
Цитата Сообщение от chelovek1 Посмотреть сообщение
Извиняюсь конечно (совсем новичок), но можете показать..
Вот у Вас есть класс например Form1.cs, а для выключения компьютера у Вас есть другой класс, называется он reboot, добавляете в проект Ваш новый класс (можно файликом) и даете ему название reboot. Добавляете на свою форму (класс Form1.cs) кнопку (Button) в дизайнере кликаете на неё 2 раза, создастся обработчик события button1_Click, внутри напишите следующиющий код:

C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
{
    reboot r = new reboot(); //Создаете объект класса reboot
    r.halt(false, false); //  и тут параметры уже укажите сами (true, false)
}
После этого, если Вы все правильно сделали, компьютер выполнит следующее действие (взависимости от того какие вы задали параметры) выключится или перегрузится.
1
|____WTF!?____|
 Аватар для stalkersev
95 / 94 / 11
Регистрация: 01.06.2010
Сообщений: 227
01.06.2010, 17:02
Лучший ответ Сообщение было отмечено как решение

Решение

Выключение:

C#
1
2
3
4
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c shutdown -s -t 00";
p.Start();
Перезагрузка:

C#
1
2
3
4
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c restart -s -t 00";
p.Start();
Насчет включения, извини не знаю :-(
6
1 / 1 / 0
Регистрация: 30.05.2010
Сообщений: 16
01.06.2010, 21:13
БОЛЬШОЕ спасибо разобрался...
0
QA
 Аватар для QA
9 / 9 / 2
Регистрация: 07.06.2011
Сообщений: 124
07.06.2011, 17:30
Ребята, а как сделать автоматическое вьіключение в заданное время?? помогите пожалуйста.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2011, 17:30
Помогаю со студенческими работами здесь

Нужно ли выключать компьютер?
Привет Мужики и Леди! Каково ваше мнение? на протяжении последних 4-5 лет никогда не пользовался выключением, всегда...

Внезапно возникает серый экран и приходится перезагружать компьютер
Здравствуйте,такая проблема лазая или играя на компьютере в игры или что-то типо того внезапно возникает серый экран и приходиться...

каждый раз в играх меняются текстуры и иногда приходится перезагружать компьютер
Здравствуйте. У меня такая проблема, каждый раз в играх меняются текстуры и иногда приходится перезагружать компьютер. И так постоянно! ...

Компьютер зависает несколько раз в сутки и приходится перезагружать,кажется умирает HDD
Здравствуйте.Мой компьютер зависает и приходится делать перезагрузку вручную с кнопки на системном блоке.Иногда бывает что возникает звук...

Компьютер зависает периодически, появляется синий экран с английским текстом, приходится перезагружать
компьютер после включения зависает периодически,появляется синий экран с английским текстом,перезагружаю и опять такая фигня,раз по 5...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru