VB6实现枚举进程所拥有的特权

来源:互联网 发布:python cv 保存图片 编辑:程序博客网 时间:2024/06/06 04:48

特权嘛,当然就是特殊权限了。至于什么是进程的特殊权限,请参考MSDN。
提升进程权限的方法请参考笔者的《Win32汇编实现提升进程Debug权限的两种方法》一文,可以很容易修改成提供进程其他权限的程序。本文的内容是枚举进程中所有的特殊权限,以数组的方式返回权限值。每个权限值具体代表了什么,从变量的名称可考究一二,不明白的地方还是参考MSDN。
(声明:魏滔序原创,转贴请注明出处。)

代码及示例如下:

'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'
 VB6实现枚举进程所拥有的特权
'
 Programmed by 魏滔序
'
 WebSite: http://www.chenoe.com
'
 Blog: http://blog.csdn.net/Modest
'
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Option Explicit

Private Const ANYSIZE_ARRAY As Long = 100
Private Const TokenPrivileges = 3
Private Const TOKEN_QUERY = &H8

Private Type LUID
    lowpart 
As Long
    highpart 
As Long
End Type

Private Type LUID_AND_ATTRIBUTES
    pLuid 
As LUID
    Attributes 
As Long
End Type

Private Type TOKEN_PRIVILEGES
    PrivilegeCount 
As Long
    Privileges(ANYSIZE_ARRAY) 
As LUID_AND_ATTRIBUTES
End Type

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "Advapi32" (ByVal ProcessHandle As LongByVal DesiredAccess As Long, TokenHandle As LongAs Long
Private Declare Function GetTokenInformation Lib "Advapi32" (ByVal TokenHandle As Long, TokenInformationClass As Integer, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As LongAs Long
Private Declare Function RtlMoveMemory Lib "kernel32" (Dest As Any, Source As Any, ByVal lSize As LongAs Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As LongAs Long

Private Function GetProcressPrivileges(ByVal hProcess As LongAs Long()
    
Dim hToken As Long
    
Dim BufferSize As Long
    
Dim InfoBuffer() As Long
    
Dim i As Long, r() As Long, x As Long
    
Dim lResult As Long
    
Dim tpTokens As TOKEN_PRIVILEGES

    
Call OpenProcessToken(hProcess, TOKEN_QUERY, hToken)
    
If hToken Then
        
Call GetTokenInformation(hToken, ByVal TokenPrivileges, 00, BufferSize)
        
If BufferSize Then

            
ReDim InfoBuffer((BufferSize  4- 1As Long
            lResult 
= GetTokenInformation(hToken, ByVal TokenPrivileges, InfoBuffer(0), BufferSize, BufferSize)

            
If lResult = 1 Then

                
Call RtlMoveMemory(tpTokens, InfoBuffer(0), LenB(tpTokens))
                
For i = 0 To tpTokens.PrivilegeCount - 1
                    
If tpTokens.Privileges(i).Attributes <> 0 Then
                        
ReDim Preserve r(x)
                        r(x) 
= tpTokens.Privileges(i).pLuid.lowpart
                        x 
= x + 1
                    
End If
                
Next
            
End If
        
End If
        
Call CloseHandle(hToken)
    
End If
    GetProcressPrivileges 
= r
End Function


'示例代码
Private Sub Form_Load()
    
Dim p() As Long, i As Long
    p 
= GetProcressPrivileges(GetCurrentProcess)
    
For i = 0 To UBound(p)
        Debug.Print p(i)
    
Next
End Sub

权限值的枚举声明如下,仅供参考:

Private Enum SE_PRIVILEGE
    SE_MIN_WELL_KNOWN_PRIVILEGE 
= 2
    SE_CREATE_TOKEN_PRIVILEGE 
= 2
    SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 
= 3
    SE_LOCK_MEMORY_PRIVILEGE 
= 4
    SE_INCREASE_QUOTA_PRIVILEGE 
= 5
    SE_MACHINE_ACCOUNT_PRIVILEGE 
= 6
    SE_TCB_PRIVILEGE 
= 7
    SE_SECURITY_PRIVILEGE 
= 8
    SE_TAKE_OWNERSHIP_PRIVILEGE 
= 9
    SE_LOAD_DRIVER_PRIVILEGE 
= 10
    SE_SYSTEM_PROFILE_PRIVILEGE 
= 11
    SE_SYSTEMTIME_PRIVILEGE 
= 12
    SE_PROF_SINGLE_PROCESS_PRIVILEGE 
= 13
    SE_INC_BASE_PRIORITY_PRIVILEGE 
= 14
    SE_CREATE_PAGEFILE_PRIVILEGE 
= 15
    SE_CREATE_PERMANENT_PRIVILEGE 
= 16
    SE_BACKUP_PRIVILEGE 
= 17
    SE_RESTORE_PRIVILEGE 
= 18
    SE_SHUTDOWN_PRIVILEGE 
= 19
    SE_DEBUG_PRIVILEGE 
= 20
    SE_AUDIT_PRIVILEGE 
= 21
    SE_SYSTEM_ENVIRONMENT_PRIVILEGE 
= 22
    SE_CHANGE_NOTIFY_PRIVILLEGE 
= 23
    SE_REMOTE_SHUTDOWN_PRIVILEGE 
= 24
    SE_UNDOCK_PRIVILEGE 
= 25
    SE_SYNC_AGENT_PRIVILEGE 
= 26
    SE_ENABLE_DELEGATION_PRIVILEGE 
= 27
    SE_MANAGE_VOLUME_PRIVILEGE 
= 28
    SE_IMPERSONATE_PRIVILEGE 
= 29
    SE_CREATE_GLOBAL_PRIVILEGE 
= 30
    SE_MAX_WELL_KNOWN_PRIVILEGE 
= SE_CREATE_GLOBAL_PRIVILEGE
End Enum