如何用VB实现重启win NT系统?

carol83 2008-04-28 03:39:12
看了网上的介绍用ExitWindowsEx(),但是一直不成功.不知是何原因,各位帮忙看看啊

首先获得权限

Private Structure LUID
Dim UsedPart As Long
Dim IgnoredForNowHigh32BitPart As Long
End Structure

Private Structure TOKEN_PRIVILEGES
Dim PrivilegeCount As Long
Dim TheLuid As LUID
Dim Attributes As Long
End Structure

Private Const EWX_SHUTDOWN As Long = 1
Private Const EWX_FORCE As Long = 4
Private Const EWX_REBOOT = 2

Private Declare Function ExitWindowsEx Lib "user32" (ByVal _
dwOptions As Long, ByVal dwReserved As Long) As Long

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal _
ProcessHandle As Long, _
ByVal DesiredAccess As Long, ByVal TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, ByVal lpName As String, ByVal lpLuid _
As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" _
(ByVal TokenHandle As Long, _
ByVal DisableAllPrivileges As Long, ByVal NewState As TOKEN_PRIVILEGES _
, ByVal BufferLength As Long, _
ByVal PreviousState As TOKEN_PRIVILEGES, ByVal ReturnLength As Long) As Long

Private Sub AdjustToken()
Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hdlProcessHandle = GetCurrentProcess()
OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle)

' Get the LUID for shutdown privilege.
LookupPrivilegeValue(vbNullString, "SeShutdownPrivilege", tmpLuid)

tkp.PrivilegeCount = 1 ' One privilege to set
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED

' Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges(hdlTokenHandle, False, _
tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
End Sub

然后使用这样两条语句来重启系统
AdjustToken()
ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), &HFFFF)

运行时执行到LookupPrivilegeValue(vbNullString, "SeShutdownPrivilege", tmpLuid)就出错:
未处理的“System.NullReferenceException”类型的异常出现在 MoveFile.exe 中。
其他信息: 未将对象引用设置到对象的实例。


debug时发现执行完
OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
TOKEN_QUERY), hdlTokenHandle)
之后,hdlTokenHandle=0

是否与这里有关呢?
...全文
152 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pjagz 2008-04-30
  • 打赏
  • 举报
回复
Shell("C:\WINDOWS\system32\Shutdown.exe -s -t 00", AppWinStyle.Hide)
-l
注销当前用户,这是默认设置。-m ComputerName 优先。
-s
关闭本地计算机。
-r
关闭之后重新启动。
-a
中止关闭。除了 -l 和 ComputerName 外,系统将忽略其它参数。在超时期间,您只可以使用 -a。
-f
强制运行要关闭的应用程序。
-m [\\ComputerName]
指定要关闭的计算机。
-t xx
将用于系统关闭的定时器设置为 xx 秒。默认值是 20 秒。
51Crack 2008-04-30
  • 打赏
  • 举报
回复
GetCurrentProcess().Handle.ToInt32,晕
另外,所有的Long改为Integer就可以了
carol83 2008-04-30
  • 打赏
  • 举报
回复
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
GetCurrentProcess()返回的是long
GetCurrentProcess().Handle不能通过编译啊.

大家帮忙看看呀,多谢!
carol83 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pjagz 的回复:]
Shell("C:\WINDOWS\system32\Shutdown.exe -s -t 00", AppWinStyle.Hide)
-l
注销当前用户,这是默认设置。-m ComputerName 优先。
-s
关闭本地计算机。
-r
关闭之后重新启动。
-a
中止关闭。除了 -l 和 ComputerName 外,系统将忽略其它参数。在超时期间,您只可以使用 -a。
-f
强制运行要关闭的应用程序。
-m [\\ComputerName]
指定要关闭的计算机。
-t xx
将用于系统关闭的…
[/Quote]

这方法也不错,先用着,呵呵. Thx!

不过还是很想知道我原来的方法错在哪里,盼大侠们出来解答一下!
carol83 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 51Crack 的回复:]
GetCurrentProcess().Handle.ToInt32,晕
另外,所有的Long改为Integer就可以了
[/Quote]

我把GetCurrentProcess()的声明成这样?
Private Declare Function GetCurrentProcess Lib "kernel32" () As Integer

还是不可以的.

51Crack 说的GetCurrentProcess()返回值应该是什么呢?
51Crack 2008-04-29
  • 打赏
  • 举报
