1 //------------------------------------------------------------ 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 //------------------------------------------------------------ 4 5 namespace System.ServiceModel.Administration 6 { 7 using System; 8 using System.Collections.Generic; 9 using System.Diagnostics; 10 using System.Globalization; 11 using System.Reflection; 12 using System.Runtime; 13 using System.ServiceModel; 14 using System.ServiceModel.Diagnostics; 15 using System.ServiceModel.Activation; 16 using System.Security; 17 using System.Security.Permissions; 18 19 class AppDomainInstanceProvider : ProviderBase, IWmiProvider 20 { IWmiProvider.EnumInstances(IWmiInstances instances)21 void IWmiProvider.EnumInstances(IWmiInstances instances) 22 { 23 Fx.Assert(null != instances, ""); 24 IWmiInstance instance = instances.NewInstance(null); 25 FillAppDomainInfo(instance); 26 instances.AddInstance(instance); 27 } 28 IWmiProvider.GetInstance(IWmiInstance instance)29 bool IWmiProvider.GetInstance(IWmiInstance instance) 30 { 31 Fx.Assert(null != instance, ""); 32 bool bFound = false; 33 if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId 34 && String.Equals((string)instance.GetProperty(AdministrationStrings.Name), AppDomainInfo.Current.Name, StringComparison.Ordinal)) 35 { 36 FillAppDomainInfo(instance); 37 bFound = true; 38 } 39 40 return bFound; 41 } 42 GetReference()43 internal static string GetReference() 44 { 45 return String.Format(CultureInfo.InvariantCulture, AdministrationStrings.AppDomainInfo + 46 "." + 47 AdministrationStrings.AppDomainId + 48 "={0}," + 49 AdministrationStrings.Name + 50 "='{1}'," + 51 AdministrationStrings.ProcessId + 52 "={2}", 53 AppDomainInfo.Current.Id, 54 AppDomainInfo.Current.Name, 55 AppDomainInfo.Current.ProcessId); 56 } 57 FillAppDomainInfo(IWmiInstance instance)58 internal static void FillAppDomainInfo(IWmiInstance instance) 59 { 60 Fx.Assert(null != instance, ""); 61 AppDomainInfo domainInfo = AppDomainInfo.Current; 62 instance.SetProperty(AdministrationStrings.Name, domainInfo.Name); 63 instance.SetProperty(AdministrationStrings.AppDomainId, domainInfo.Id); 64 instance.SetProperty(AdministrationStrings.PerformanceCounters, PerformanceCounters.Scope.ToString()); 65 instance.SetProperty(AdministrationStrings.IsDefault, domainInfo.IsDefaultAppDomain); 66 instance.SetProperty(AdministrationStrings.ProcessId, domainInfo.ProcessId); 67 instance.SetProperty(AdministrationStrings.TraceLevel, DiagnosticUtility.Level.ToString()); 68 instance.SetProperty(AdministrationStrings.LogMalformedMessages, MessageLogger.LogMalformedMessages); 69 instance.SetProperty(AdministrationStrings.LogMessagesAtServiceLevel, MessageLogger.LogMessagesAtServiceLevel); 70 instance.SetProperty(AdministrationStrings.LogMessagesAtTransportLevel, MessageLogger.LogMessagesAtTransportLevel); 71 instance.SetProperty(AdministrationStrings.ServiceConfigPath, AspNetEnvironment.Current.ConfigurationPath); 72 FillListenersInfo(instance); 73 } 74 CreateListenersInfo(TraceSource traceSource, IWmiInstance instance)75 static IWmiInstance[] CreateListenersInfo(TraceSource traceSource, IWmiInstance instance) 76 { 77 Fx.Assert(null != traceSource, ""); 78 Fx.Assert(null != instance, ""); 79 80 IWmiInstance[] traceListeners = new IWmiInstance[traceSource.Listeners.Count]; 81 82 for (int i = 0; i < traceSource.Listeners.Count; i++) 83 { 84 TraceListener traceListener = traceSource.Listeners[i]; 85 IWmiInstance traceListenerWmiInstance = instance.NewInstance(AdministrationStrings.TraceListener); 86 traceListenerWmiInstance.SetProperty(AdministrationStrings.Name, traceListener.Name); 87 List<IWmiInstance> traceListenerArguments = new List<IWmiInstance>(1); 88 89 Type type = traceListener.GetType(); 90 string initializeData = (string)type.InvokeMember(AdministrationStrings.InitializeData, BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance, null, traceListener, null, CultureInfo.InvariantCulture); 91 string[] supportedAttributes = (string[])type.InvokeMember(AdministrationStrings.GetSupportedAttributes, BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, traceListener, null, CultureInfo.InvariantCulture); 92 93 IWmiInstance argumentWmiInstance = instance.NewInstance(AdministrationStrings.TraceListenerArgument); 94 argumentWmiInstance.SetProperty(AdministrationStrings.Name, AdministrationStrings.InitializeData); 95 argumentWmiInstance.SetProperty(AdministrationStrings.Value, initializeData); 96 traceListenerArguments.Add(argumentWmiInstance); 97 98 if (null != supportedAttributes) 99 { 100 foreach (string attribute in supportedAttributes) 101 { 102 argumentWmiInstance = instance.NewInstance(AdministrationStrings.TraceListenerArgument); 103 argumentWmiInstance.SetProperty(AdministrationStrings.Name, attribute); 104 argumentWmiInstance.SetProperty(AdministrationStrings.Value, traceListener.Attributes[attribute]); 105 traceListenerArguments.Add(argumentWmiInstance); 106 } 107 } 108 traceListenerWmiInstance.SetProperty(AdministrationStrings.TraceListenerArguments, traceListenerArguments.ToArray()); 109 traceListeners[i] = traceListenerWmiInstance; 110 } 111 112 return traceListeners; 113 } 114 FillListenersInfo(IWmiInstance instance)115 static void FillListenersInfo(IWmiInstance instance) 116 { 117 Fx.Assert(null != instance, ""); 118 TraceSource traceSource = DiagnosticUtility.DiagnosticTrace == null ? null : DiagnosticUtility.DiagnosticTrace.TraceSource; 119 if (null != traceSource) 120 { 121 instance.SetProperty(AdministrationStrings.ServiceModelTraceListeners, CreateListenersInfo(traceSource, instance)); 122 } 123 traceSource = MessageLogger.MessageTraceSource; 124 if (null != traceSource) 125 { 126 instance.SetProperty(AdministrationStrings.MessageLoggingTraceListeners, CreateListenersInfo(traceSource, instance)); 127 } 128 } 129 130 [Fx.Tag.SecurityNote(Critical = "Critical because we are setting DiagnosticUtility.Level.", 131 Safe = "Demands UnmanagedCode permission to set the Trace level")] 132 [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 133 [SecuritySafeCritical] IWmiProvider.PutInstance(IWmiInstance instance)134 bool IWmiProvider.PutInstance(IWmiInstance instance) 135 { 136 Fx.Assert(null != instance, ""); 137 bool bFound = false; 138 if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId 139 && String.Equals((string)instance.GetProperty(AdministrationStrings.Name), AppDomainInfo.Current.Name, StringComparison.Ordinal)) 140 { 141 try 142 { 143 SourceLevels newLevel = (SourceLevels)Enum.Parse(typeof(SourceLevels), (string)instance.GetProperty(AdministrationStrings.TraceLevel)); 144 if (DiagnosticUtility.Level != newLevel) 145 { 146 if (DiagnosticUtility.ShouldTraceVerbose) 147 { 148 TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut), 149 new WmiPutTraceRecord("DiagnosticTrace.Level", 150 DiagnosticUtility.Level, 151 newLevel), instance, null); 152 } 153 DiagnosticUtility.Level = newLevel; 154 } 155 156 bool logMalformedMessages = (bool)instance.GetProperty(AdministrationStrings.LogMalformedMessages); 157 if (MessageLogger.LogMalformedMessages != logMalformedMessages) 158 { 159 if (DiagnosticUtility.ShouldTraceVerbose) 160 { 161 TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut), 162 new WmiPutTraceRecord("MessageLogger.LogMalformedMessages", 163 MessageLogger.LogMalformedMessages, 164 logMalformedMessages), instance, null); 165 } 166 MessageLogger.LogMalformedMessages = logMalformedMessages; 167 } 168 169 bool logMessagesAtServiceLevel = (bool)instance.GetProperty(AdministrationStrings.LogMessagesAtServiceLevel); 170 if (MessageLogger.LogMessagesAtServiceLevel != logMessagesAtServiceLevel) 171 { 172 if (DiagnosticUtility.ShouldTraceVerbose) 173 { 174 TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut), 175 new WmiPutTraceRecord("MessageLogger.LogMessagesAtServiceLevel", 176 MessageLogger.LogMessagesAtServiceLevel, 177 logMessagesAtServiceLevel), instance, null); 178 } 179 MessageLogger.LogMessagesAtServiceLevel = logMessagesAtServiceLevel; 180 } 181 182 bool logMessagesAtTransportLevel = (bool)instance.GetProperty(AdministrationStrings.LogMessagesAtTransportLevel); 183 if (MessageLogger.LogMessagesAtTransportLevel != logMessagesAtTransportLevel) 184 { 185 if (DiagnosticUtility.ShouldTraceVerbose) 186 { 187 TraceUtility.TraceEvent(TraceEventType.Verbose, TraceCode.WmiPut, SR.GetString(SR.TraceCodeWmiPut), 188 new WmiPutTraceRecord("MessageLogger.LogMessagesAtTransportLevel", 189 MessageLogger.LogMessagesAtTransportLevel, 190 logMessagesAtTransportLevel), instance, null); 191 } 192 MessageLogger.LogMessagesAtTransportLevel = logMessagesAtTransportLevel; 193 } 194 } 195 catch (ArgumentException) 196 { 197 throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new WbemInvalidParameterException()); 198 } 199 bFound = true; 200 } 201 202 return bFound; 203 } 204 } 205 } 206