Winapi VB6中的CheckTokenMembership 我很难把这个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); }

Winapi VB6中的CheckTokenMembership 我很难把这个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); },winapi,vb6,Winapi,Vb6,如果有人能帮忙把它转换成VB6代码,那就太好了 谢谢 编辑: 我本来打算使用该函数,但MSDN说:“此函数是CheckTokenMembership的包装。建议直接调用该函数来确定管理员组状态,而不是调用IsUserAnAdmin。”除非有理由转换代码,否则请使用API Private Declare Function IsUserAdmin Lib "Shell32" Alias "#680" () As Boolean Private Sub Form_Load() If IsUse

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

谢谢

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

除非有理由转换代码,否则请使用API

Private Declare Function IsUserAdmin Lib "Shell32" Alias "#680" () As Boolean

Private Sub Form_Load()
   If IsUserAdmin Then MsgBox "User is Admin"
End Sub

除非有理由转换代码,否则请使用API

Private Declare Function IsUserAdmin Lib "Shell32" Alias "#680" () As Boolean

Private Sub Form_Load()
   If IsUserAdmin Then MsgBox "User is Admin"
End Sub
您已经发布了-它使用CheckTokenMembership来确定用户是否是管理员

在VB6中更易于使用,它是CheckTokenMembership的包装。MSDN docs do IsUserAnAdmin已被弃用,但它比CheckTokenMembership更容易调用

Private Declare Function IsUserAnAdmin Lib "Shell32" Alias "#680" () As Integer
If IsUserAnAdmin() = 0 Then 
  MsgBox "Not admin" 
Else 
  MsgBox "Admin" 
End If
您已经发布了-它使用CheckTokenMembership来确定用户是否是管理员

在VB6中更易于使用,它是CheckTokenMembership的包装。MSDN docs do IsUserAnAdmin已被弃用,但它比CheckTokenMembership更容易调用

Private Declare Function IsUserAnAdmin Lib "Shell32" Alias "#680" () As Integer
If IsUserAnAdmin() = 0 Then 
  MsgBox "Not admin" 
Else 
  MsgBox "Admin" 
End If
试试这个

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
选项显式
私有Const SECURITY\u内置\u域\u RID As Long=&H20
Private Const DOMAIN_ALIAS_RID_ADMINS As Long=&H220
专用声明函数AllocateAndInitializeSid库“advapi32.dll”(pIdentifierAuthority为任意,ByVal NSUBauthority为字节,ByVal NSUBauthority为长0,ByVal NSUBauthority为长1,ByVal NSUBauthority为长2,ByVal NSUBauthority为长3,ByVal NSUBauthority为长4,ByVal NSUBauthority为长5,ByVal NSUBauthority为长6,ByVal NSUBauthority为长7,lpPSid为长)为长
私有声明子FreeSid库“advapi32.dll”(ByVal pSid长度)
私有声明函数CheckTokenMembership Lib“advapi32.dll”(ByVal hToken为Long,ByVal pSidToCheck为Long,pbIsMember为Long)为Long
私有类型SID\u标识符\u权限
值(0到5)作为字节
端型
作为布尔值的私有函数pvIsAdmin()
作为SID\u标识符\u权限的权限
暗的和长的一样
暗淡的结果就像长的一样
uAuthNt.值(5)=5
如果AllocateAndInitializeSid(uAuthNt,2,安全性\内置\域\ RID,域\别名\ RID\管理员,0,0,0,0,0,0,0,pSidAdmins)为0,则
如果CheckTokenMembership(0,pSidAdmins,lResult)为0,则
pvIsAdmin=(lResult 0)
如果结束
呼叫自由ID(pSidAdmins)
如果结束
端函数
试试这个

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
选项显式
私有Const SECURITY\u内置\u域\u RID As Long=&H20
Private Const DOMAIN_ALIAS_RID_ADMINS As Long=&H220
专用声明函数AllocateAndInitializeSid库“advapi32.dll”(pIdentifierAuthority为任意,ByVal NSUBauthority为字节,ByVal NSUBauthority为长0,ByVal NSUBauthority为长1,ByVal NSUBauthority为长2,ByVal NSUBauthority为长3,ByVal NSUBauthority为长4,ByVal NSUBauthority为长5,ByVal NSUBauthority为长6,ByVal NSUBauthority为长7,lpPSid为长)为长
私有声明子FreeSid库“advapi32.dll”(ByVal pSid长度)
私有声明函数CheckTokenMembership Lib“advapi32.dll”(ByVal hToken为Long,ByVal pSidToCheck为Long,pbIsMember为Long)为Long
私有类型SID\u标识符\u权限
值(0到5)作为字节
端型
作为布尔值的私有函数pvIsAdmin()
作为SID\u标识符\u权限的权限
暗的和长的一样
暗淡的结果就像长的一样
uAuthNt.值(5)=5
如果AllocateAndInitializeSid(uAuthNt,2,安全性\内置\域\ RID,域\别名\ RID\管理员,0,0,0,0,0,0,0,pSidAdmins)为0,则
如果CheckTokenMembership(0,pSidAdmins,lResult)为0,则
pvIsAdmin=(lResult 0)
如果结束
呼叫自由ID(pSidAdmins)
如果结束
端函数

那你到底为什么要转换代码?@Anand:我不明白。我应该先转换它,以便在VB中使用它,对吗?不。你已经完成了艰苦的工作:)你只要调用API,看看下面我或@MarkJ的答案,你为什么要转换代码?@Anand:我不明白。我应该先转换它,以便在VB中使用它,对吗?不。微软的人已经为你做了艰苦的工作:)了。您只需调用API,请参阅下面My或@MarkJ的答案。WI最初打算使用该函数,但MSDN说:“此函数是CheckTokenMembership的包装。建议直接调用该函数来确定管理员组状态,而不是调用IsUserAnAdmin。”是的,正如我在回答中所说,它已被弃用。但是打电话很容易——我必须承认我正在使用它,如果他们真的把它拿走了,我会解决问题的。希望Raymond Chen不会让他们把它拿出来:)谷歌建议这是为了成为VB6 CheckToken会员,但我的健康警告是:我总是怀疑讨论组上发布的API代码。它经常有缺陷。我本来打算使用这个函数,但MSDN说:“这个函数是CheckTokenMembership的包装器。建议直接调用该函数来确定管理员组状态,而不是调用IsUserAnAdmin。”是的,正如我在回答中所说的,它被弃用了。但是打电话很容易——我必须承认我正在使用它,如果他们真的把它拿走了,我会解决问题的。希望Raymond Chen不会让他们把它拿出来:)谷歌建议这是为了成为VB6 CheckToken会员,但我的健康警告是:我总是怀疑讨论组上发布的API代码。它经常有缺陷。你知道为什么FreeID调用会使Windows 7和Windows Server 2008中的应用程序崩溃吗?@Ian:检查API函数-ByVal pSid As long的声明你知道为什么FreeID调用会使Windows 7中的应用程序崩溃并获胜吗