{"id":764,"date":"2025-10-28T22:24:34","date_gmt":"2025-10-28T21:24:34","guid":{"rendered":"https:\/\/www.silverice.it\/IpercubeTechWP1\/?page_id=764"},"modified":"2025-10-28T22:24:34","modified_gmt":"2025-10-28T21:24:34","slug":"adgetallusersfromgroupspattern","status":"publish","type":"page","link":"https:\/\/www.silverice.it\/IpercubeTechWP1\/ipercube-utilities\/active-directory-functions\/adgetallusersfromgroupspattern\/","title":{"rendered":"Get All Users From Groups Pattern"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Retrieves all user accounts that are members of Active Directory groups whose names match the specified pattern.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uses a\u00a0<strong>DirectoryServices.AccountManagement.PrincipalSearcher<\/strong>\u00a0and\u00a0<strong>DirectoryServices.AccountManagement.GroupPrincipal<\/strong>\u00a0to identify groups matching the specified pattern.<\/li>\n\n\n\n<li>For each matching group, calls\u00a0<strong>iuADFunctions.adGetAllGroupUsers(String,String,String,String)<\/strong>\u00a0to get the users and adds them to the result list.<\/li>\n\n\n\n<li>Removes duplicate users based on DistinguishedName by using a custom\u00a0<strong>iuADFunctions.adUserPrincipalComparer<\/strong>\u00a0comparer.<\/li>\n\n\n\n<li>Any errors during retrieval of group members for a specific group are logged and do not stop the process.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:75%\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column page-snippet is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Geist-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-Geist-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">VB<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>    Public Function adGetAllUsersFromGroupsPattern(groupPattern As String, \n                                                   domain As String, \n                                                   username As String, \n                                                   password As String) As List(Of UserPrincipal)\n                                                   \n        Dim allUsers As New List(Of UserPrincipal)()\n\n        ' Create the PrincipalContext\n        Dim context As New PrincipalContext(ContextType.Domain, domain, username, password)\n\n        ' Create a GroupPrincipal filter using the name pattern\n        Dim groupFilter As New GroupPrincipal(context)\n        groupFilter.Name = groupPattern\n\n        ' Use PrincipalSearcher to find all matching groups\n        Dim searcher As New PrincipalSearcher(groupFilter)\n        Dim groups As List(Of GroupPrincipal) = searcher.FindAll().OfType(Of GroupPrincipal)().ToList()\n\n        ' For each matching group, call the existing function and merge the results\n        For Each group As GroupPrincipal In groups\n            Dim groupDN As String = group.DistinguishedName\n\n            Try\n                Dim users = adGetAllGroupUsers(groupDN, domain, username, password)\n                allUsers.AddRange(users)\n            Catch ex As Exception\n                ' Log error and continue with the next group\n                Debug.WriteLine($\"Error for group {groupDN}: {ex.Message}\")\n            End Try\n        Next\n\n        ' Remove duplicate users based on DistinguishedName\n        allUsers = allUsers.Distinct(New adUserPrincipalComparer()).ToList()\n\n        Return allUsers\n    End Function<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public Function <\/span><span style=\"color: #DCDCAA\">adGetAllUsersFromGroupsPattern<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">groupPattern<\/span><span style=\"color: #D4D4D4\"> As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                                   domain As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                                   username As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                                   password As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">) As <\/span><span style=\"color: #4EC9B0\">List<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">UserPrincipal<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                                   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> allUsers <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">List<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">UserPrincipal<\/span><span style=\"color: #D4D4D4\">)()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; Create the PrincipalContext<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> context <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">PrincipalContext<\/span><span style=\"color: #D4D4D4\">(ContextType.Domain,<\/span><span style=\"color: #9CDCFE\"> domain<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> username<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> password<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; Create a GroupPrincipal filter using the name pattern<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> groupFilter <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">GroupPrincipal<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">context<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        groupFilter.<\/span><span style=\"color: #9CDCFE\">Name<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #9CDCFE\"> groupPattern<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; Use PrincipalSearcher to find all matching groups<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> searcher <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">PrincipalSearcher<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">groupFilter<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> groups <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">List<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">GroupPrincipal<\/span><span style=\"color: #D4D4D4\">) = searcher.<\/span><span style=\"color: #DCDCAA\">FindAll<\/span><span style=\"color: #D4D4D4\">().<\/span><span style=\"color: #DCDCAA\">OfType<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">GroupPrincipal<\/span><span style=\"color: #D4D4D4\">)().<\/span><span style=\"color: #DCDCAA\">ToList<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; For each matching group, call the existing function and merge the results<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">For<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Each<\/span><span style=\"color: #D4D4D4\"> group As <\/span><span style=\"color: #4EC9B0\">GroupPrincipal<\/span><span style=\"color: #D4D4D4\"> In groups<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> groupDN <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = group.DistinguishedName<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Try<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> users <\/span><span style=\"color: #D4D4D4\">= <\/span><span style=\"color: #DCDCAA\">adGetAllGroupUsers<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">groupDN<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> domain<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> username<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> password<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                allUsers.<\/span><span style=\"color: #DCDCAA\">AddRange<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">users<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Catch ex As <\/span><span style=\"color: #4EC9B0\">Exception<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #6A9955\">&#39; Log error and continue with the next group<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                Debug.<\/span><span style=\"color: #DCDCAA\">WriteLine<\/span><span style=\"color: #D4D4D4\">($<\/span><span style=\"color: #CE9178\">&quot;Error for group {groupDN}: {ex.Message}&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">End<\/span><span style=\"color: #D4D4D4\"> Try<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Next<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; Remove duplicate users based on DistinguishedName<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">allUsers<\/span><span style=\"color: #D4D4D4\"> = allUsers.<\/span><span style=\"color: #DCDCAA\">Distinct<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">New <\/span><span style=\"color: #DCDCAA\">adUserPrincipalComparer<\/span><span style=\"color: #D4D4D4\">()).<\/span><span style=\"color: #DCDCAA\">ToList<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Return<\/span><span style=\"color: #D4D4D4\"> allUsers<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Retrieves all user accounts that are members of Active Directory groups whose names match the specified pattern.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":754,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-764","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/comments?post=764"}],"version-history":[{"count":2,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/764\/revisions"}],"predecessor-version":[{"id":766,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/764\/revisions\/766"}],"up":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/754"}],"wp:attachment":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/media?parent=764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}