2024-03-06 16:14:36 +01:00

145 lines
5.9 KiB
C#

using System.DirectoryServices;
using System.Collections;
using Microsoft.VisualBasic.CompilerServices;
using System.Reflection;
namespace DigitalData.Core.ConsoleApp
{
public class DirectoryService
{
public static T MapResultProperty<T>(ResultPropertyCollection rpc) where T : new()
{
if (!OperatingSystem.IsWindows())
throw new PlatformNotSupportedException("The method is only supported on the Windows platform.");
T resultObject = new();
foreach (string propertyName in rpc.PropertyNames ?? throw new ArgumentNullException("PropertyNames are null"))
{
var propertyValue = rpc[propertyName][0];
PropertyInfo? pi = typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
if (pi != null && propertyValue != null)
{
Type propertyType = pi.PropertyType;
Type underlyingType = Nullable.GetUnderlyingType(propertyType) ?? propertyType;
if (propertyType != underlyingType)
{
propertyValue = Convert.ChangeType(propertyValue, underlyingType);
pi.SetValue(resultObject, propertyValue);
}
else if (typeof(IEnumerable).IsAssignableFrom(propertyType) && propertyType != typeof(string))
{
var itemType = propertyType.GetGenericArguments()[0];
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(itemType));
list.Add(Convert.ChangeType(propertyValue, itemType));
pi.SetValue(resultObject, list);
}
else if (propertyValue is byte[] && propertyType == typeof(string))
{
pi.SetValue(resultObject, Convert.ToBase64String((byte[])propertyValue));
}
else if (propertyValue is byte[] stBytes && propertyType == typeof(string))
{
pi.SetValue(resultObject, BitConverter.ToString(stBytes).Replace("-", ""));
}
else if (propertyValue is byte[] guiBytes && propertyType == typeof(Guid))
{
pi.SetValue(resultObject, new Guid(guiBytes));
}
else
{
propertyValue = Convert.ChangeType(propertyValue, propertyType);
pi.SetValue(resultObject, propertyValue);
}
}
}
return resultObject;
}
public static SearchResultCollection Search(string filter)
{
if (!OperatingSystem.IsWindows())
throw new PlatformNotSupportedException("The ListGroups method is only supported on the windows platform.");
DirectorySearcher directorySearcher = new()
{
SearchScope = SearchScope.Subtree,
SizeLimit = 50000,
Filter = filter,
};
return directorySearcher.FindAll();
}
public static IEnumerable<T> Search<T>(string filter) where T: new()
{
List<T> list = new();
foreach(SearchResult result in Search(filter))
{
if (!OperatingSystem.IsWindows())
throw new PlatformNotSupportedException("The ListGroups method is only supported on the windows platform.");
ResultPropertyCollection rpc = result.Properties;
T obj = MapResultProperty<T>(rpc);
list.Add(obj);
}
return list;
}
public List<ADGroup> ListGroups(string query)
{
if (OperatingSystem.IsWindows())
{
DirectorySearcher directorySearcher = new()
{
SearchScope = SearchScope.Subtree,
SizeLimit = 50000,
Filter = query
};
SearchResultCollection result = directorySearcher.FindAll();
return GroupResultsToList(result);
}
throw new PlatformNotSupportedException("The ListGroups method is only supported on the Windows platform.");
}
private List<ADGroup> GroupResultsToList(SearchResultCollection results)
{
List<ADGroup> list = new();
foreach(SearchResult result in results)
{
list.Add(new ADGroup
{
Name = TryGetProperty(result, "name"),
SAMAccountName = TryGetProperty(result, "samaccountname"),
CN = TryGetProperty(result, "cn"),
Description = TryGetProperty(result, "description"),
DistinguishedName = TryGetProperty(result, "distinguishedName"),
ObjectCategory = TryGetProperty(result, "objectCategory"),
//ObjectClass = TryGetProperty(result, "objectClass")
});
}
return list;
}
private string TryGetProperty(SearchResult Result, string PropertyName)
{
var messages = new List<string>();
try
{
return Conversions.ToString(Result.Properties[PropertyName][0]);
}
catch (Exception ex)
{
Exception ex2 = ex;
messages.Add(String.Format("Property {0} not found", PropertyName));
string empty = string.Empty;
return empty;
}
}
}
}