Example #1
0
 public static IEnumerable <object> Get_NetSubnet(Args_Get_DomainSubnet args = null)
 {
     return(GetDomainSubnet.Get_DomainSubnet(args));
 }
Example #2
0
        public static IEnumerable <object> Get_DomainSubnet(Args_Get_DomainSubnet args = null)
        {
            if (args == null)
            {
                args = new Args_Get_DomainSubnet();
            }

            var SearcherArguments = new Args_Get_DomainSearcher
            {
                SearchBasePrefix = @"CN=Subnets,CN=Sites,CN=Configuration",
                Domain           = args.Domain,
                Properties       = args.Properties,
                SearchBase       = args.SearchBase,
                Server           = args.Server,
                SearchScope      = args.SearchScope,
                ResultPageSize   = args.ResultPageSize,
                ServerTimeLimit  = args.ServerTimeLimit,
                SecurityMasks    = args.SecurityMasks,
                Tombstone        = args.Tombstone,
                Credential       = args.Credential
            };
            var SubnetSearcher = GetDomainSearcher.Get_DomainSearcher(SearcherArguments);
            var Subnets        = new List <object>();

            if (SubnetSearcher != null)
            {
                var IdentityFilter = @"";
                var Filter         = @"";
                if (args.Identity != null)
                {
                    foreach (var item in args.Identity)
                    {
                        var IdentityInstance = item.Replace(@"(", @"\28").Replace(@")", @"\29");
                        if (IdentityInstance.IsRegexMatch(@"^CN=.*"))
                        {
                            IdentityFilter += $@"(distinguishedname={IdentityInstance})";
                            if (args.Domain.IsNullOrEmpty() && args.SearchBase.IsNullOrEmpty())
                            {
                                // if a -Domain isn't explicitly set, extract the object domain out of the distinguishedname
                                // and rebuild the domain searcher
                                var IdentityDomain = IdentityInstance.Substring(IdentityInstance.IndexOf(@"DC=")).Replace(@"DC=", @"").Replace(@",", @".");
                                Logger.Write_Verbose($@"[Get-DomainSite] Extracted domain '{IdentityDomain}' from '{IdentityInstance}'");
                                SearcherArguments.Domain = IdentityDomain;
                                SubnetSearcher           = GetDomainSearcher.Get_DomainSearcher(SearcherArguments);
                                if (SubnetSearcher == null)
                                {
                                    Logger.Write_Warning($@"[Get-DomainSubnet] Unable to retrieve domain searcher for '{IdentityDomain}'");
                                }
                            }
                        }
                        else
                        {
                            try
                            {
                                var GuidByteString = string.Join(string.Empty, Guid.Parse(IdentityInstance).ToByteArray().Select(x => x.ToString(@"\X2")));
                                IdentityFilter += $@"(objectguid={GuidByteString})";
                            }
                            catch
                            {
                                IdentityFilter += $@"(name={IdentityInstance})";
                            }
                        }
                    }
                }
                if (IdentityFilter != null && IdentityFilter.Trim() != @"")
                {
                    Filter += $@"(|{IdentityFilter})";
                }

                if (args.LDAPFilter.IsNotNullOrEmpty())
                {
                    Logger.Write_Verbose($@"[Get-DomainSubnet] Using additional LDAP filter: {args.LDAPFilter}");
                    Filter += $@"{args.LDAPFilter}";
                }

                SubnetSearcher.Filter = $@"(&(objectCategory=site){Filter})";
                Logger.Write_Verbose($@"[Get-DomainSubnet] Get-DomainSubnet filter string: {SubnetSearcher.Filter}");

                SearchResult[] Results = null;
                if (args.FindOne)
                {
                    Results = new SearchResult[] { SubnetSearcher.FindOne() };
                }
                else
                {
                    var items = SubnetSearcher.FindAll();
                    if (items != null)
                    {
                        Results = new SearchResult[items.Count];
                        items.CopyTo(Results, 0);
                    }
                }
                if (Results != null)
                {
                    foreach (var result in Results)
                    {
                        if (args.Raw)
                        {
                            // return raw result objects
                            if (args.SiteName.IsNotNullOrEmpty())
                            {
                                // have to do the filtering after the LDAP query as LDAP doesn't let you specify
                                // wildcards for 'siteobject' :(
                                if (result.Properties != null && (result.Properties[@"siteobject"][0] as string).IsLikeMatch($@"*{args.SiteName}*"))
                                {
                                    Subnets.Add(result);
                                }
                            }
                        }
                        else
                        {
                            var Subnet = ConvertLDAPProperty.Convert_LDAPProperty(result.Properties);
                            if (Subnet.siteobject.IsLikeMatch($@"*{args.SiteName}*"))
                            {
                                Subnets.Add(result);
                            }
                        }
                    }
                }
                SubnetSearcher.Dispose();
            }
            return(Subnets);
        }