Пример #1
0
        public static DirectoryEntry FindByName(string searchBase, string name, string user, string pass, SearchScope scope)
        {
            var search = searchBase.StartsWith("LDAP://") ? searchBase : $"LDAP://{searchBase}";

            IDirectorySearch ds = GetDirectorySearcher(search);

            IntPtr searchHandle = IntPtr.Zero;

            int hr = ds.ExecuteSearch($"(sAMAccountName={name})", _adProperties.ToArray(), _adProperties.Count, out searchHandle);

            if (Failed(hr))
            {
                throw ComException.BuildComException(hr, ds);
            }

            hr = ds.GetFirstRow(searchHandle);
            var de = new DirectoryEntry();

            foreach (var obj in _adProperties)
            {
                de.Add(obj, de.GetValue(ds, searchHandle, obj));
            }

            return(de);
        }
Пример #2
0
        private byte[] GetValueByteArray(IDirectorySearch search, IntPtr searchHandle, string columnName)
        {
            IntPtr name   = Marshal.StringToCoTaskMemUni(columnName);
            IntPtr column = Marshal.AllocHGlobal(Marshal.SizeOf <ADS_SEARCH_COLUMN>());

            search.GetColumn(searchHandle, name, column);
            Marshal.FreeCoTaskMem(name);
            var      col   = (ADS_SEARCH_COLUMN)Marshal.PtrToStructure <ADS_SEARCH_COLUMN>(column);
            ADSVALUE value = Marshal.PtrToStructure <ADSVALUE>(col.pADsValues);

            Marshal.FreeHGlobal(column);
            return((byte[])new AdsValueHelper(value).GetValue());
        }
Пример #3
0
        private List <string> GetValues(IDirectorySearch search, IntPtr searchHandle, string columnName)
        {
            IntPtr name   = Marshal.StringToCoTaskMemUni(columnName);
            IntPtr column = Marshal.AllocHGlobal(Marshal.SizeOf <ADS_SEARCH_COLUMN>());

            search.GetColumn(searchHandle, name, column);
            Marshal.FreeCoTaskMem(name);
            var    col         = Marshal.PtrToStructure <ADS_SEARCH_COLUMN>(column);
            IntPtr placeholder = col.pADsValues;
            var    retVal      = new List <string>();

            for (int i = 0; i < col.dwNumValues; i++)
            {
                ADSVALUE value = Marshal.PtrToStructure <ADSVALUE>(placeholder);
                retVal.Add(Marshal.PtrToStringUni(value.pointer));
                placeholder = IntPtr.Add(placeholder, Marshal.SizeOf <ADSVALUE>());
            }
            Marshal.FreeHGlobal(column);
            return(retVal);
        }
Пример #4
0
        public DirectoryEntry(string dn)
        {
            _properties["distinguishedName"] = dn;
            IDirectorySearch ds = GetDirectorySearcher($"LDAP://{_properties["distinguishedName"].ToString()}");

            IntPtr searchHandle = IntPtr.Zero;

            int hr = ds.ExecuteSearch("(objectClass=*)", _adProperties.ToArray(), _adProperties.Count, out searchHandle);

            if (Failed(hr))
            {
                throw ComException.BuildComException(hr, ds);
            }

            hr = ds.GetFirstRow(searchHandle);
            foreach (var obj in _adProperties)
            {
                _properties[obj] = GetValue(ds, searchHandle, obj);
            }
        }
