如何在vB用API关闭WINNT系统
大家帮帮忙

解决方案 »

  1.   

    Option ExplicitPrivate Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_QUERY = &H8
    Private Const SE_PRIVILEGE_ENABLED = &H2
    Private Const EWX_SHUTDOWN As Long = 1
    Private Const EWX_FORCE As Long = 4
    Private Const EWX_REBOOT = 2
    Private Const EWX_POWEROFF=8Private Type LUID
      UsedPart As Long
      IgnoredForNowHigh32BitPart As Long
    End TypePrivate Type TOKEN_PRIVILEGES
      PrivilegeCount As Long
      TheLuid As LUID
      Attributes As Long
    End Type'关闭系统的API
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, _
                                                         ByVal dwReserved As Long) As Long
    '获取当前进程的一个伪句柄
    '只要当前进程需要一个进程句柄,就可以使用这个伪句柄。该句柄可以复制,但不可继承。不必调用CloseHandle函数来关闭这个句柄
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long'以下为NT/2000中和权限相关的函数
    '如果函数执行成功,返回非零。
    Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, _
                                                              ByVal DesiredAccess As Long, _
                                                              TokenHandle As Long) As Long
    '查看权限的函数
    Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" _
                                                 (ByVal lpSystemName As String, _
                                                  ByVal lpName As String, lpLuid As LUID) As Long
    '设置权限的函数
    Private Declare Function AdjustTokenPrivileges Lib "advapi32" (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
    Sub ExitSystem()  Dim hProcessHandle As Long
      Dim hTokenHandle As Long
      Dim tmpLuid As LUID
      Dim tkpNew As TOKEN_PRIVILEGES
      Dim tkpPrevious As TOKEN_PRIVILEGES
      Dim lBufferNeeded As Long  hProcessHandle = GetCurrentProcess()
      Call OpenProcessToken(hProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hTokenHandle)  Call LookupPrivilegeValue("", "SeShutdownPrivilege", tmpLuid)  tkpNew.PrivilegeCount = 1
      tkpNew.TheLuid = tmpLuid
      tkpNew.Attributes = SE_PRIVILEGE_ENABLED  lBufferNeeded = 0
      Call AdjustTokenPrivileges(hTokenHandle, False, tkpNew, Len(tkpPrevious), tkpPrevious, lBufferNeeded)  Call ExitWindowsEx(EWX_POWEROFF, &O0)End Sub
      

  2.   

    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
      

  3.   

    SHELL 的扩充用法:
    命令: rundll32.exe user.exe,exitwindows
      功能: 强行关闭所有程式并关机。命令: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
      功能: 显示“拨号属性”选项视窗。。