using System; using System.Collections.Generic; using System.DirectoryServices; using System.DirectoryServices.ActiveDirectory; using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading.Tasks; namespace Disco.Services.Interop.ActiveDirectory { public static class ActiveDirectoryExtensions { #region Domain/Directory Extensions public static bool IsReachable(this DirectoryServer ds) { using (Ping p = new Ping()) { var pr = p.Send(ds.Name, 500); return (pr.Status == IPStatus.Success); } } public static IEnumerable WhereReachable(this DomainControllerCollection domainControllers) { return domainControllers.Cast().Where(dc => dc.IsReachable()); } public static IEnumerable WhereReachable(this IEnumerable domainControllers) { return domainControllers.Where(dc => dc.DomainController.IsReachable()); } // Directory Entry Properties (Generic Helpers) public static T Value(this PropertyCollection properties, string PropertyName) { var p = properties.Values(PropertyName); return p.FirstOrDefault(); } public static IEnumerable Values(this PropertyCollection properties, string PropertyName) { var p = properties[PropertyName]; return p.OfType(); } #endregion #region ADObject Builders // User Accounts public static ADUserAccount AsADUserAccount(this ADSearchResult SearchResult, bool Quick, string[] AdditionalProperties) { return ADUserAccount.FromSearchResult(SearchResult, Quick, AdditionalProperties); } public static IEnumerable AsADUserAccounts(this IEnumerable SearchResults, bool Quick, string[] AdditionalProperties) { return SearchResults.Select(sr => ADUserAccount.FromSearchResult(sr, Quick, AdditionalProperties)); } // Machine Accounts public static ADMachineAccount AsADMachineAccount(this ADSearchResult SearchResult, string[] AdditionalProperties) { return ADMachineAccount.FromSearchResult(SearchResult, AdditionalProperties); } public static IEnumerable AsADMachineAccounts(this IEnumerable SearchResults, string[] AdditionalProperties) { return SearchResults.Select(sr => ADMachineAccount.FromSearchResult(sr, AdditionalProperties)); } // Groups public static ADGroup AsADGroup(this ADSearchResult SearchResult, string[] AdditionalProperties) { return ADGroup.FromSearchResult(SearchResult, AdditionalProperties); } public static IEnumerable AsADGroups(this IEnumerable SearchResults, string[] AdditionalProperties) { return SearchResults.Select(sr => ADGroup.FromSearchResult(sr, AdditionalProperties)); } public static ADGroup AsADGroup(this ADDirectoryEntry DirectoryEntry, string[] AdditionalProperties) { return ADGroup.FromDirectoryEntry(DirectoryEntry, AdditionalProperties); } public static IEnumerable AsADGroups(this IEnumerable DirectoryEntries, string[] AdditionalProperties) { return DirectoryEntries.Select(de => ADGroup.FromDirectoryEntry(de, AdditionalProperties)); } // Organisational Units public static ADOrganisationalUnit AsADOrganisationalUnit(this ADSearchResult SearchResult) { return ADOrganisationalUnit.FromSearchResult(SearchResult); } public static IEnumerable AsADOrganisationalUnit(this IEnumerable SearchResults) { return SearchResults.Select(sr => ADOrganisationalUnit.FromSearchResult(sr)); } #endregion } }