Хотелось бы рассказать еще про один способ завершения работы компьютера.
Изначально хотел написать про API функцию ExitWindowsEx, но нашел более адекватный вариант с помощью WMI.
Windows Management Instrumentation (WMI) в дословном переводе — это инструментарий управления Windows. Если говорить более развернутo, то WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows. https://ru.wikipedia.org/wiki/WMI
Первое, что мы сделаем, это добавим ссылку на System.Management, для этого нажимаем Проект->Добавить ссылку
Теперь код:
'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