Пример #5
0
        public void Find(string filter, string[] properties, SearchScope scope, int pageSize, int size)
        {
            var adProperties = new List <string>(properties);

            if (!adProperties.Contains("ADsPath"))
            {
                adProperties.Add("ADsPath");
            }
            if (!adProperties.Contains("distinguishedName"))
            {
                adProperties.Add("distinguishedName");
            }

            IDirectorySearch ds = GetDirectorySearcher($"LDAP://{_properties["distinguishedName"].ToString()}");

            var options = new List <ADS_SEARCHPREF_INFO>();

            if (scope != SearchScope.None)
            {
                options.Add(new ADS_SEARCHPREF_INFO {
                    dwSearchPref = ADS_SEARCHPREF.ADS_SEARCHPREF_SEARCH_SCOPE,
                    dwStatus     = ADS_STATUS.ADS_STATUS_NONE,
                    vValue       = new AdsValueHelper(ADS_SCOPE.ADS_SCOPE_SUBTREE, ADSTYPE.ADSTYPE_INTEGER).GetStruct()
                });
            }

            if (pageSize != 0)
            {
                options.Add(new ADS_SEARCHPREF_INFO {
                    dwSearchPref = ADS_SEARCHPREF.ADS_SEARCHPREF_PAGESIZE,
                    dwStatus     = ADS_STATUS.ADS_STATUS_NONE,
                    vValue       = new AdsValueHelper(pageSize, ADSTYPE.ADSTYPE_INTEGER).GetStruct()
                });
            }

            if (size != 1000)
            {
                options.Add(new ADS_SEARCHPREF_INFO {
                    dwSearchPref = ADS_SEARCHPREF.ADS_SEARCHPREF_SIZE_LIMIT,
                    dwStatus     = ADS_STATUS.ADS_STATUS_NONE,
                    vValue       = new AdsValueHelper(size, ADSTYPE.ADSTYPE_INTEGER).GetStruct()
                });
            }

            var optSize  = Marshal.SizeOf <ADS_SEARCHPREF_INFO>();
            var optCount = options.Count;

            IntPtr ptrSearchPref = Marshal.AllocHGlobal((IntPtr)(optSize * optCount));
            IntPtr placeholder   = ptrSearchPref;

            for (int i = 0; i < optCount; i++)
            {
                Marshal.StructureToPtr(options[i], placeholder, false);
                placeholder = IntPtr.Add(placeholder, optSize);
            }

            int hr = ds.SetSearchPreference(ptrSearchPref, optCount);

            if (Failed(hr))
            {
                Marshal.FreeHGlobal(ptrSearchPref);
                throw ComException.BuildComException(hr, ds);
            }

            placeholder = ptrSearchPref;
            options.Clear();
            for (int i = 0; i < optCount; i++)
            {
                var opt = Marshal.PtrToStructure <ADS_SEARCHPREF_INFO>(placeholder);
                placeholder = IntPtr.Add(placeholder, optSize);
                if (opt.dwStatus == ADS_STATUS.ADS_STATUS_INVALID_SEARCHPREF)
                {
                    Marshal.FreeHGlobal(ptrSearchPref);
                    throw new Exception("Invalid search preference specified.");
                }
                if (opt.dwStatus == ADS_STATUS.ADS_STATUS_INVALID_SEARCHPREFVALUE)
                {
                    Marshal.FreeHGlobal(ptrSearchPref);
                    throw new Exception("Invalid search preference value specified.");
                }
            }

            Marshal.FreeHGlobal(ptrSearchPref);

            IntPtr searchHandle = IntPtr.Zero;

            hr = ds.ExecuteSearch(filter, adProperties.ToArray(), adProperties.Count, out searchHandle);

            if (Failed(hr))
            {
                throw ComException.BuildComException(hr, ds);
            }

            var ret       = 0;
            var lastError = 0;

            while ((ret = ds.GetNextRow(searchHandle)) != S_ADS_NOMORE_ROWS)
            {
                if (lastError == SIZE_LIMIT_EXCEEDED && ret == SIZE_LIMIT_EXCEEDED)
                {
                    break;
                }
                lastError = ret;
                if (ret != SIZE_LIMIT_EXCEEDED)
                {
                    DirectoryEntry de = new DirectoryEntry(GetValueString(ds, searchHandle, "distinguishedName"));
                    foreach (var obj in adProperties)
                    {
                        de[obj] = GetValue(ds, searchHandle, obj);
                    }
                    Children.Add(de);
                }
            }
        }
Пример #6
0
 private static void PreserveSigBasedOnMetadata()
 {
     IDirectorySearch ds = null !;
     HRESULT          hr = ds.GetNextRow(0);
 }