using System.ComponentModel; using System.Security.Principal; using Agent.Windows.Network; using Agent.Windows.Security; namespace Agent.Windows.Diagnostics; public sealed record WindowsPlatformCheckResult( bool IsAdministrator, bool BfeEngineOpen, bool WfpWriteTransaction, bool WfpFilterAddDelete, int? ErrorCode, string? ErrorOperation) { public bool Success => IsAdministrator && BfeEngineOpen && WfpWriteTransaction && WfpFilterAddDelete; } public static class WindowsPlatformCheck { public static WindowsPlatformCheckResult Run() { using WindowsIdentity identity = WindowsIdentity.GetCurrent(); bool administrator = new WindowsPrincipal(identity).IsInRole(WindowsBuiltInRole.Administrator); bool open = false; bool transaction = false; bool filters = false; try { AppContainerProfile profile = AppContainerProfile.EnsureFixed(); using WfpDynamicSession session = WfpDynamicSession.Open(); open = true; session.ProbeWriteTransaction(); transaction = true; IReadOnlyList ids = session.ApplyDefaultBlock(profile.Sid); if (ids.Count != 2 || ids.Any(static id => id == 0)) throw new InvalidOperationException("WFP probe did not create both IPv4 and IPv6 filters."); session.RemovePolicy(); filters = true; return new(administrator, open, transaction, filters, null, null); } catch (Win32Exception ex) { return new(administrator, open, transaction, filters, ex.NativeErrorCode, ex.Message); } catch (Exception ex) when (ex is UnauthorizedAccessException or InvalidOperationException or IOException) { return new(administrator, open, transaction, filters, ex.HResult, ex.Message); } } }