EndpointInstanceProvider.cs 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  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.Globalization;
  9. using System.Runtime;
  10. using System.Security.Authentication.ExtendedProtection;
  11. using System.ServiceModel;
  12. using System.ServiceModel.Channels;
  13. using System.ServiceModel.Description;
  14. using System.ServiceModel.Diagnostics;
  15. using System.ServiceModel.MsmqIntegration;
  16. using System.Xml;
  17. class EndpointInstanceProvider : ProviderBase, IWmiProvider
  18. {
  19. internal static string EndpointReference(Uri uri, string contractName)
  20. {
  21. return EndpointReference(null != uri ? uri.ToString() : String.Empty, contractName, true);
  22. }
  23. internal static string EndpointReference(string address, string contractName, bool local)
  24. {
  25. Fx.Assert(!String.IsNullOrEmpty(address), "address cannot be null");
  26. string endpointReference = String.Format(CultureInfo.InvariantCulture,
  27. AdministrationStrings.Endpoint +
  28. "." +
  29. AdministrationStrings.ListenUri +
  30. "='{0}'," +
  31. AdministrationStrings.ContractName +
  32. "='{1}'," +
  33. AdministrationStrings.AppDomainId +
  34. "='{2}'," +
  35. AdministrationStrings.ProcessId +
  36. "={3}",
  37. address,
  38. #pragma warning suppress 56507
  39. null != contractName ? contractName : String.Empty,
  40. AppDomainInfo.Current.Id,
  41. AppDomainInfo.Current.ProcessId);
  42. if (!local)
  43. {
  44. Uri uri;
  45. if (Uri.TryCreate(address, UriKind.Absolute, out uri))
  46. {
  47. string host = uri.Host;
  48. if (!AdministrationStrings.Localhost.Equals(host, StringComparison.OrdinalIgnoreCase)
  49. && !AppDomainInfo.Current.MachineName.Equals(host, StringComparison.OrdinalIgnoreCase))
  50. {
  51. string machineAddress = String.Format(CultureInfo.InvariantCulture,
  52. "\\\\{0}\\" + AdministrationStrings.IndigoNamespace + ":",
  53. host);
  54. endpointReference = machineAddress + endpointReference;
  55. }
  56. }
  57. }
  58. return endpointReference;
  59. }
  60. static void FillBindingInfo(EndpointInfo endpoint, IWmiInstance instance)
  61. {
  62. Fx.Assert(null != endpoint, "");
  63. Fx.Assert(null != instance, "");
  64. IWmiInstance binding = instance.NewInstance(AdministrationStrings.Binding);
  65. IWmiInstance[] bindings = new IWmiInstance[endpoint.Binding.Elements.Count];
  66. for (int j = 0; j < bindings.Length; ++j)
  67. {
  68. bindings[j] = binding;
  69. FillBindingInfo(endpoint.Binding.Elements[j], ref bindings[j]);
  70. }
  71. binding.SetProperty(AdministrationStrings.BindingElements, bindings);
  72. binding.SetProperty(AdministrationStrings.Name, endpoint.Binding.Name);
  73. binding.SetProperty(AdministrationStrings.Namespace, endpoint.Binding.Namespace);
  74. binding.SetProperty(AdministrationStrings.CloseTimeout, endpoint.Binding.CloseTimeout);
  75. binding.SetProperty(AdministrationStrings.Scheme, endpoint.Binding.Scheme);
  76. binding.SetProperty(AdministrationStrings.OpenTimeout, endpoint.Binding.OpenTimeout);
  77. binding.SetProperty(AdministrationStrings.ReceiveTimeout, endpoint.Binding.ReceiveTimeout);
  78. binding.SetProperty(AdministrationStrings.SendTimeout, endpoint.Binding.SendTimeout);
  79. instance.SetProperty(AdministrationStrings.Binding, binding);
  80. }
  81. static void FillAddressInfo(EndpointInfo endpoint, IWmiInstance instance)
  82. {
  83. Fx.Assert(null != endpoint, "");
  84. Fx.Assert(null != instance, "");
  85. string[] headers = new string[endpoint.Headers.Count];
  86. int i = 0;
  87. foreach (AddressHeader header in endpoint.Headers)
  88. {
  89. PlainXmlWriter xmlWriter = new PlainXmlWriter();
  90. header.WriteAddressHeader(xmlWriter);
  91. headers[i++] = xmlWriter.ToString();
  92. }
  93. ProviderBase.FillCollectionInfo(headers, instance, AdministrationStrings.AddressHeaders);
  94. instance.SetProperty(AdministrationStrings.Address, endpoint.Address == null ? String.Empty : endpoint.Address.ToString());
  95. instance.SetProperty(AdministrationStrings.ListenUri, endpoint.ListenUri == null ? String.Empty : endpoint.ListenUri.ToString());
  96. instance.SetProperty(AdministrationStrings.Identity, endpoint.Identity == null ? String.Empty : endpoint.Identity.ToString());
  97. }
  98. static void FillContractInfo(EndpointInfo endpoint, IWmiInstance instance)
  99. {
  100. Fx.Assert(null != endpoint, "");
  101. Fx.Assert(null != instance, "");
  102. instance.SetProperty(AdministrationStrings.Contract, ContractInstanceProvider.ContractReference(endpoint.Contract.Name));
  103. }
  104. internal static void FillEndpointInfo(EndpointInfo endpoint, IWmiInstance instance)
  105. {
  106. Fx.Assert(null != endpoint, "");
  107. Fx.Assert(null != instance, "");
  108. instance.SetProperty(AdministrationStrings.CounterInstanceName, PerformanceCounters.PerformanceCountersEnabled ? EndpointPerformanceCounters.CreateFriendlyInstanceName(endpoint.ServiceName, endpoint.Contract.Name, endpoint.Address.AbsoluteUri.ToUpperInvariant()) : String.Empty);
  109. instance.SetProperty(AdministrationStrings.Name, endpoint.Name);
  110. instance.SetProperty(AdministrationStrings.ContractName, endpoint.Contract.Name);
  111. FillAddressInfo(endpoint, instance);
  112. FillContractInfo(endpoint, instance);
  113. FillBindingInfo(endpoint, instance);
  114. FillBehaviorsInfo(endpoint, instance);
  115. }
  116. static void FillBindingInfo(BindingElement bindingElement, ref IWmiInstance instance)
  117. {
  118. Fx.Assert(null != bindingElement, "");
  119. Fx.Assert(null != instance, "");
  120. if (bindingElement is IWmiInstanceProvider)
  121. {
  122. IWmiInstanceProvider instanceProvider = (IWmiInstanceProvider)bindingElement;
  123. instance = instance.NewInstance(instanceProvider.GetInstanceType());
  124. instanceProvider.FillInstance(instance);
  125. return;
  126. }
  127. Type elementType = AdministrationHelpers.GetServiceModelBaseType(bindingElement.GetType());
  128. if (null != elementType)
  129. {
  130. instance = instance.NewInstance(elementType.Name);
  131. if (bindingElement is TransportBindingElement)
  132. {
  133. TransportBindingElement transport = (TransportBindingElement)bindingElement;
  134. instance.SetProperty(AdministrationStrings.ManualAddressing, transport.ManualAddressing);
  135. instance.SetProperty(AdministrationStrings.MaxReceivedMessageSize, transport.MaxReceivedMessageSize);
  136. instance.SetProperty(AdministrationStrings.MaxBufferPoolSize, transport.MaxBufferPoolSize);
  137. instance.SetProperty(AdministrationStrings.Scheme, transport.Scheme);
  138. if (bindingElement is ConnectionOrientedTransportBindingElement)
  139. {
  140. ConnectionOrientedTransportBindingElement connectionOriented = (ConnectionOrientedTransportBindingElement)bindingElement;
  141. instance.SetProperty(AdministrationStrings.ConnectionBufferSize, connectionOriented.ConnectionBufferSize);
  142. instance.SetProperty(AdministrationStrings.HostNameComparisonMode, connectionOriented.HostNameComparisonMode.ToString());
  143. instance.SetProperty(AdministrationStrings.ChannelInitializationTimeout, connectionOriented.ChannelInitializationTimeout);
  144. instance.SetProperty(AdministrationStrings.MaxBufferSize, connectionOriented.MaxBufferSize);
  145. instance.SetProperty(AdministrationStrings.MaxPendingConnections, connectionOriented.MaxPendingConnections);
  146. instance.SetProperty(AdministrationStrings.MaxOutputDelay, connectionOriented.MaxOutputDelay);
  147. instance.SetProperty(AdministrationStrings.MaxPendingAccepts, connectionOriented.MaxPendingAccepts);
  148. instance.SetProperty(AdministrationStrings.TransferMode, connectionOriented.TransferMode.ToString());
  149. if (bindingElement is TcpTransportBindingElement)
  150. {
  151. TcpTransportBindingElement tcp = (TcpTransportBindingElement)bindingElement;
  152. instance.SetProperty(AdministrationStrings.ListenBacklog, tcp.ListenBacklog);
  153. instance.SetProperty(AdministrationStrings.PortSharingEnabled, tcp.PortSharingEnabled);
  154. instance.SetProperty(AdministrationStrings.TeredoEnabled, tcp.TeredoEnabled);
  155. IWmiInstance connectionPool = instance.NewInstance(AdministrationStrings.TcpConnectionPoolSettings);
  156. connectionPool.SetProperty(AdministrationStrings.GroupName, tcp.ConnectionPoolSettings.GroupName);
  157. connectionPool.SetProperty(AdministrationStrings.IdleTimeout, tcp.ConnectionPoolSettings.IdleTimeout);
  158. connectionPool.SetProperty(AdministrationStrings.LeaseTimeout, tcp.ConnectionPoolSettings.LeaseTimeout);
  159. connectionPool.SetProperty(AdministrationStrings.MaxOutboundConnectionsPerEndpoint, tcp.ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint);
  160. instance.SetProperty(AdministrationStrings.ConnectionPoolSettings, connectionPool);
  161. FillExtendedProtectionPolicy(instance, tcp.ExtendedProtectionPolicy);
  162. }
  163. else if (bindingElement is NamedPipeTransportBindingElement)
  164. {
  165. NamedPipeTransportBindingElement namedPipe = (NamedPipeTransportBindingElement)bindingElement;
  166. IWmiInstance connectionPool = instance.NewInstance(AdministrationStrings.NamedPipeConnectionPoolSettings);
  167. connectionPool.SetProperty(AdministrationStrings.GroupName, namedPipe.ConnectionPoolSettings.GroupName);
  168. connectionPool.SetProperty(AdministrationStrings.IdleTimeout, namedPipe.ConnectionPoolSettings.IdleTimeout);
  169. connectionPool.SetProperty(AdministrationStrings.MaxOutboundConnectionsPerEndpoint, namedPipe.ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint);
  170. instance.SetProperty(AdministrationStrings.ConnectionPoolSettings, connectionPool);
  171. }
  172. }
  173. else if (bindingElement is HttpTransportBindingElement)
  174. {
  175. HttpTransportBindingElement http = (HttpTransportBindingElement)bindingElement;
  176. instance.SetProperty(AdministrationStrings.AllowCookies, http.AllowCookies);
  177. instance.SetProperty(AdministrationStrings.AuthenticationScheme, http.AuthenticationScheme.ToString());
  178. instance.SetProperty(AdministrationStrings.BypassProxyOnLocal, http.BypassProxyOnLocal);
  179. instance.SetProperty(AdministrationStrings.DecompressionEnabled, http.DecompressionEnabled);
  180. instance.SetProperty(AdministrationStrings.HostNameComparisonMode, http.HostNameComparisonMode.ToString());
  181. instance.SetProperty(AdministrationStrings.KeepAliveEnabled, http.KeepAliveEnabled);
  182. instance.SetProperty(AdministrationStrings.MaxBufferSize, http.MaxBufferSize);
  183. if (null != http.ProxyAddress)
  184. {
  185. instance.SetProperty(AdministrationStrings.ProxyAddress, http.ProxyAddress.AbsoluteUri.ToString());
  186. }
  187. instance.SetProperty(AdministrationStrings.ProxyAuthenticationScheme, http.ProxyAuthenticationScheme.ToString());
  188. instance.SetProperty(AdministrationStrings.Realm, http.Realm);
  189. instance.SetProperty(AdministrationStrings.TransferMode, http.TransferMode.ToString());
  190. instance.SetProperty(AdministrationStrings.UnsafeConnectionNtlmAuthentication, http.UnsafeConnectionNtlmAuthentication);
  191. instance.SetProperty(AdministrationStrings.UseDefaultWebProxy, http.UseDefaultWebProxy);
  192. FillExtendedProtectionPolicy(instance, http.ExtendedProtectionPolicy);
  193. if (bindingElement is HttpsTransportBindingElement)
  194. {
  195. HttpsTransportBindingElement https = (HttpsTransportBindingElement)bindingElement;
  196. instance.SetProperty(AdministrationStrings.RequireClientCertificate, https.RequireClientCertificate);
  197. }
  198. }
  199. else if (bindingElement is MsmqBindingElementBase)
  200. {
  201. MsmqBindingElementBase msmq = (MsmqBindingElementBase)bindingElement;
  202. if (null != msmq.CustomDeadLetterQueue)
  203. {
  204. instance.SetProperty(AdministrationStrings.CustomDeadLetterQueue, msmq.CustomDeadLetterQueue.AbsoluteUri.ToString());
  205. }
  206. instance.SetProperty(AdministrationStrings.DeadLetterQueue, msmq.DeadLetterQueue);
  207. instance.SetProperty(AdministrationStrings.Durable, msmq.Durable);
  208. instance.SetProperty(AdministrationStrings.ExactlyOnce, msmq.ExactlyOnce);
  209. instance.SetProperty(AdministrationStrings.MaxRetryCycles, msmq.MaxRetryCycles);
  210. instance.SetProperty(AdministrationStrings.ReceiveContextEnabled, msmq.ReceiveContextEnabled);
  211. instance.SetProperty(AdministrationStrings.ReceiveErrorHandling, msmq.ReceiveErrorHandling);
  212. instance.SetProperty(AdministrationStrings.ReceiveRetryCount, msmq.ReceiveRetryCount);
  213. instance.SetProperty(AdministrationStrings.RetryCycleDelay, msmq.RetryCycleDelay);
  214. instance.SetProperty(AdministrationStrings.TimeToLive, msmq.TimeToLive);
  215. instance.SetProperty(AdministrationStrings.UseSourceJournal, msmq.UseSourceJournal);
  216. instance.SetProperty(AdministrationStrings.UseMsmqTracing, msmq.UseMsmqTracing);
  217. instance.SetProperty(AdministrationStrings.ValidityDuration, msmq.ValidityDuration);
  218. MsmqTransportBindingElement msmqTransport = msmq as MsmqTransportBindingElement;
  219. if (null != msmqTransport)
  220. {
  221. instance.SetProperty(AdministrationStrings.MaxPoolSize, msmqTransport.MaxPoolSize);
  222. instance.SetProperty(AdministrationStrings.QueueTransferProtocol, msmqTransport.QueueTransferProtocol);
  223. instance.SetProperty(AdministrationStrings.UseActiveDirectory, msmqTransport.UseActiveDirectory);
  224. }
  225. MsmqIntegrationBindingElement msmqIntegration = msmq as MsmqIntegrationBindingElement;
  226. if (null != msmqIntegration)
  227. instance.SetProperty(AdministrationStrings.SerializationFormat, msmqIntegration.SerializationFormat.ToString());
  228. }
  229. #pragma warning disable 0618
  230. else if (bindingElement is PeerTransportBindingElement)
  231. {
  232. PeerTransportBindingElement peer = (PeerTransportBindingElement)bindingElement;
  233. instance.SetProperty(AdministrationStrings.ListenIPAddress, peer.ListenIPAddress);
  234. instance.SetProperty(AdministrationStrings.Port, peer.Port);
  235. IWmiInstance securitySettings = instance.NewInstance(AdministrationStrings.PeerSecuritySettings);
  236. securitySettings.SetProperty(AdministrationStrings.PeerSecurityMode, peer.Security.Mode.ToString());
  237. IWmiInstance transportSecuritySettings = securitySettings.NewInstance(AdministrationStrings.PeerTransportSecuritySettings);
  238. transportSecuritySettings.SetProperty(AdministrationStrings.PeerTransportCredentialType, peer.Security.Transport.CredentialType.ToString());
  239. securitySettings.SetProperty(AdministrationStrings.Transport, transportSecuritySettings);
  240. instance.SetProperty(AdministrationStrings.Security, securitySettings);
  241. }
  242. }
  243. else if (bindingElement is PeerResolverBindingElement)
  244. {
  245. PeerResolverBindingElement baseResolver = (PeerResolverBindingElement)bindingElement;
  246. instance.SetProperty(AdministrationStrings.ReferralPolicy, baseResolver.ReferralPolicy.ToString());
  247. if (bindingElement is PeerCustomResolverBindingElement)
  248. {
  249. PeerCustomResolverBindingElement specificElement = (PeerCustomResolverBindingElement)bindingElement;
  250. if (specificElement.Address != null)
  251. instance.SetProperty(AdministrationStrings.Address, specificElement.Address.ToString());
  252. if (specificElement.Binding != null)
  253. instance.SetProperty(AdministrationStrings.Binding, specificElement.Binding.ToString());
  254. }
  255. }
  256. #pragma warning restore 0618
  257. else if (bindingElement is ReliableSessionBindingElement)
  258. {
  259. ReliableSessionBindingElement specificElement = (ReliableSessionBindingElement)bindingElement;
  260. instance.SetProperty(AdministrationStrings.AcknowledgementInterval, specificElement.AcknowledgementInterval);
  261. instance.SetProperty(AdministrationStrings.FlowControlEnabled, specificElement.FlowControlEnabled);
  262. instance.SetProperty(AdministrationStrings.InactivityTimeout, specificElement.InactivityTimeout);
  263. instance.SetProperty(AdministrationStrings.MaxPendingChannels, specificElement.MaxPendingChannels);
  264. instance.SetProperty(AdministrationStrings.MaxRetryCount, specificElement.MaxRetryCount);
  265. instance.SetProperty(AdministrationStrings.MaxTransferWindowSize, specificElement.MaxTransferWindowSize);
  266. instance.SetProperty(AdministrationStrings.Ordered, specificElement.Ordered);
  267. instance.SetProperty(AdministrationStrings.ReliableMessagingVersion, specificElement.ReliableMessagingVersion.ToString());
  268. }
  269. else if (bindingElement is SecurityBindingElement)
  270. {
  271. SecurityBindingElement specificElement = (SecurityBindingElement)bindingElement;
  272. instance.SetProperty(AdministrationStrings.AllowInsecureTransport, specificElement.AllowInsecureTransport);
  273. instance.SetProperty(AdministrationStrings.DefaultAlgorithmSuite, specificElement.DefaultAlgorithmSuite.ToString());
  274. instance.SetProperty(AdministrationStrings.EnableUnsecuredResponse, specificElement.EnableUnsecuredResponse);
  275. instance.SetProperty(AdministrationStrings.IncludeTimestamp, specificElement.IncludeTimestamp);
  276. instance.SetProperty(AdministrationStrings.KeyEntropyMode, specificElement.KeyEntropyMode.ToString());
  277. instance.SetProperty(AdministrationStrings.SecurityHeaderLayout, specificElement.SecurityHeaderLayout.ToString());
  278. instance.SetProperty(AdministrationStrings.MessageSecurityVersion, specificElement.MessageSecurityVersion.ToString());
  279. IWmiInstance localServiceSecuritySettings = instance.NewInstance(AdministrationStrings.LocalServiceSecuritySettings);
  280. localServiceSecuritySettings.SetProperty(AdministrationStrings.DetectReplays, specificElement.LocalServiceSettings.DetectReplays);
  281. localServiceSecuritySettings.SetProperty(AdministrationStrings.InactivityTimeout, specificElement.LocalServiceSettings.InactivityTimeout);
  282. localServiceSecuritySettings.SetProperty(AdministrationStrings.IssuedCookieLifetime, specificElement.LocalServiceSettings.IssuedCookieLifetime);
  283. localServiceSecuritySettings.SetProperty(AdministrationStrings.MaxCachedCookies, specificElement.LocalServiceSettings.MaxCachedCookies);
  284. localServiceSecuritySettings.SetProperty(AdministrationStrings.MaxClockSkew, specificElement.LocalServiceSettings.MaxClockSkew);
  285. localServiceSecuritySettings.SetProperty(AdministrationStrings.MaxPendingSessions, specificElement.LocalServiceSettings.MaxPendingSessions);
  286. localServiceSecuritySettings.SetProperty(AdministrationStrings.MaxStatefulNegotiations, specificElement.LocalServiceSettings.MaxStatefulNegotiations);
  287. localServiceSecuritySettings.SetProperty(AdministrationStrings.NegotiationTimeout, specificElement.LocalServiceSettings.NegotiationTimeout);
  288. localServiceSecuritySettings.SetProperty(AdministrationStrings.ReconnectTransportOnFailure, specificElement.LocalServiceSettings.ReconnectTransportOnFailure);
  289. localServiceSecuritySettings.SetProperty(AdministrationStrings.ReplayCacheSize, specificElement.LocalServiceSettings.ReplayCacheSize);
  290. localServiceSecuritySettings.SetProperty(AdministrationStrings.ReplayWindow, specificElement.LocalServiceSettings.ReplayWindow);
  291. localServiceSecuritySettings.SetProperty(AdministrationStrings.SessionKeyRenewalInterval, specificElement.LocalServiceSettings.SessionKeyRenewalInterval);
  292. localServiceSecuritySettings.SetProperty(AdministrationStrings.SessionKeyRolloverInterval, specificElement.LocalServiceSettings.SessionKeyRolloverInterval);
  293. localServiceSecuritySettings.SetProperty(AdministrationStrings.TimestampValidityDuration, specificElement.LocalServiceSettings.TimestampValidityDuration);
  294. instance.SetProperty(AdministrationStrings.LocalServiceSecuritySettings, localServiceSecuritySettings);
  295. if (bindingElement is AsymmetricSecurityBindingElement)
  296. {
  297. AsymmetricSecurityBindingElement specificElement1 = (AsymmetricSecurityBindingElement)bindingElement;
  298. instance.SetProperty(AdministrationStrings.MessageProtectionOrder, specificElement1.MessageProtectionOrder.ToString());
  299. instance.SetProperty(AdministrationStrings.RequireSignatureConfirmation, specificElement1.RequireSignatureConfirmation);
  300. }
  301. else if (bindingElement is SymmetricSecurityBindingElement)
  302. {
  303. SymmetricSecurityBindingElement specificElement1 = (SymmetricSecurityBindingElement)bindingElement;
  304. instance.SetProperty(AdministrationStrings.MessageProtectionOrder, specificElement1.MessageProtectionOrder.ToString());
  305. instance.SetProperty(AdministrationStrings.RequireSignatureConfirmation, specificElement1.RequireSignatureConfirmation);
  306. }
  307. }
  308. else if (bindingElement is WindowsStreamSecurityBindingElement)
  309. {
  310. WindowsStreamSecurityBindingElement specificElement
  311. = (WindowsStreamSecurityBindingElement)bindingElement;
  312. instance.SetProperty(AdministrationStrings.ProtectionLevel, specificElement.ProtectionLevel.ToString());
  313. }
  314. else if (bindingElement is SslStreamSecurityBindingElement)
  315. {
  316. SslStreamSecurityBindingElement specificElement = (SslStreamSecurityBindingElement)bindingElement;
  317. instance.SetProperty(AdministrationStrings.RequireClientCertificate, specificElement.RequireClientCertificate);
  318. }
  319. else if (bindingElement is CompositeDuplexBindingElement)
  320. {
  321. CompositeDuplexBindingElement specificElement = (CompositeDuplexBindingElement)bindingElement;
  322. if (specificElement.ClientBaseAddress != null)
  323. {
  324. instance.SetProperty(AdministrationStrings.ClientBaseAddress, specificElement.ClientBaseAddress.AbsoluteUri);
  325. }
  326. }
  327. else if (bindingElement is OneWayBindingElement)
  328. {
  329. OneWayBindingElement oneWay = (OneWayBindingElement)bindingElement;
  330. IWmiInstance channelPoolSettings = instance.NewInstance(AdministrationStrings.ChannelPoolSettings);
  331. channelPoolSettings.SetProperty(AdministrationStrings.IdleTimeout, oneWay.ChannelPoolSettings.IdleTimeout);
  332. channelPoolSettings.SetProperty(AdministrationStrings.LeaseTimeout, oneWay.ChannelPoolSettings.LeaseTimeout);
  333. channelPoolSettings.SetProperty(AdministrationStrings.MaxOutboundChannelsPerEndpoint, oneWay.ChannelPoolSettings.MaxOutboundChannelsPerEndpoint);
  334. instance.SetProperty(AdministrationStrings.ChannelPoolSettings, channelPoolSettings);
  335. instance.SetProperty(AdministrationStrings.PacketRoutable, oneWay.PacketRoutable);
  336. instance.SetProperty(AdministrationStrings.MaxAcceptedChannels, oneWay.MaxAcceptedChannels);
  337. }
  338. else if (bindingElement is MessageEncodingBindingElement)
  339. {
  340. MessageEncodingBindingElement encodingElement = (MessageEncodingBindingElement)bindingElement;
  341. instance.SetProperty(AdministrationStrings.MessageVersion, encodingElement.MessageVersion.ToString());
  342. if (bindingElement is BinaryMessageEncodingBindingElement)
  343. {
  344. BinaryMessageEncodingBindingElement specificElement = (BinaryMessageEncodingBindingElement)bindingElement;
  345. instance.SetProperty(AdministrationStrings.MaxSessionSize, specificElement.MaxSessionSize);
  346. instance.SetProperty(AdministrationStrings.MaxReadPoolSize, specificElement.MaxReadPoolSize);
  347. instance.SetProperty(AdministrationStrings.MaxWritePoolSize, specificElement.MaxWritePoolSize);
  348. if (null != specificElement.ReaderQuotas)
  349. {
  350. FillReaderQuotas(instance, specificElement.ReaderQuotas);
  351. }
  352. instance.SetProperty(AdministrationStrings.CompressionFormat, specificElement.CompressionFormat.ToString());
  353. }
  354. else if (bindingElement is TextMessageEncodingBindingElement)
  355. {
  356. TextMessageEncodingBindingElement specificElement = (TextMessageEncodingBindingElement)bindingElement;
  357. instance.SetProperty(AdministrationStrings.Encoding, specificElement.WriteEncoding.WebName);
  358. instance.SetProperty(AdministrationStrings.MaxReadPoolSize, specificElement.MaxReadPoolSize);
  359. instance.SetProperty(AdministrationStrings.MaxWritePoolSize, specificElement.MaxWritePoolSize);
  360. if (null != specificElement.ReaderQuotas)
  361. {
  362. FillReaderQuotas(instance, specificElement.ReaderQuotas);
  363. }
  364. }
  365. else if (bindingElement is MtomMessageEncodingBindingElement)
  366. {
  367. MtomMessageEncodingBindingElement specificElement = (MtomMessageEncodingBindingElement)bindingElement;
  368. instance.SetProperty(AdministrationStrings.Encoding, specificElement.WriteEncoding.WebName);
  369. instance.SetProperty(AdministrationStrings.MessageVersion, specificElement.MessageVersion.ToString());
  370. instance.SetProperty(AdministrationStrings.MaxReadPoolSize, specificElement.MaxReadPoolSize);
  371. instance.SetProperty(AdministrationStrings.MaxWritePoolSize, specificElement.MaxWritePoolSize);
  372. if (null != specificElement.ReaderQuotas)
  373. {
  374. FillReaderQuotas(instance, specificElement.ReaderQuotas);
  375. }
  376. }
  377. }
  378. else if (bindingElement is TransactionFlowBindingElement)
  379. {
  380. TransactionFlowBindingElement specificElement = (TransactionFlowBindingElement)bindingElement;
  381. instance.SetProperty(AdministrationStrings.TransactionFlow, specificElement.Transactions);
  382. instance.SetProperty(AdministrationStrings.TransactionProtocol, specificElement.TransactionProtocol.ToString());
  383. instance.SetProperty(AdministrationStrings.AllowWildcardAction, specificElement.AllowWildcardAction);
  384. }
  385. else if (bindingElement is PrivacyNoticeBindingElement)
  386. {
  387. PrivacyNoticeBindingElement specificElement = (PrivacyNoticeBindingElement)bindingElement;
  388. instance.SetProperty(AdministrationStrings.Url, specificElement.Url.ToString());
  389. instance.SetProperty(AdministrationStrings.PrivacyNoticeVersion, specificElement.Version);
  390. }
  391. }
  392. }
  393. static void FillBehaviorsInfo(EndpointInfo info, IWmiInstance instance)
  394. {
  395. Fx.Assert(null != instance, "");
  396. List<IWmiInstance> behaviors = new List<IWmiInstance>(info.Behaviors.Count);
  397. foreach (IEndpointBehavior behavior in info.Behaviors)
  398. {
  399. IWmiInstance behaviorInstance;
  400. FillBehaviorInfo(behavior, instance, out behaviorInstance);
  401. if (null != behaviorInstance)
  402. {
  403. behaviors.Add(behaviorInstance);
  404. }
  405. }
  406. instance.SetProperty(AdministrationStrings.Behaviors, behaviors.ToArray());
  407. }
  408. static void FillBehaviorInfo(IEndpointBehavior behavior, IWmiInstance existingInstance, out IWmiInstance instance)
  409. {
  410. Fx.Assert(null != existingInstance, "");
  411. Fx.Assert(null != behavior, "");
  412. instance = null;
  413. if (behavior is ClientCredentials)
  414. {
  415. instance = existingInstance.NewInstance("ClientCredentials");
  416. ClientCredentials specificBehavior = (ClientCredentials)behavior;
  417. instance.SetProperty(AdministrationStrings.SupportInteractive, specificBehavior.SupportInteractive);
  418. if (specificBehavior.ClientCertificate != null && specificBehavior.ClientCertificate.Certificate != null)
  419. {
  420. instance.SetProperty(AdministrationStrings.ClientCertificate, specificBehavior.ClientCertificate.Certificate.ToString());
  421. }
  422. if (specificBehavior.IssuedToken != null)
  423. {
  424. string result = String.Format(CultureInfo.InvariantCulture,
  425. "{0}: {1}",
  426. AdministrationStrings.CacheIssuedTokens, specificBehavior.IssuedToken.CacheIssuedTokens);
  427. instance.SetProperty(AdministrationStrings.IssuedToken, result);
  428. }
  429. if (specificBehavior.HttpDigest != null)
  430. {
  431. string result = String.Format(CultureInfo.InvariantCulture,
  432. "{0}: {1}",
  433. AdministrationStrings.AllowedImpersonationLevel, specificBehavior.HttpDigest.AllowedImpersonationLevel.ToString());
  434. instance.SetProperty(AdministrationStrings.HttpDigest, result);
  435. }
  436. if (specificBehavior.Peer != null && specificBehavior.Peer.Certificate != null)
  437. {
  438. instance.SetProperty(AdministrationStrings.Peer, specificBehavior.Peer.Certificate.ToString(true));
  439. }
  440. if (specificBehavior.UserName != null)
  441. {
  442. instance.SetProperty(AdministrationStrings.UserName, "********");
  443. }
  444. if (specificBehavior.Windows != null)
  445. {
  446. #pragma warning disable 618 // To suppress AllowNtlm warning.
  447. string result = String.Format(CultureInfo.InvariantCulture,
  448. "{0}: {1}, {2}: {3}",
  449. AdministrationStrings.AllowedImpersonationLevel,
  450. specificBehavior.Windows.AllowedImpersonationLevel.ToString(),
  451. AdministrationStrings.AllowNtlm,
  452. specificBehavior.Windows.AllowNtlm);
  453. #pragma warning restore 618
  454. instance.SetProperty(AdministrationStrings.Windows, result);
  455. }
  456. }
  457. else if (behavior is MustUnderstandBehavior)
  458. {
  459. instance = existingInstance.NewInstance("MustUnderstandBehavior");
  460. }
  461. else if (behavior is SynchronousReceiveBehavior)
  462. {
  463. instance = existingInstance.NewInstance("SynchronousReceiveBehavior");
  464. }
  465. else if (behavior is DispatcherSynchronizationBehavior)
  466. {
  467. instance = existingInstance.NewInstance("DispatcherSynchronizationBehavior");
  468. }
  469. else if (behavior is TransactedBatchingBehavior)
  470. {
  471. instance = existingInstance.NewInstance("TransactedBatchingBehavior");
  472. instance.SetProperty(AdministrationStrings.MaxBatchSize, ((TransactedBatchingBehavior)behavior).MaxBatchSize);
  473. }
  474. else if (behavior is ClientViaBehavior)
  475. {
  476. instance = existingInstance.NewInstance("ClientViaBehavior");
  477. instance.SetProperty(AdministrationStrings.Uri, ((ClientViaBehavior)behavior).Uri.ToString());
  478. }
  479. else if (behavior is IWmiInstanceProvider)
  480. {
  481. IWmiInstanceProvider instanceProvider = (IWmiInstanceProvider)behavior;
  482. instance = existingInstance.NewInstance(instanceProvider.GetInstanceType());
  483. instanceProvider.FillInstance(instance);
  484. }
  485. else
  486. {
  487. instance = existingInstance.NewInstance("Behavior");
  488. }
  489. if (null != instance)
  490. {
  491. instance.SetProperty(AdministrationStrings.Type, behavior.GetType().FullName);
  492. }
  493. }
  494. static void FillReaderQuotas(IWmiInstance instance, XmlDictionaryReaderQuotas readerQuotas)
  495. {
  496. Fx.Assert(null != instance, "");
  497. Fx.Assert(null != readerQuotas, "");
  498. IWmiInstance readerQuotasInstance = instance.NewInstance(AdministrationStrings.XmlDictionaryReaderQuotas);
  499. readerQuotasInstance.SetProperty(AdministrationStrings.MaxArrayLength, readerQuotas.MaxArrayLength);
  500. readerQuotasInstance.SetProperty(AdministrationStrings.MaxBytesPerRead, readerQuotas.MaxBytesPerRead);
  501. readerQuotasInstance.SetProperty(AdministrationStrings.MaxDepth, readerQuotas.MaxDepth);
  502. readerQuotasInstance.SetProperty(AdministrationStrings.MaxNameTableCharCount, readerQuotas.MaxNameTableCharCount);
  503. readerQuotasInstance.SetProperty(AdministrationStrings.MaxStringContentLength, readerQuotas.MaxStringContentLength);
  504. instance.SetProperty(AdministrationStrings.ReaderQuotas, readerQuotasInstance);
  505. }
  506. static void FillExtendedProtectionPolicy(IWmiInstance instance, ExtendedProtectionPolicy policy)
  507. {
  508. IWmiInstance extendedProtectionPolicy = instance.NewInstance(AdministrationStrings.ExtendedProtectionPolicy);
  509. extendedProtectionPolicy.SetProperty(AdministrationStrings.PolicyEnforcement, policy.PolicyEnforcement.ToString());
  510. extendedProtectionPolicy.SetProperty(AdministrationStrings.ProtectionScenario, policy.ProtectionScenario.ToString());
  511. if (policy.CustomServiceNames != null)
  512. {
  513. List<string> serviceNames = new List<string>(policy.CustomServiceNames.Count);
  514. foreach (string serviceName in policy.CustomServiceNames)
  515. {
  516. serviceNames.Add(serviceName);
  517. }
  518. extendedProtectionPolicy.SetProperty(AdministrationStrings.CustomServiceNames, serviceNames.ToArray());
  519. }
  520. if (policy.CustomChannelBinding != null)
  521. {
  522. extendedProtectionPolicy.SetProperty(AdministrationStrings.CustomChannelBinding, policy.CustomChannelBinding.GetType().ToString());
  523. }
  524. instance.SetProperty(AdministrationStrings.ExtendedProtectionPolicy, extendedProtectionPolicy);
  525. }
  526. void IWmiProvider.EnumInstances(IWmiInstances instances)
  527. {
  528. Fx.Assert(null != instances, "");
  529. int processId = AppDomainInfo.Current.ProcessId;
  530. int appDomainId = AppDomainInfo.Current.Id;
  531. foreach (ServiceInfo info in new ServiceInfoCollection(ManagementExtension.Services))
  532. {
  533. foreach (EndpointInfo endpointInfo in info.Endpoints)
  534. {
  535. IWmiInstance instance = instances.NewInstance(null);
  536. instance.SetProperty(AdministrationStrings.ProcessId, processId);
  537. instance.SetProperty(AdministrationStrings.AppDomainId, appDomainId);
  538. FillEndpointInfo(endpointInfo, instance);
  539. instances.AddInstance(instance);
  540. }
  541. }
  542. }
  543. bool IWmiProvider.GetInstance(IWmiInstance instance)
  544. {
  545. Fx.Assert(null != instance, "");
  546. bool bFound = false;
  547. if (OwnInstance(instance))
  548. {
  549. string address = (string)instance.GetProperty(AdministrationStrings.ListenUri);
  550. string contractName = (string)instance.GetProperty(AdministrationStrings.ContractName);
  551. EndpointInfo endpointInfo = FindEndpoint(address, contractName);
  552. if (null != endpointInfo)
  553. {
  554. FillEndpointInfo(endpointInfo, instance);
  555. bFound = true;
  556. }
  557. }
  558. return bFound;
  559. }
  560. bool IWmiProvider.InvokeMethod(IWmiMethodContext method)
  561. {
  562. bool ownInstance = OwnInstance(method.Instance);
  563. if (ownInstance)
  564. {
  565. if (method.MethodName == AdministrationStrings.GetOperationCounterInstanceName)
  566. {
  567. object argument = method.GetParameter(AdministrationStrings.Operation);
  568. string operationName = argument as string;
  569. if (String.IsNullOrEmpty(operationName))
  570. {
  571. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new WbemInvalidParameterException(AdministrationStrings.Operation));
  572. }
  573. string result = GetOperationCounterInstanceName(operationName, method.Instance);
  574. method.ReturnParameter = result;
  575. }
  576. else
  577. {
  578. throw new WbemInvalidMethodException();
  579. }
  580. }
  581. return ownInstance;
  582. }
  583. EndpointInfo FindEndpoint(string address, string contractName)
  584. {
  585. foreach (ServiceInfo info in new ServiceInfoCollection(ManagementExtension.Services))
  586. {
  587. foreach (EndpointInfo endpointInfo in info.Endpoints)
  588. {
  589. if (null != endpointInfo.ListenUri && String.Equals(endpointInfo.ListenUri.ToString(), address, StringComparison.OrdinalIgnoreCase)
  590. && null != endpointInfo.Contract && null != endpointInfo.Contract.Name && String.CompareOrdinal(endpointInfo.Contract.Name, contractName) == 0)
  591. {
  592. return endpointInfo;
  593. }
  594. }
  595. }
  596. return null;
  597. }
  598. string GetOperationCounterInstanceName(string operationName, IWmiInstance endpointInstance)
  599. {
  600. Fx.Assert(null != endpointInstance, "");
  601. string address = (string)endpointInstance.GetProperty(AdministrationStrings.ListenUri);
  602. string contractName = (string)endpointInstance.GetProperty(AdministrationStrings.ContractName);
  603. EndpointInfo endpointInfo = FindEndpoint(address, contractName);
  604. string result = String.Empty;
  605. if (PerformanceCounters.PerformanceCountersEnabled && null != endpointInfo)
  606. {
  607. result = OperationPerformanceCounters.CreateFriendlyInstanceName(endpointInfo.ServiceName, endpointInfo.Contract.Name, operationName, endpointInfo.Address.AbsoluteUri.ToUpperInvariant());
  608. }
  609. return result;
  610. }
  611. bool OwnInstance(IWmiInstance instance)
  612. {
  613. return (int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId
  614. && (int)instance.GetProperty(AdministrationStrings.AppDomainId) == AppDomainInfo.Current.Id;
  615. }
  616. }
  617. }