Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
53 / 53 / 17
Регистрация: 12.02.2017
Сообщений: 261

Функция для блокировки системы и смены пользователя

04.03.2017, 14:30. Показов 1680. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

В моем распоряжении есть коды для выполнения задач связаных с завершением работы сеанса ПК на vb.net.

Эти коды у меня есть

'Выключение ПК
'Перезагрузки ПК
'Сон
'Гибернации
'Выйти из системы



Помогите добавить код для


'Блокировки
'Смена пользователя



Рабочий код который я использую, в нем нет только "блокировать и смена пользователя".

Первый код в начале формы, На форме есть 5 кнопок.
Кликните здесь для просмотра всего текста

VB.NET
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
Imports System
Imports System.Text
Imports System.Diagnostics
Imports System.Runtime.InteropServices
 
Public Class Form1
    Dim ExitWindows As New ExitWindwos
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ExitWindows.PowerOff() 'Выключение
    End Sub
 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ExitWindows.Reboot() 'Перезагрузка
    End Sub
 
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ExitWindows.Suspend() ' Сон
    End Sub
 
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        ExitWindows.Hibernate() 'Гибернация
    End Sub
 
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        ExitWindows.OutUser() 'Выйти из системы
    End Sub
End Class


Второй код функции завершения сеанса в этой же форме
Кликните здесь для просмотра всего текста

VB.NET
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
Public Class ExitWindwos
    Public Enum RestartOptions
 
        PowerOff = 8 ' Выключает комп
        Reboot = 2 ' Перезагружает комп
        Suspend = -1 'Сон
        Hibernate = -2 'Гибернация
        OutUser = 4 'Выйти из системы
 
    End Enum
    Public Structure LUID
        Dim LowPart As Integer
        Dim HighPart As Integer
    End Structure
    Public Structure LUID_AND_ATTRIBUTES
        Dim pLuid As LUID
        Dim Attributes As Integer
    End Structure
    Public Structure TOKEN_PRIVILEGES
        Dim PrivilegeCount As Integer
        Dim Privileges As LUID_AND_ATTRIBUTES
    End Structure
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_QUERY = &H8
    Private Const SE_PRIVILEGE_ENABLED = &H2
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const EWX_FORCE = 4
    Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As IntPtr
    Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As IntPtr) As Integer
    Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As IntPtr, ByVal lpProcName As String) As IntPtr
    Private Declare Function SetSuspendState Lib "Powrprof" (ByVal Hibernate As Integer, ByVal ForceCritical As Integer, ByVal DisableWakeEvent As Integer) As Integer
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As Integer, ByRef TokenHandle As IntPtr) As Integer
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Integer
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As IntPtr, ByVal DisableAllPrivileges As Integer, ByRef NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Integer, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLength As Integer) As Integer
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Integer, ByVal dwReserved As Integer) As Integer
    Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Integer, ByVal lpSource As IntPtr, ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByVal lpBuffer As StringBuilder, ByVal nSize As Integer, ByVal Arguments As Integer) As Integer
    Private Sub ExitWindows(ByVal how As RestartOptions, ByVal force As Boolean)
        Select Case how
            Case RestartOptions.Suspend
                SuspendSystem(False, force)
            Case RestartOptions.Hibernate
                SuspendSystem(True, force)
            Case Else
                ExitWindows(Convert.ToInt32(how), force)
        End Select
    End Sub
    Private Sub ExitWindows(ByVal how As Integer, ByVal force As Boolean)
        EnableToken("SeShutdownPrivilege")
        If force Then how = how Or EWX_FORCE
        If (ExitWindowsEx(how, 0) = 0) Then Throw New PrivilegeException(FormatError(Marshal.GetLastWin32Error()))
    End Sub
    Private Sub EnableToken(ByVal privilege As String)
        If Not CheckEntryPoint("advapi32.dll", "AdjustTokenPrivileges") Then Return
        Dim tokenHandle As IntPtr = IntPtr.Zero
        Dim privilegeLUID = New LUID
        Dim newPrivileges = New TOKEN_PRIVILEGES
        Dim tokenPrivileges As TOKEN_PRIVILEGES
        If (OpenProcessToken(Process.GetCurrentProcess().Handle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, tokenHandle)) = 0 Then Throw New PrivilegeException(FormatError(Marshal.GetLastWin32Error()))
        If (LookupPrivilegeValue("", privilege, privilegeLUID)) = 0 Then Throw New PrivilegeException(FormatError(Marshal.GetLastWin32Error()))
        tokenPrivileges.PrivilegeCount = 1
        tokenPrivileges.Privileges.Attributes = SE_PRIVILEGE_ENABLED
        tokenPrivileges.Privileges.pLuid = privilegeLUID
        Dim Size As Integer = 4
        If (AdjustTokenPrivileges(tokenHandle, 0, tokenPrivileges, 4 + (12 * tokenPrivileges.PrivilegeCount), newPrivileges, Size)) = 0 Then Throw New PrivilegeException(FormatError(Marshal.GetLastWin32Error()))
    End Sub
    Private Sub SuspendSystem(ByVal hibernate As Boolean, ByVal force As Boolean)
        If Not CheckEntryPoint("powrprof.dll", "SetSuspendState") Then Throw New PlatformNotSupportedException("The SetSuspendState method is not supported on this system!")
        SetSuspendState(Convert.ToInt32(IIf(hibernate, 1, 0)), Convert.ToInt32(IIf(force, 1, 0)), 0)
    End Sub
    Private Function CheckEntryPoint(ByVal library As String, ByVal method As String) As Boolean
        Dim libPtr As IntPtr = LoadLibrary(library)
        If Not libPtr.Equals(IntPtr.Zero) Then
            If Not GetProcAddress(libPtr, method).Equals(IntPtr.Zero) Then
                FreeLibrary(libPtr)
                Return True
            End If
            FreeLibrary(libPtr)
        End If
        Return False
    End Function
    Private Function FormatError(ByVal number As Integer) As String
        Dim Buffer = New StringBuilder(255)
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, IntPtr.Zero, number, 0, Buffer, Buffer.Capacity, 0)
        Return Buffer.ToString()
    End Function
    Public Sub PowerOff()
        ExitWindows(RestartOptions.PowerOff, False)
    End Sub
    Public Sub Reboot()
        ExitWindows(RestartOptions.Reboot, False)
    End Sub
    Public Sub Suspend()
        ExitWindows(RestartOptions.Suspend, False)
    End Sub
    Public Sub Hibernate()
        ExitWindows(RestartOptions.Hibernate, False)
    End Sub
    Public Sub OutUser()
        ExitWindows(RestartOptions.OutUser, False)
    End Sub
