Завершение работы, перезагрузка, блокировка компьютера

В продолжение к

Хотелось бы рассказать еще про один способ завершения работы компьютера.

Изначально хотел написать про API функцию ExitWindowsEx, но нашел более адекватный вариант с помощью WMI.

Windows Management Instrumentation (WMI) в дословном переводе — это инструментарий управления Windows. Если говорить более развернутo, то WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows.                                                   https://ru.wikipedia.org/wiki/WMI 

Первое, что мы сделаем, это добавим ссылку на System.Management, для этого нажимаем Проект->Добавить ссылку

sysman 300x238 Завершение работы, перезагрузка, блокировка компьютера

Теперь код:

'https://msdn.microsoft.com/ru-RU/library/aa394239(v=vs.85).aspx
Imports System.Runtime.InteropServices
Imports System.Management
Public Class Form1
    ' блокировка
    <DllImport("user32.dll")> _
Public Shared Function LockWorkStation() As Boolean
    End Function
    Public Enum eParam
        EWX_LOGOFF = 0 'Завершить сеанс пользователя. Отключает от сети. Аналог - войти в систему под другим именем. (Завершение сеанса [name])
        EWX_FORCE = 4    'Закрывает все программы без приглашения сохранить файлы
        EWX_FORCEIFHUNG = 10  'Заставляет приложения завершиться, если они не реагируют на сообщения WM_QUERYENDSESSION или WM_ENDSESSION
        EWX_POWEROFF = 8  'Завершает работу системы и, если есть возможность, выключает питание компьютера. вызывающий процесс должен иметь привилегию SE_SHUTDOWN_NAME
        EWX_REBOOT = 2    'Перезагружает компьютер. Вызывающий процесс должен иметь привилегию SE_SHUTDOWN_NAME
        EWX_SHUTDOWN = 1  'Завершает работу и выключает питание, записывает все файловые буферы на диск, останавливает все работающие системные процессы. Вызывающий процесс должен иметь привилегию SE_SHUTDOWN_NAME. Выводит сообщение, что можно выключить компьютер
    End Enum
    Public Shared Sub ShutDownComp(ByVal eFlag As eParam)
        Dim outParameters As ManagementBaseObject
        Dim sysOS As New ManagementClass("Win32_OperatingSystem") ' экземпляр класса Win32_OperatingSystem и получаем управление 
        sysOS.[Get]() ' сведения о классе
        sysOS.Scope.Options.EnablePrivileges = True ' активируем привилегии
        Dim inParameters As ManagementBaseObject = sysOS.GetMethodParameters("Win32Shutdown") ' параметры Flags and 
        'заполняем параметры
        inParameters("Flags") = eFlag
        inParameters("Reserved") = 0
        For Each manObj As ManagementObject In sysOS.GetInstances()
            outParameters = manObj.InvokeMethod("Win32Shutdown", inParameters, Nothing) ' вызываем объект (сама операция)
        Next
    End Sub

Блокировка, выключение и перезагрузка:

LockWorkStation() ' блокировка
ShutDownComp(eParam.EWX_SHUTDOWN) ' выключение
ShutDownComp(eParam.EWX_REBOOT) ' перезагрузон

Тестировалось на Windows 7

01fig15 Завершение работы, перезагрузка, блокировка компьютера

  Метки: , , , , ,
  Евгений
  Просмотров: 7 516
  Запись опубликована в 15:33

Есть что сказать? Тогда действуй!