程序里如何判断操作系统当前登录用户是否属于管理员组?

frogdan 2005-03-23 07:29:37
求教!
...全文
427 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
online 2005-03-24
  • 打赏
  • 举报
回复
'试试,看看管理员组有没有这个用户即可

'引用active ds type library
'添加2个listbox,2个按钮,2个combo控件
Option Explicit
'给用户添加组
Private Sub Command2_Click()
Dim dso As IADsOpenDSObject

Dim group As IADsGroup
Dim groupname As String
Dim groupdomain As String
Dim user As IADsUser
Dim Username As String
Dim userdomain As String

groupname = List2.Text
Username = Combo1.Text

Set user = GetObject("WinNT://yang/" & Username & ",user")
Set group = GetObject("WinNT://yang/" & groupname & ",group")

group.Add (user.ADsPath)
group.SetInfo
List1.AddItem List2.Text

End Sub

Private Sub Command3_Click()

Dim Username, UserPass
Dim oDomain, oUser
Username = "user1"
UserPass = "user1"
Set oDomain = GetObject("WinNT://yang")
Set oUser = oDomain.Create("user", Username)
If (Err.Number = 0) Then

oUser.SetInfo
oUser.SetPassword UserPass
oUser.SetInfo
Else
MsgBox "创建用户" & Username & "出错!"
End If
Set oUser = Nothing
Set oDomain = Nothing


End Sub

'初始化用户名,组名
Private Sub Form_Load()
Dim dso As IADsOpenDSObject

Dim container As IADsContainer

Set container = GetObject("WinNT://yang")

container.Filter = Array("User")
Dim user As IADsUser
For Each user In container
Combo1.AddItem user.Name
Next

container.Filter = Array("Group")
Dim group As IADsGroup
For Each group In container
Combo2.AddItem group.Name
Next


container.Filter = Array("Group")
For Each group In container
List2.AddItem group.Name
Next

End Sub

'得到指定用户所在的组
Private Sub Command1_Click()
Dim dso As IADsOpenDSObject

Dim user As IADsUser
Dim Username As String
Dim userdomain As String
Dim group As IADsGroup
Dim container As IADsContainer

Username = Combo1.Text


Set container = GetObject("WinNT://yang")
Set user = GetObject("WinNT://yang/" & Username & ",user")


For Each group In user.Groups
List1.AddItem group.Name
Next
End Sub
frogdan 2005-03-24
  • 打赏
  • 举报
回复
csdn 又出 bug 了,后台管理已经给好分的了,这里就没有显示,晕倒!
cuilonggang 2005-03-24
  • 打赏
  • 举报
回复
下面这段代码采用了系统的、稳定的API实现,正是楼主所需要的,原始网址为
http://www.mentalis.org/apilist/379F19E6D02F0E3CD66CD20D92C324AD.html

Option Explicit
Private Sub Form_Load()
If IsAdmin Then
MsgBox "Your an Administrator", vbInformation, Caption
Else
MsgBox "Keep Dreaming", vbInformation, Caption
End If
End Sub

'in a module
Option Explicit
Option Base 0 ' Important assumption for this code

Private Const ANYSIZE_ARRAY = 20 'Fixed at this size for comfort. Could be bigger or made dynamic.

' Security APIs
Private Const TokenUser = 1
Private Const TokenGroups = 2
Private Const TokenPrivileges = 3
Private Const TokenOwner = 4
Private Const TokenPrimaryGroup = 5
Private Const TokenDefaultDacl = 6
Private Const TokenSource = 7
Private Const TokenType = 8
Private Const TokenImpersonationLevel = 9
Private Const TokenStatistics = 10

' Token Specific Access Rights
Private Const TOKEN_ASSIGN_PRIMARY = &H1
Private Const TOKEN_DUPLICATE = &H2
Private Const TOKEN_IMPERSONATE = &H4
Private Const TOKEN_QUERY = &H8
Private Const TOKEN_QUERY_SOURCE = &H10
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_ADJUST_GROUPS = &H40
Private Const TOKEN_ADJUST_DEFAULT = &H80

' NT well-known SIDs
Private Const SECURITY_DIALUP_RID = &H1
Private Const SECURITY_NETWORK_RID = &H2
Private Const SECURITY_BATCH_RID = &H3
Private Const SECURITY_INTERACTIVE_RID = &H4
Private Const SECURITY_SERVICE_RID = &H6
Private Const SECURITY_ANONYMOUS_LOGON_RID = &H7
Private Const SECURITY_LOGON_IDS_RID = &H5
Private Const SECURITY_LOCAL_SYSTEM_RID = &H12
Private Const SECURITY_NT_NON_UNIQUE = &H15
Private Const SECURITY_BUILTIN_DOMAIN_RID = &H20