End Class
Public Class PrivilegeException
    Inherits Exception
    Public Sub New()
        MyBase.New()
    End Sub
    Public Sub New(ByVal message As String)
        MyBase.New(message)
    End Sub
End Class
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2017, 14:30
Ответы с готовыми решениями:

Функция Win API для смены пользователя
Есть ли такая функция в Функция Win API смена пользователя на языке С#

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

Скрипт для определения наличия блокировки пользователя ПК
Всем привет Подскажите, есть ли решение, чтобы узнать заблокирован (т.е. висит в ctr+alt+del) комп или нет? 0 или 1 Спасибо

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
04.03.2017, 15:18
Цитата Сообщение от Navthe Посмотреть сообщение
Блокировки
LockWorkStation (pinvoke.net)

Цитата Сообщение от Navthe Посмотреть сообщение
Смена пользователя
На этот счет не уверен. По идее WTSConnectSession нужно использовать. Возможно Убежденный подскажет.
1
53 / 53 / 17
Регистрация: 12.02.2017
Сообщений: 261
04.03.2017, 15:47  [ТС]
Эти функции можно вызвать через консоль, вопрос решен.

logoff - Выйти из системы
tsdiscon - Сменить пользователя

shell "rundll32 user32.dll LockWorkStation" - заблокировать
shell "tsdiscon" - Сменить пользователя
0
3 / 3 / 0
Регистрация: 12.07.2007
Сообщений: 33
05.03.2017, 09:06
Можно через WMI

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim objWMIService, objComputer As Object
objWMIService = GetObject("Winmgmts:{impersonationLevel=impersonate,(Debug,Shutdown)}")
 
For Each objComputer In objWMIService.InstancesOf("Win32_OperatingSystem")
   objComputer.Win32shutdown(12, 0) 
Next
 
'полный список значений, которые можно использовать
'0  (0x0)             - Log Off
'4  (0x4)             - Forced Log Off (0 + 4)
'1  (0x1)             - Shutdown
'5  (0x5)             - Forced Shutdown (1 + 4)
'2  (0x2)             - Reboot
'6  (0x6)             - Forced Reboot (2 + 4)
'8  (0x8)             - Power Off
'12  (0xC)          - Forced Power Off (8 + 4)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2017, 09:06
Помогаю со студенческими работами здесь

Получение WinAPI сообщения для экрана блокировки системы и диспетчера задач в Win 8
Доброе время суток всем. Поискал по форуму подобный вопрос, и похоже что нужного ответа не нашел. ...

Использование Convert для смены системы исчисления
На C# как конверт на десетичное число например 160 в число с основа 3 потом 4..5...6..7...8...9? Добавлено через 30 минут Число...

Какова возможность смены пароля для пользователя с высоким уровнем доступа к информации
какова возможность, смены пароля для пользователя с высоким уровнем доступа к информации. Потребность в смене пароля высказало начальство...

Экран блокировки при не активности пользователя
Приветствую! В приложении использую систему авторизации ASP.NET Identity. Подскажите, пожалуйста, как вывести экран блокировки для...

Смена окна изменения пользователя\блокировки экрана
Здравствуйте! Пожалуйста подскажите как изменить окно изменения пользователя\блокировки экрана. Извиняюсь за снимок, не знал как...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru