代码之家  ›  专栏  ›  技术社区  ›  Ian manuel aldana

VB6中的CheckTokenMembership

  •  0
  • Ian manuel aldana  · 技术社区  · 16 年前

    我很难把这个C++代码转换成VB6代码。我在网上搜索了一下,什么也没找到。PInvoke.net仅引用VB.net代码。以下是MSDN的代码:

    BOOL IsUserAdmin(VOID)
    /*++ 
    Routine Description: This routine returns TRUE if the caller's
    process is a member of the Administrators local group. Caller is NOT
    expected to be impersonating anyone and is expected to be able to
    open its own process and process token. 
    Arguments: None. 
    Return Value: 
       TRUE - Caller has Administrators local group. 
       FALSE - Caller does not have Administrators local group. --
    */ 
    {
    BOOL b;
    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup; 
    b = AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &AdministratorsGroup); 
    if(b) 
    {
        if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) 
        {
             b = FALSE;
        } 
        FreeSid(AdministratorsGroup); 
    }
    
    return(b);
    }
    

    如果有人能帮忙把它转换成VB6代码,那就太好了。

    谢谢

    我本来打算使用这个函数,但MSDN说:“这个函数是CheckTokenMembership的包装。建议直接调用该函数以确定管理员组状态,而不是调用IsUserAnAdmin。”

    3 回复  |  直到 16 年前
        1
  •  2
  •   wqw    16 年前

    试试这个

    Option Explicit
    
    Private Const SECURITY_BUILTIN_DOMAIN_RID       As Long = &H20
    Private Const DOMAIN_ALIAS_RID_ADMINS           As Long = &H220
    
    Private Declare Function AllocateAndInitializeSid Lib "advapi32.dll" (pIdentifierAuthority As Any, ByVal nSubAuthorityCount As Byte, ByVal nSubAuthority0 As Long, ByVal nSubAuthority1 As Long, ByVal nSubAuthority2 As Long, ByVal nSubAuthority3 As Long, ByVal nSubAuthority4 As Long, ByVal nSubAuthority5 As Long, ByVal nSubAuthority6 As Long, ByVal nSubAuthority7 As Long, lpPSid As Long) As Long
    Private Declare Sub FreeSid Lib "advapi32.dll" (ByVal pSid As Long)
    Private Declare Function CheckTokenMembership Lib "advapi32.dll" (ByVal hToken As Long, ByVal pSidToCheck As Long, pbIsMember As Long) As Long
    
    Private Type SID_IDENTIFIER_AUTHORITY
        Value(0 To 5)            As Byte
    End Type
    
    Private Function pvIsAdmin() As Boolean
        Dim uAuthNt         As SID_IDENTIFIER_AUTHORITY
        Dim pSidAdmins      As Long
        Dim lResult         As Long
    
        uAuthNt.Value(5) = 5
        If AllocateAndInitializeSid(uAuthNt, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, pSidAdmins) <> 0 Then
            If CheckTokenMembership(0, pSidAdmins, lResult) <> 0 Then
                pvIsAdmin = (lResult <> 0)
            End If
            Call FreeSid(pSidAdmins)
        End If
    End Function
    
        2
  •  2
  •   MarkJ    16 年前

    你已经发布了 MSDN sample code for CheckTokenMembership -它使用CheckTokenMembership来确定用户是否是管理员。

    IsUserAnAdmin ,它是CheckTokenMembership的包装。MSDN文档确实如此 say IsUserAnAdmin已被弃用,但它比CheckTokenMembership更容易调用。

    Private Declare Function IsUserAnAdmin Lib "Shell32" Alias "#680" () As Integer
    If IsUserAnAdmin() = 0 Then 
      MsgBox "Not admin" 
    Else 
      MsgBox "Admin" 
    End If
    
        3
  •  1
  •   Anand Shah    16 年前

    Private Declare Function IsUserAdmin Lib "Shell32" Alias "#680" () As Boolean
    
    Private Sub Form_Load()
       If IsUserAdmin Then MsgBox "User is Admin"
    End Sub