Суббота, 04.05.2024, 23:02
Приветствую Вас Guest Member

Windows XP / 7 .

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Форум <<Помощь по компьютерам>> » C++ программирование » Программирование для .NET » Перезагрузка/выключение/блокирование машины на C# (Перезагрузка/выключение/блокирование машины на C#)
Перезагрузка/выключение/блокирование машины на C#
AdminДата: Пятница, 11.06.2010, 21:33 | Сообщение # 1
Forum member
Группа: Admin
Зарегистрирован: 24.02.2010
Откуда: Цюрупинск
Пол: Мужчина
Сообщений: 691
Статус: Вне сайта
Очень часто звучит вопрос: как программно перезагрузить компьютер, как выключить и т.п.. Иногда такой вопрос начинает мучать и C# программистов
Единственный путь тут - использование WinAPI.
Я написал простой и удобный, как мне кажется, класс для выполнения всех вышеописанных действий.
Решил поделится, дабы никто из обитателей этой ветки не изобретал велосипеда, перерывая гугл

Code
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();
        

Далле смотрите (следуещее сообщение)



 
AdminДата: Пятница, 11.06.2010, 21:34 | Сообщение # 2
Forum member
Группа: Admin
Зарегистрирован: 24.02.2010
Откуда: Цюрупинск
Пол: Мужчина
Сообщений: 691
Статус: Вне сайта
Code
//объявляем структуру 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;
                 



 
AdminДата: Пятница, 11.06.2010, 21:35 | Сообщение # 3
Forum member
Группа: Admin
Зарегистрирован: 24.02.2010
Откуда: Цюрупинск
Пол: Мужчина
Сообщений: 691
Статус: Вне сайта
Продолжение
Code
//получаем системный идентификатор необходимой нам привилегии
                 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) - вызов этого метода приводит к перезагрузке/выключению, вот возможные режимы:

Code
halt(true, false) //мягкая перезагрузка
halt(true, true) //жесткая перезагрузка
halt(false, false) //мягкое выключение
halt(false, true) //жесткое выключение



 
Форум <<Помощь по компьютерам>> » C++ программирование » Программирование для .NET » Перезагрузка/выключение/блокирование машины на C# (Перезагрузка/выключение/блокирование машины на C#)
  • Страница 1 из 1
  • 1
Поиск: