最近在制作学校机房的管理软件
在Win9x下,ExitWindowEx可以实现关机
但是,在WinNT下就不可以了,我察看过API参考,说是必须用另一个API先获得权限
然后才能使用ExitWindowsEx,我不会呀,对WinNT的权限问题了解太少了请诸位高手不吝赐教谢谢!!
MailTo:[email protected]

解决方案 »

  1.   

    http://wlbookwl.myrice.com/jck/1206exit.htm
      

  2.   

    参考:
    http://expert.csdn.net/Expert/topic/1454/1454119.xml?temp=.1092188
      

  3.   

    转载:关闭Windows所调用的API函数是ExitWindowsEx,而WinNT/2000基于安全性的考虑,必须先以AdjustTokenPrivileges API函数设置安全级别,才能关机。
    例:
    在BAS文件中定义
    Option Explicit 
    Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long'ExitWindowsEx的参数uflags,有四个对应值,分别是:Public Const EWX_LOGOFF = 0 '退出(注销)
    Public Const EWX_SHUTDOWN = 1 '关机
    Public Const EWX_REBOOT = 2 '重启动
    Public Const EWX_FORCE = 4 '强制关机,即不通知现在活动应用程序让其先自我关闭Public Const TOKEN_ADJUST_PRIVILEGES = &H20
    Public Const TOKEN_QUERY = &H8
    Public Const SE_PRIVILEGE_ENABLED = &H2
    Public Const ANYSIZE_ARRAY = 1Type LUID
    lowpart As Long
    highpart As Long
    End TypeType LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
    End TypeType TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End TypeDeclare Function GetCurrentProcess Lib "kernel32" () As Long
    Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long'这个函数就是用于NT关机中使用的
    Sub AdjustTokenPrivilegesForNT()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 LonghdlProcessHandle = GetCurrentProcess()
    OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or _
    TOKEN_QUERY), hdlTokenHandleLookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
    tkp.PrivilegeCount = 1
    tkp.Privileges(0).pLuid = tmpLuid
    tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLEDAdjustTokenPrivileges hdlTokenHandle, False, tkp, _
    Len(tkpNewButIgnored), tkpNewButIgnored, _
    lBufferNeeded
    End Sub在Form中调用如下:
    Option ExplicitDim uFlags As LongPrivate Sub Command1_Click()
    AdjustTokenPrivilegesForNT '在95/98中调用没作用,但为了和NT兼容,写上无妨
    ExitWindowsEx uFlags, 0 '这里将uFlgs换成以上面标记蓝色字中所提到的四个参数之一即可
    '下面为举例
        'ExitWindowsEx EWX_FORCE, 0 强迫关机(就是不管有无要保存的东西而强行关闭)    'ExitWindowsEx EWX_LOGOFF, 0 退出(注销)
    End Sub