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); }
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()); }
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); }
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); } }
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); } } }
private static void PreserveSigBasedOnMetadata() { IDirectorySearch ds = null !; HRESULT hr = ds.GetNextRow(0); }