首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

AdjustTokenPrivileges获取权限实现关机有关问题

2013-10-11 
AdjustTokenPrivileges获取权限实现关机问题Option ExplicitPublic Declare Function GetCurrentProcess L

AdjustTokenPrivileges获取权限实现关机问题

Option Explicit
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function OpenProcessToken Lib "advapi32.dll" _
(ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) _
As Long
Public Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) _
As Long

Public 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

Public Declare Function ExitWindowsEx Lib "user32" _
(ByVal uFlags As Long, ByVal dwReserved As Long) As Long
'----------------------------------------------
'ExitWindowsEX常数
Public Const EWX_FORCE = 4
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1
'-----------------------------------------------
Public Const SE_SECURITY_NAME = "SeSecurityPrivilege"
Public Const SE_PRIVILEGE_ENABLED = &H2
Public Const TOKEN_ADJUST_PRIVILEGES = &H20
'----------------------------------------------
Public Type LARGE_INTEGER
    lowpart As Long
    highpart As Long
End Type

Public Type LARGE_INTEGER_AND_ATTRIBUTES
        pLuid As LARGE_INTEGER
        Attributes As Long
End Type

Public Type TOKEN_PRIVILEGES
    PrivilegeCount As Integer
    Privileges As LARGE_INTEGER_AND_ATTRIBUTES
End Type

Private Sub Command1_Click()
  Dim jieshou As Long
  Dim jieshou1 As Long
  Dim q As TOKEN_PRIVILEGES
  Dim w As LARGE_INTEGER
  Dim Privileges As TOKEN_PRIVILEGES
  Dim e As Long
  Dim PrevNeed As Long
  
  q.PrivilegeCount = 1
  q.Privileges.Attributes = SE_PRIVILEGE_ENABLED
  q.Privileges.pLuid = w
  e = Len(Privileges)
  jieshou1 = OpenProcessToken(GetCurrentProcess(), SE_SECURITY_NAME, jieshou)
  AdjustTokenPrivileges jieshou1, False, q, e                            '最后那个参数应该怎么放啊?            
  ExitWindowsEx 0, EWX_LOGOFF
End Sub


 AdjustTokenPrivileges jieshou1, False, q, e     最后那个参数应该怎么放啊? 我定义一个长整形变量然后直接放到e后面去,直接出现ByRef参数类型不符合 
或者还是说我程序其他地方有错?  求大牛指导 vb 函数
[解决办法]
引用:
Quote: 引用:

前边的声明什么的就不写了...

Public Sub AdjustToken()
'********************************************************************
'* 这个过程设置正确的优先权,以允许在Windows NT下关机或者重新启动。
'********************************************************************
    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
    
    '使用SetLastError函数设置错误代码为0。
    '这样做,GetLastError函数如果没有错误会返回0
    SetLastError 0
    ' GetCurrentProcess函数设置 hdlProcessHandle变量


    hdlProcessHandle = GetCurrentProcess()
    OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle
    ' 获得关机优先权的LUID
    LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
    tkp.PrivilegeCount = 1 ' 设置一个优先权
    tkp.TheLuid = tmpLuid
    tkp.Attributes = SE_PRIVILEGE_ENABLED
    ' 对当前进程使能关机优先权
    AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
End Sub

  丢代码来没用啊,你都没告诉我怎么回事

自己代码参数个数不一样你都没看出来?

热点排行