回复
hdlProcessHandle = GetCurrentProcess().Handle
556,delay1.zip 源码设计中的延时功能(1KB)557,type_1.zip 趣味打字2.1(233KB)558,test1.zip asp编写动态网页计数器(1KB)559,hztosm.zip 汉字转声母完全源代码(90KB)560,formatfloppy.zip 格式化软盘源代码(13KB)561,freespace.zip 获取磁盘剩余空间(3KB)562,setscreen 设置屏幕分辨率(7KB)563,snapwindow.zip 一个抓图的小程序(14KB)564,hotrgn.zip 热区的应用(6KB)565,getserial.zip 读出驱动器序列号,可以制作加密安装盘(2KB)566,opencdrom.zip 可以程序控制打开或关闭CDROM,非常方便(2KB)567,getusername.zip 自动读取用户登陆名称,再进行密码验证(2KB)568,gethostname.zip 读取机器名称(2KB)569,printpic.zip 解决图形打印的问题(50KB)570,g029_pcl.zip拼图游戏(56KB)571,g028_octopus.zip一个简单的掌上游戏机的游戏,这个游戏机的内容是要逃过大章鱼的捕捉(408KB)572,g027_menace.zip仓库世家-推箱子的游戏(114KB)573,g026_breKthru.zip弹珠台游戏(41KB)574,g025_zhq.zip一个能考考你的智慧的智慧棋(17KB)575,g024_vb-sol.zipVB 的扑克牌游戏的源码(15KB)576,g023_picgame.zip一个好玩的拼图游戏(25KB)577,g021_zm015看着超级玛莉不停的追赶着你的鼠标,是不是很有意思呢?(25KB)578,g020_zm019一个拼图游戏,可以自己指定图片进行游戏(12KB)579,g019_zm011一个网络五子棋的源程序(并有聊天功能)(41KB)580,g018_zm010.zip中国象棋的源程序,支持网络作战(23KB)581,g0173维的breaKthrough游戏(8KB)582,g016.zip小蜜蜂射击游戏源程序, 不仅演示了 vb 的图形操作技巧,键盘操作,还演示了怎样使用 npmod32.dll(已包含,免费) 来播mod,s3m,mpp,med,xm,it,mdz,itz,xmz,s3z 等音乐格式文件(208KB)583,g015.zip旋转俄罗斯 1.0 demo 版的源程序,vb5 版存贮,稍加修改即适合于 vb4、vb3。里面有用 vb 处理俄罗斯方块的核心内容及简单注释(8KB)584,g014.zipbreakthrough游戏(保持小球在屏幕上跳动)源程序(50KB)585,g013.zip3维迷宫游戏的源程序(40KB)586,g012.zip射击(导弹)游戏的源程序(5KB)587,g011.zip生命游戏源程序(12KB)588,g010.zip一个精灵游戏源程序(33KB)589,g009.zip翻转棋游戏(64子, 每子正反面分别为黑白两色, 两人对弈)的源程序(29)590,g008.zip纸牌游戏源程序(45KB)591,g007.zip太空船游戏例子源程序(48KB)592,g006.zip用白雪做背面的俄罗斯方块(1.0版),自带EXE(224KB)593,g005.zip个人娱乐游戏,自带EXE(25KB)594,g004.zip个个人自娱乐的扑克牌游戏(57KB)595,g003.zip代表和平的娱乐游戏,自带EXE(12KB)596,g002.zip一个迷宫游戏,还有地图编辑器呢,完全源码(230KB)597,g001.zip模仿windows中的扫雷,自带EXE(38KB)
556,delay1.zip 源码设计中的延时功能(1KB)557,type_1.zip 趣味打字2.1(233KB)558,test1.zip asp编写动态网页计数器(1KB)559,hztosm.zip 汉字转声母完全源代码(90KB)560,formatfloppy.zip 格式化软盘源代码(13KB)561,freespace.zip 获取磁盘剩余空间(3KB)562,setscreen 设置屏幕分辨率(7KB)563,snapwindow.zip 一个抓图的小程序(14KB)564,hotrgn.zip 热区的应用(6KB)565,getserial.zip 读出驱动器序列号,可以制作加密安装盘(2KB)566,opencdrom.zip 可以程序控制打开或关闭CDROM,非常方便(2KB)567,getusername.zip 自动读取用户登陆名称,再进行密码验证(2KB)568,gethostname.zip 读取机器名称(2KB)569,printpic.zip 解决图形打印的问题(50KB)570,g029_pcl.zip拼图游戏(56KB)571,g028_octopus.zip一个简单的掌上游戏机的游戏,这个游戏机的内容是要逃过大章鱼的捕捉(408KB)572,g027_menace.zip仓库世家-推箱子的游戏(114KB)573,g026_breKthru.zip弹珠台游戏(41KB)574,g025_zhq.zip一个能考考你的智慧的智慧棋(17KB)575,g024_vb-sol.zipVB 的扑克牌游戏的源码(15KB)576,g023_picgame.zip一个好玩的拼图游戏(25KB)577,g021_zm015看着超级玛莉不停的追赶着你的鼠标,是不是很有意思呢?(25KB)578,g020_zm019一个拼图游戏,可以自己指定图片进行游戏(12KB)579,g019_zm011一个网络五子棋的源程序(并有聊天功能)(41KB)580,g018_zm010.zip中国象棋的源程序,支持网络作战(23KB)581,g0173维的breaKthrough游戏(8KB)582,g016.zip小蜜蜂射击游戏源程序, 不仅演示了 vb 的图形操作技巧,键盘操作,还演示了怎样使用 npmod32.dll(已包含,免费) 来播mod,s3m,mpp,med,xm,it,mdz,itz,xmz,s3z 等音乐格式文件(208KB)583,g015.zip旋转俄罗斯 1.0 demo 版的源程序,vb5 版存贮,稍加修改即适合于 vb4、vb3。里面有用 vb 处理俄罗斯方块的核心内容及简单注释(8KB)584,g014.zipbreakthrough游戏(保持小球在屏幕上跳动)源程序(50KB)585,g013.zip3维迷宫游戏的源程序(40KB)586,g012.zip射击(导弹)游戏的源程序(5KB)587,g011.zip生命游戏源程序(12KB)588,g010.zip一个精灵游戏源程序(33KB)589,g009.zip翻转棋游戏(64子, 每子正反面分别为黑白两色, 两人对弈)的源程序(29)590,g008.zip纸牌游戏源程序(45KB)591,g007.zip太空船游戏例子源程序(48KB)592,g006.zip用白雪做背面的俄罗斯方块(1.0版),自带EXE(224KB)593,g005.zip个人娱乐游戏,自带EXE(25KB)594,g004.zip个个人自娱乐的扑克牌游戏(57KB)595,g003.zip代表和平的娱乐游戏,自带EXE(12KB)596,g002.zip一个迷宫游戏,还有地图编辑器呢,完全源码(230KB)597,g001.zip模仿windows中的扫雷,自带EXE(38KB)

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