ManagementExtension.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Administration
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Runtime;
  9. using System.Security;
  10. using System.ServiceModel;
  11. using System.ServiceModel.Configuration;
  12. sealed class ManagementExtension
  13. {
  14. static Dictionary<ServiceHostBase, DateTime> services;
  15. static bool activated = false;
  16. static object syncRoot = new object();
  17. static bool isEnabled = GetIsWmiProviderEnabled();
  18. internal static bool IsActivated
  19. {
  20. get { return ManagementExtension.activated; }
  21. }
  22. internal static bool IsEnabled
  23. {
  24. get { return ManagementExtension.isEnabled; }
  25. }
  26. [Fx.Tag.SecurityNote(Critical = "Calls critical method DiagnosticSection.UnsafeGetSection.",
  27. Safe = "Doesn't leak config section instance, just returns a bool.")]
  28. [SecuritySafeCritical]
  29. static bool GetIsWmiProviderEnabled()
  30. {
  31. return DiagnosticSection.UnsafeGetSection().WmiProviderEnabled;
  32. }
  33. static Dictionary<ServiceHostBase, DateTime> GetServices()
  34. {
  35. if (ManagementExtension.services == null)
  36. {
  37. lock (ManagementExtension.syncRoot)
  38. {
  39. if (ManagementExtension.services == null)
  40. {
  41. ManagementExtension.services = new Dictionary<ServiceHostBase, DateTime>();
  42. }
  43. }
  44. }
  45. return ManagementExtension.services;
  46. }
  47. internal static ICollection<ServiceHostBase> Services
  48. {
  49. get
  50. {
  51. return GetServices().Keys;
  52. }
  53. }
  54. internal static DateTime GetTimeOpened(ServiceHostBase service)
  55. {
  56. return GetServices()[service];
  57. }
  58. public static void OnServiceOpened(ServiceHostBase serviceHostBase)
  59. {
  60. EnsureManagementProvider();
  61. Add(serviceHostBase);
  62. }
  63. public static void OnServiceClosing(ServiceHostBase serviceHostBase)
  64. {
  65. Remove(serviceHostBase);
  66. }
  67. static void Add(ServiceHostBase service)
  68. {
  69. Dictionary<ServiceHostBase, DateTime> services = GetServices();
  70. lock (services)
  71. {
  72. if (!services.ContainsKey(service))
  73. {
  74. services.Add(service, DateTime.Now);
  75. }
  76. }
  77. }
  78. static void Remove(ServiceHostBase service)
  79. {
  80. Dictionary<ServiceHostBase, DateTime> services = GetServices();
  81. lock (services)
  82. {
  83. if (services.ContainsKey(service))
  84. {
  85. services.Remove(service);
  86. }
  87. }
  88. }
  89. static void EnsureManagementProvider()
  90. {
  91. if (!ManagementExtension.activated)
  92. {
  93. lock (ManagementExtension.syncRoot)
  94. {
  95. if (!ManagementExtension.activated)
  96. {
  97. Activate();
  98. ManagementExtension.activated = true;
  99. }
  100. }
  101. }
  102. }
  103. static void Activate()
  104. {
  105. WbemProvider wmi = new WbemProvider(AdministrationStrings.IndigoNamespace, AdministrationStrings.IndigoAppName);
  106. wmi.Register(AdministrationStrings.AppDomainInfo, new AppDomainInstanceProvider());
  107. wmi.Register(AdministrationStrings.Service, new ServiceInstanceProvider());
  108. wmi.Register(AdministrationStrings.Contract, new ContractInstanceProvider());
  109. wmi.Register(AdministrationStrings.Endpoint, new EndpointInstanceProvider());
  110. wmi.Register(AdministrationStrings.ServiceAppDomain, new ServiceAppDomainAssociationProvider());
  111. wmi.Register(AdministrationStrings.ServiceToEndpointAssociation, new ServiceEndpointAssociationProvider());
  112. }
  113. }
  114. }