gpt4 book ai didi

asp.net - 如何最好地递归查询 ASP.NET 中的 AD 组成员身份(使用 vb)

转载 作者:行者123 更新时间:2023-12-03 20:37:55 26 4
gpt4 key购买 nike

我正在尝试通过以下两种方式之一找到查询 Active Directory 的最简单方法:

  • 给定一个 AD 用户名,找到该用户所属的所有组(包括嵌套组)。
  • 给定 AD 组名称,查找属于该组的所有用户(包括嵌套组中的用户)。

  • 我的应用程序在 v4.0 框架上的 VB.NET 中。我查看了来自许多不同 Google 搜索结果的建议,其中一些使用了 LDAP 和 System.DirectoryServices.DirectorySearcher(我认为这可能是最佳途径)。

    但是我正在旋转我的轮子并正在寻找代码示例。

    谢谢你。

    更新:

    我已经准备好了这些部分:
    <add assembly="System.DirectoryServices, Version=3.5.0.0, etc."/> <add namespace="System.DirectoryServices.AccountManagement" />Imports System.DirectoryServices.AccountManagement
    在这行代码上:
    Dim ctx As New PrincipalContext(ContextType.Domain)
    我仍然收到此错误:未定义类型“PrincipalContext”

    当您提到“using 语句”时,我假设您的意思是我需要引用此命名空间。或者你的意思是我应该做这样的事情?
    Using ctx As New PrincipalContext(ContextType.Domain)

    最佳答案

    一个完整的例子

    此代码将通过枚举给定的组名列出组和子组中的所有用户。
    此外,如果启用/禁用用户帐户。

    要使用,只需调用 ListADGroupMembers("Some_Group_Name")。
    这会将用户的全名和手机号码填充到一个数组中,然后您可以循环遍历该数组。

    操作起来非常简单,只需通读一遍即可。

    Public ADUSers(,) As String
    Public n As Integer = 0

    Public Sub ListADGroupMembers(ByVal GN As String)

    Dim DirectoryRoot As New DirectoryEntry("LDAP://RootDSE")
    Dim DNC = DirectoryRoot.Properties("DefaultNamingContext")(0).ToString()
    Dim GroupName As String = GN '"G_All_IT_Users"
    Dim GroupMembers As System.Collections.Specialized.StringCollection = GetGroupMembers(DNC, GroupName)
    'Dim GroupMembersMobile As System.Collections.Specialized.StringCollection = GetGroupMembers(DNC, GroupName)
    ' For Each Member As String In GroupMembers
    ' ListBox1.Items.Add(Member)
    'Next Member

    End Sub

    Public Function GetGroupMembers(ByVal strDomain As String, ByVal strGroup As String) As System.Collections.Specialized.StringCollection

    Dim GroupMembers As New System.Collections.Specialized.StringCollection()

    Try
    Dim DirectoryRoot As New DirectoryEntry("LDAP://" & strDomain)
    Dim DirectorySearch As New DirectorySearcher(DirectoryRoot, "(CN=" & strGroup & ")")
    Dim DirectorySearchCollection As SearchResultCollection = DirectorySearch.FindAll()
    For Each DirectorySearchResult As SearchResult In DirectorySearchCollection
    Dim ResultPropertyCollection As ResultPropertyCollection = DirectorySearchResult.Properties
    Dim GroupMemberDN As String
    For Each GroupMemberDN In ResultPropertyCollection("member")
    Dim DirectoryMember As New DirectoryEntry("LDAP://" & GroupMemberDN)
    Dim DirectoryMemberProperties As System.DirectoryServices.PropertyCollection = DirectoryMember.Properties
    Dim DirectoryItem As Object = DirectoryMemberProperties("sAMAccountName").Value
    Dim DirectoryPhone As Object = DirectoryMemberProperties("mobile").Value
    Dim uac As Object = DirectoryMemberProperties("userAccountControl").Value

    If DirectoryMember.SchemaClassName = "group" Then
    ' this is a group.
    ListADGroupMembers(DirectoryItem)
    End If

    If DirectoryMember.SchemaClassName = "user" Then
    ' this is a user.
    If Nothing IsNot DirectoryItem Then
    If AccEnabled(uac) = 1 Then ' check the ad account is enabled
    GroupMembers.Add(DirectoryItem.ToString())
    ListBox1.Items.Add(DirectoryItem.ToString() & " " & DirectoryPhone)

    ADUSers(0, n) = DirectoryItem.ToString()
    ADUSers(1, n) = DirectoryPhone
    n += 1
    ReDim Preserve ADUSers(1, n)
    End If
    End If
    End If

    Next GroupMemberDN

    Next DirectorySearchResult
    Catch ex As Exception
    MsgBox(ex.Message)
    End Try

    Return GroupMembers



    End Function




    ' check account is active or not.
    Function AccEnabled(ByVal uac As String) As String

    Dim aret As Integer = 0
    Select Case uac
    Case 512 'Enabled
    aret = 1
    Case 514 ': ACCOUNTDISABLE()
    aret = 0
    Case 528 ': Enabled(-LOCKOUT)
    aret = 1
    Case 530 ': ACCOUNTDISABLE(-LOCKOUT)
    aret = 0
    Case 544 ': Enabled(-PASSWD_NOTREQD)
    aret = 1
    Case 546 ': ACCOUNTDISABLE(-PASSWD_NOTREQD)
    aret = 0
    Case 560 ': Enabled(-PASSWD_NOTREQD - LOCKOUT)
    aret = 1
    Case 640 ': Enabled(-ENCRYPTED_TEXT_PWD_ALLOWED)
    aret = 1
    Case 2048 ' : INTERDOMAIN_TRUST_ACCOUNT()
    aret = 1
    Case 2080 ': INTERDOMAIN_TRUST_ACCOUNT(-PASSWD_NOTREQD)
    aret = 1
    Case 4096 ': WORKSTATION_TRUST_ACCOUNT()
    aret = 1
    Case 8192 ': SERVER_TRUST_ACCOUNT()
    aret = 1
    Case 66048 ': Enabled(-DONT_EXPIRE_PASSWORD)
    aret = 1
    Case 66050 ': ACCOUNTDISABLE(-DONT_EXPIRE_PASSWORD)
    aret = 0
    Case 66064 ': Enabled(-DONT_EXPIRE_PASSWORD - LOCKOUT)
    aret = 1
    Case 66066 ': ACCOUNTDISABLE(-DONT_EXPIRE_PASSWORD - LOCKOUT)
    aret = 0
    Case 66080 ': Enabled(-DONT_EXPIRE_PASSWORD - PASSWD_NOTREQD)
    aret = 1
    Case 66082 ': ACCOUNTDISABLE(-DONT_EXPIRE_PASSWORD - PASSWD_NOTREQD)
    aret = 0
    Case 66176 ': Enabled(-DONT_EXPIRE_PASSWORD - ENCRYPTED_TEXT_PWD_ALLOWED)
    aret = 1
    Case 131584 ': Enabled(-MNS_LOGON_ACCOUNT)
    aret = 1
    Case 131586 ': ACCOUNTDISABLE(-MNS_LOGON_ACCOUNT)
    aret = 0
    Case 131600 ': Enabled(-MNS_LOGON_ACCOUNT - LOCKOUT)
    aret = 1
    Case 197120 ': Enabled(-MNS_LOGON_ACCOUNT - DONT_EXPIRE_PASSWORD)
    aret = 1
    Case 532480 'SERVER_TRUST_ACCOUNT - TRUSTED_FOR_DELEGATION (Domain Controller)
    aret = 1
    Case 1049088 ': Enabled(-NOT_DELEGATED)
    aret = 1
    Case 1049090 ': ACCOUNTDISABLE(-NOT_DELEGATED)
    aret = 0
    Case 2097664 ': Enabled(-USE_DES_KEY_ONLY)
    aret = 1
    Case 2687488 ': Enabled(-DONT_EXPIRE_PASSWORD - TRUSTED_FOR_DELEGATION - USE_DES_KEY_ONLY)
    aret = 1
    Case 4194816 ': Enabled(-DONT_REQ_PREAUTH)
    aret = 1
    Case Else
    aret = 0
    End Select

    AccEnabled = aret

    End Function

    关于asp.net - 如何最好地递归查询 ASP.NET 中的 AD 组成员身份(使用 vb),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13059616/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com