' Well-known domain relative sub-authority values (RIDs)
Private Const DOMAIN_ALIAS_RID_ADMINS = &H220
Private Const DOMAIN_ALIAS_RID_USERS = &H221
Private Const DOMAIN_ALIAS_RID_GUESTS = &H222
Private Const DOMAIN_ALIAS_RID_POWER_USERS = &H223
Private Const DOMAIN_ALIAS_RID_ACCOUNT_OPS = &H224
Private Const DOMAIN_ALIAS_RID_SYSTEM_OPS = &H225
Private Const DOMAIN_ALIAS_RID_PRINT_OPS = &H226
Private Const DOMAIN_ALIAS_RID_BACKUP_OPS = &H227
Private Const DOMAIN_ALIAS_RID_REPLICATOR = &H228

Private Const SECURITY_NT_AUTHORITY = &H5

Type SID_AND_ATTRIBUTES
Sid As Long
Attributes As Long
End Type

Type TOKEN_GROUPS
GroupCount As Long
Groups(ANYSIZE_ARRAY) As SID_AND_ATTRIBUTES
End Type

Type SID_IDENTIFIER_AUTHORITY
Value(0 To 5) As Byte
End Type

Declare Function GetCurrentProcess Lib "Kernel32" () As Long

Declare Function GetCurrentThread Lib "Kernel32" () As Long

Declare Function OpenProcessToken Lib "Advapi32" ( _
ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
TokenHandle As Long) As Long

Declare Function OpenThreadToken Lib "Advapi32" ( _
ByVal ThreadHandle As Long, ByVal DesiredAccess As Long, _
ByVal OpenAsSelf As Long, TokenHandle As Long) As Long

Declare Function GetTokenInformation Lib "Advapi32" ( _
ByVal TokenHandle As Long, TokenInformationClass As Integer, _
TokenInformation As Any, ByVal TokenInformationLength As Long, _
ReturnLength As Long) As Long

Declare Function AllocateAndInitializeSid Lib "Advapi32" ( _
pIdentifierAuthority As SID_IDENTIFIER_AUTHORITY, _
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

Declare Function RtlMoveMemory Lib "Kernel32" ( _
Dest As Any, Source As Any, ByVal lSize As Long) As Long

Declare Function IsValidSid Lib "Advapi32" (ByVal pSid As Long) As Long

Declare Function EqualSid Lib "Advapi32" (pSid1 As Any, pSid2 As Any) As Long

Declare Sub FreeSid Lib "Advapi32" (pSid As Any)

Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long

Public Function IsAdmin() As Boolean
Dim hProcessToken As Long
Dim BufferSize As Long
Dim psidAdmin As Long
Dim lResult As Long
Dim X As Integer
Dim tpTokens As TOKEN_GROUPS
Dim tpSidAuth As SID_IDENTIFIER_AUTHORITY

IsAdmin = False
tpSidAuth.Value(5) = SECURITY_NT_AUTHORITY

' Obtain current process token
If Not OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, True, hProcessToken) Then
Call OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hProcessToken)
End If
If hProcessToken Then

' Deternine the buffer size required
Call GetTokenInformation(hProcessToken, ByVal TokenGroups, 0, 0, BufferSize) ' Determine required buffer size
If BufferSize Then
ReDim InfoBuffer((BufferSize \ 4) - 1) As Long

' Retrieve your token information
lResult = GetTokenInformation(hProcessToken, ByVal TokenGroups, InfoBuffer(0), BufferSize, BufferSize)
If lResult <> 1 Then Exit Function

' Move it from memory into the token structure
Call RtlMoveMemory(tpTokens, InfoBuffer(0), Len(tpTokens))

' Retreive the admins sid pointer
lResult = AllocateAndInitializeSid(tpSidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, _
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin)
If lResult <> 1 Then Exit Function
If IsValidSid(psidAdmin) Then
For X = 0 To tpTokens.GroupCount

' Run through your token sid pointers
If IsValidSid(tpTokens.Groups(X).Sid) Then

' Test for a match between the admin sid equalling your sid's
If EqualSid(ByVal tpTokens.Groups(X).Sid, ByVal psidAdmin) Then
IsAdmin = True
Exit For
End If
End If
Next
End If
If psidAdmin Then Call FreeSid(psidAdmin)
End If
Call CloseHandle(hProcessToken)
End If
End Function
撸大湿 2005-03-23
  • 打赏
  • 举报
回复
数据库建立一个字段XX,二进制型。当该字段为1时,该用户为管理员。当该字段为0时,该用户为普通成员
starsrainmzl 2005-03-23
  • 打赏
  • 举报
回复
友情UP

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