VB6实现枚举进程所拥有的特权(增强版)

本文介绍了一种使用VB6来枚举当前进程所拥有的系统特权的方法,并提供了完整的示例代码。通过调用Windows API函数,实现了获取并解析进程特权的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文参见:http://blog.youkuaiyun.com/Modest/archive/2008/03/07/2156291.aspx 
本文在原文基础上增加了两个转换函数LookupPrivilegeName和LookupPrivilegeDisplayName,从而可以完美的输出权限的名称和权限的描述。
(声明:魏滔序原创,转贴请注明出处。)

' ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'
 VB6实现枚举进程所拥有的特权(增强版)
'
 Programmed by 魏滔序
'
 WebSite: http://www.chenoe.com
'
 Blog: http://blog.youkuaiyun.com/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  Type PRIVILEGE
    lValue  
As   Long
    sName   
As   String
    sDisplay 
As   String
End  Type

Private  Declare  Function  GetCurrentProcess Lib  " kernel32 "  ()  As   Long
Private  Declare  Function  OpenProcessToken Lib  " Advapi32 "  (ByVal ProcessHandle  As   Long , ByVal DesiredAccess  As   Long , TokenHandle  As   Long As   Long
Private  Declare  Function  GetTokenInformation Lib  " Advapi32 "  (ByVal TokenHandle  As   Long , TokenInformationClass  As   Integer , TokenInformation  As  Any, ByVal TokenInformationLength  As   Long , ReturnLength  As   Long As   Long
Private  Declare  Function  RtlMoveMemory Lib  " kernel32 "  (Dest  As  Any, Source  As  Any, ByVal lSize  As   Long As   Long
Private  Declare  Function  CloseHandle Lib  " kernel32 "  (ByVal hObject  As   Long As   Long
Private  Declare  Function  LookupPrivilegeName Lib  " advapi32.dll "  Alias  " LookupPrivilegeNameA "  (ByVal lpSystemName  As   String , ByRef lpLuid  As  LUID, ByVal lpName  As   String , ByRef cbName  As   Long As   Long
Private  Declare  Function  LookupPrivilegeDisplayName Lib  " advapi32.dll "  Alias  " LookupPrivilegeDisplayNameA "  (ByVal lpSystemName  As   String , ByVal lpName  As   String , ByVal lpDisplayName  As   String , ByRef cbDisplayName  As   Long , ByRef lpLanguageID  As   Long As   Long

Private   Function  GetProcressPrivileges(ByVal hProcess  As   Long , Optional ByRef LanguageID  As   Long   =   0 As  PRIVILEGE()
    
Dim  hToken  As   Long
    
Dim  BufferSize  As   Long
    
Dim  InfoBuffer()  As   Long
    
Dim  i  As   Long , r()  As  PRIVILEGE, x  As   Long
    
Dim  lResult  As   Long
    
Dim  tpTokens  As  TOKEN_PRIVILEGES
    
Dim  s  As   String
    
    
Call  OpenProcessToken(hProcess, TOKEN_QUERY, hToken)
    
If  hToken  Then
        
Call  GetTokenInformation(hToken, ByVal TokenPrivileges,  0 0 , BufferSize)
        
If  BufferSize  Then

            
ReDim  InfoBuffer((BufferSize    4 -   1 As   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
                        s 
=   String ( 256 0 )
                        LookupPrivilegeName vbNullString, tpTokens.Privileges(i).pLuid, s, 
Len (s)
                        
ReDim  Preserve r(x)
                        r(x).lValue 
=  tpTokens.Privileges(i).pLuid.lowpart
                        r(x).sName 
=   Replace (s, vbNullChar, vbNullString)
                        s 
=   String ( 256 0 )
                        LookupPrivilegeDisplayName vbNullString, r(x).sName, s, 
Len (s), LanguageID
                        r(x).sDisplay 
=   Replace (s, vbNullChar, vbNullString)
                        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  PRIVILEGE, i  As   Long
    p 
=  GetProcressPrivileges(GetCurrentProcess)
    
For  i  =   0   To   UBound (p)
        Debug.Print p(i).lValue, p(i).sName, p(i).sDisplay
    
Next
End Sub

上述代码输出结果如下(会因权限不同而异):
 23           SeChangeNotifyPrivilege     跳过遍历检查
 10           SeLoadDriverPrivilege       装载和卸载设备驱动程序
 25           SeUndockPrivilege           从插接工作站中取出计算机
 29           SeImpersonatePrivilege      身份验证后模拟客户端
 30           SeCreateGlobalPrivilege     创建全局对象
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值