VB实现关机程序

VB实现关机程序下面是本人愿来写的关机程序可以适用于98/xp/2000,在程序中调用即可。现在操作系统多为2000或xp,所以需要特别注意的是应该先得到关机的特权:(要想弄懂下面的程序,先要具备vb调用api函数的知识……)其中:前面一些Public Declare都是api函数的声明.     Public Sub AdjustToken()子程序用来取得关机特权.     Public Sub Sh

大家好,又见面了,我是你们的朋友全栈君。下面是本人愿来写的关机程序可以适用于98/xp/2000,在程序中调用即可。现在操作系统多为2000或xp,所以需要特别注意的是应该先得到关机的特权:(要想弄懂下面的程序,先要具备vb调用api函数的知识……)

其中:前面一些Public Declare都是api函数的声明.

     Public Sub AdjustToken()子程序用来取得关机特权.

     Public Sub Shutdown() ‘是关机子程序

     Public Sub Reboot() ‘是重启子程序

 

*********************代码开始了:*****************

Public Structure LUID

  Dim UsedPart As Integer

  Dim IgnoredForNowHigh32BitPart As Integer

 End Structure

 

 Public Structure LUID_AND_ATTRIBUTES

  Dim TheLuid As LUID

  Dim Attributes As Integer

 End Structure

 

 Public Structure TOKEN_PRIVILEGES

  Dim PrivilegeCount As Integer

  Dim TheLuid As LUID

  Dim Attributes As Integer

 End Structure

 

 ‘强制关机函数

 Public Declare Function ExitWindowsEx Lib “user32” (ByVal uFlags As Integer, ByVal dwReserved As Integer) As Integer

 

 ‘GetLastError函数返回本线程的最后一次错误代码。错误代码是按照线程

 ‘储存的,多线程也不会覆盖其他线程的错误代码。

 Public Declare Function GetLastError Lib “kernel32” () As Integer

 

 ‘GetCurrentProcess函数返回当前进程的一个句柄。

 Public Declare Function GetCurrentProcess Lib “kernel32” () As Integer

 

 ‘OpenProcessToken函数打开一个进程的访问代号。

 Public Declare Function OpenProcessToken Lib “advapi32” (ByVal ProcessHandle As Integer, ByVal DesiredAccess As Integer, ByRef TokenHandle As Integer) As Integer

 

 ‘LookupPrivilegeValue函数获得本地唯一的标示符(LUID),用于在特定的系统中

 ‘表示特定的优先权。

 ‘UPGRADE_WARNING: 结构 LUID 可能要求封送处理属性作为此声明语句中的参数传递。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1050″”

 Public Declare Function LookupPrivilegeValue Lib “advapi32”  Alias “LookupPrivilegeValueA”(ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Integer

 

 ‘AdjustTokenPrivileges函数使能或者禁用指定访问记号的优先权。

 ‘使能或者禁用优先权需要TOKEN_ADJUST_PRIVILEGES访问权限。

 ‘UPGRADE_WARNING: 结构 TOKEN_PRIVILEGES 可能要求封送处理属性作为此声明语句中的参数传递。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1050″”

 ‘UPGRADE_WARNING: 结构 TOKEN_PRIVILEGES 可能要求封送处理属性作为此声明语句中的参数传递。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1050″”

 Public Declare Function AdjustTokenPrivileges Lib “advapi32” (ByVal TokenHandle As Integer, ByVal DisableAllPrivileges As Integer, ByRef NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Integer, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLength As Integer) As Integer

 

 Public Declare Sub SetLastError Lib “kernel32” (ByVal dwErrCode As Integer)

 ‘********************************************************************

 ‘* 这个过程设置正确的优先权,以允许在Windows NT下关机或者重新启动。

 ‘********************************************************************

 Public Sub AdjustToken()

  

  Const TOKEN_ADJUST_PRIVILEGES As Short = &H20s

  Const TOKEN_QUERY As Short = &H8s

  Const SE_PRIVILEGE_ENABLED As Short = &H2s

  

  Dim hdlProcessHandle As Integer

  Dim hdlTokenHandle As Integer

  Dim tmpLuid As LUID

  Dim tkp As TOKEN_PRIVILEGES

  Dim tkpNewButIgnored As TOKEN_PRIVILEGES

  Dim lBufferNeeded As Integer

  

  ‘使用SetLastError函数设置错误代码为0。

  ‘这样做,GetLastError函数如果没有错误会返回0

  ”””’SetLastError 0

  

  ‘GetCurrentProcess函数设置 hdlProcessHandle变量

  hdlProcessHandle = GetCurrentProcess()

  

  ””’ If GetLastError <> 0 Then

  ””’ MsgBox “GetCurrentProcess error==” & GetLastError

  ””’ End If

  

  OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hdlTokenHandle)

  

  ””’ If GetLastError <> 0 Then

  ””’ MsgBox “OpenProcessToken error==” & GetLastError

  ””’ End If

  

  ‘ 获得关机优先权的LUID

  LookupPrivilegeValue(“”, “SeShutdownPrivilege”, tmpLuid)

  

  ””’If GetLastError <> 0 Then

  ””’MsgBox “LookupPrivilegeValue error==” & GetLastError

  ””’End If

  

  tkp.PrivilegeCount = 1 ‘ 设置一个优先权

  ‘UPGRADE_WARNING: 未能解析对象 tkp.TheLuid 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1037″”

  tkp.TheLuid = tmpLuid

  tkp.Attributes = SE_PRIVILEGE_ENABLED

  

  ‘ 对当前进程使能关机优先权

  AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)

  

  ””’If GetLastError <> 0 Then

  ””’MsgBox “AdjustTokenPrivileges error==” & GetLastError

  ””’End If

  

 End Sub

 Public Sub Shutdown() ‘关机子程序

  ‘******************根据windows版本来关机************************

  If glngWhichWindows32 = mlngWindowsNT Then

   AdjustToken() ‘调用取得优先权子程序

  End If

  

  ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, &HFFFFs)

  ‘*****************************************************************

 End Sub

 

 Public Sub Reboot() ‘重启子程序

  ‘******************根据windows版本来关机************************

  If glngWhichWindows32 = mlngWindowsNT Then

   AdjustToken() ‘调用取得优先权子程序

  End If

  

  ExitWindowsEx(EWX_REBOOT Or EWX_FORCE, &HFFFFs)

  ‘*****************************************************************

 End Sub 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162980.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript 正则表达式全面总结

    JavaScript 正则表达式全面总结如果您发现错误,请一定要告诉我,拯救一个辣鸡(但很帅)的少年就靠您了!本文适合有JavaScript基础&&面向搜索引擎书写正则的人群。正则表达式是用于匹配字符串中字符组合

    2022年7月3日
    18
  • 源码免杀教程 源码免杀思路详解

    绝对不一样的源码免杀教程!绝对不一样的免杀实战体验!清晰的思路!细致全面的思路详解!让你感到免杀原来可以这么简单!教你如何在源代码中找出被杀代码,修改代码从而达到免杀效果!免杀之-网络攻防入门书籍推荐《精通黑客免杀》一部关于黑客免杀技术的书籍,学习各种免杀,躲避杀毒软件的追杀,为自己的马放下一道赦免令。目前国内关于黑客免杀技术的书籍应该很少的,大致可以说是没有。在本书中所介绍的启发式扫描免杀…

    2022年4月4日
    360
  • 数据库系统及应用实验与课程设计指导(图书管理系统c++课程设计)

    一、系统平台开发工具:EclipsejavaMars数据库MySQLserver,Navicat可视化工具操作系统:win10百度云链接:https://pan.baidu.com/s/1SIWR75NRIh8sSL0oV7uZgA提取码:4y44二、数据库规划1.任务陈述:图书馆信息管理系统数据库用以收集、存储书籍信息、人员(读者、图书管理员…

    2022年4月18日
    40
  • 数据库原理复习笔记(实用)

    数据库原理复习笔记(实用)这是大三上学期复习数据库时自己整理的,有些地方可能有误,大家可以参考参考,欢迎讨论哦最后有一些习题

    2022年10月23日
    0
  • 如何用import导入一个包_import怎么导入

    如何用import导入一个包_import怎么导入前言我们在开发项目时经常会进行导包有import*格式的,还有from*import*格式的,最后就会显示的很乱,那么有没有什么工具能对导包进行一键排序呢?答案是有的,使用isort工具i

    2022年8月7日
    5
  • ping和traceroute的工作原理

    ping和traceroute的工作原理PING原理PING是基于ICMP协议(网络层)工作的ICMP:InternetControlMessageProtocol,互联网控制报文协议ICMP用于报告传输过程中出现的问题,比如确认IP包是否成功送达,或者发送过程中被废弃的原因比如主机A向主机B发送消息,在途径某个路由器时,无法发现B的存在。路由器就会向A发送一个ICMP不可达的数据包,A解析ICMP的首部和数据段得知具体信息ICMP报文封装在IP包里,从左到右依次是IP头、ICMP头、ICMP数据段,后两部分构成IP

    2022年7月21日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号