e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
376 lines
22 KiB
C#
376 lines
22 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
|
|
namespace System.ServiceModel.Administration
|
|
{
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Globalization;
|
|
using System.Runtime;
|
|
using System.Runtime.Diagnostics;
|
|
using System.Security.Cryptography.X509Certificates;
|
|
using System.ServiceModel;
|
|
using System.ServiceModel.Activation;
|
|
using System.ServiceModel.Channels;
|
|
using System.ServiceModel.Description;
|
|
using System.ServiceModel.Diagnostics;
|
|
|
|
class ServiceInstanceProvider : ProviderBase, IWmiProvider
|
|
{
|
|
void IWmiProvider.EnumInstances(IWmiInstances instances)
|
|
{
|
|
Fx.Assert(null != instances, "");
|
|
int processId = AppDomainInfo.Current.ProcessId;
|
|
foreach (ServiceInfo info in new ServiceInfoCollection(ManagementExtension.Services))
|
|
{
|
|
IWmiInstance instance = instances.NewInstance(null);
|
|
instance.SetProperty(AdministrationStrings.DistinguishedName, info.DistinguishedName);
|
|
instance.SetProperty(AdministrationStrings.ProcessId, processId);
|
|
|
|
FillServiceInfo(info, instance);
|
|
instances.AddInstance(instance);
|
|
}
|
|
}
|
|
|
|
bool IWmiProvider.GetInstance(IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
bool bFound = false;
|
|
if ((int)instance.GetProperty(AdministrationStrings.ProcessId) == AppDomainInfo.Current.ProcessId)
|
|
{
|
|
foreach (ServiceInfo info in new ServiceInfoCollection(ManagementExtension.Services))
|
|
{
|
|
if (String.Equals((string)instance.GetProperty(AdministrationStrings.DistinguishedName), info.DistinguishedName, StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
FillServiceInfo(info, instance);
|
|
bFound = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return bFound;
|
|
}
|
|
|
|
internal static string GetReference(ServiceInfo serviceInfo)
|
|
{
|
|
Fx.Assert(null != serviceInfo, "");
|
|
return String.Format(CultureInfo.InvariantCulture, AdministrationStrings.Service +
|
|
"." +
|
|
AdministrationStrings.DistinguishedName +
|
|
"='{0}'," +
|
|
AdministrationStrings.ProcessId +
|
|
"={1}",
|
|
serviceInfo.DistinguishedName,
|
|
AppDomainInfo.Current.ProcessId);
|
|
}
|
|
|
|
internal static IWmiInstance GetAppDomainInfo(IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
IWmiInstance appDomainInfo = instance.NewInstance(AdministrationStrings.AppDomainInfo);
|
|
if (null != appDomainInfo)
|
|
{
|
|
AppDomainInstanceProvider.FillAppDomainInfo(appDomainInfo);
|
|
}
|
|
|
|
return appDomainInfo;
|
|
}
|
|
|
|
void FillBehaviorsInfo(ServiceInfo info, IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
List<IWmiInstance> behaviors = new List<IWmiInstance>(info.Behaviors.Count);
|
|
foreach (IServiceBehavior behavior in info.Behaviors)
|
|
{
|
|
IWmiInstance behaviorInstance;
|
|
FillBehaviorInfo(behavior, instance, out behaviorInstance);
|
|
if (null != behaviorInstance)
|
|
{
|
|
behaviors.Add(behaviorInstance);
|
|
}
|
|
}
|
|
instance.SetProperty(AdministrationStrings.Behaviors, behaviors.ToArray());
|
|
}
|
|
|
|
void FillChannelsInfo(ServiceInfo info, IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
Fx.Assert(null != info, "");
|
|
int channelsCount = 0;
|
|
|
|
List<IWmiInstance> instances = new List<IWmiInstance>();
|
|
IEnumerable<InstanceContext> contexts = info.Service.GetInstanceContexts();
|
|
foreach (InstanceContext instanceContext in contexts)
|
|
{
|
|
lock (instanceContext.ThisLock)
|
|
{
|
|
channelsCount += instanceContext.WmiChannels.Count;
|
|
foreach (IChannel channel in instanceContext.WmiChannels)
|
|
{
|
|
IWmiInstance channelInstance = instance.NewInstance(AdministrationStrings.Channel);
|
|
FillChannelInfo(channel, channelInstance);
|
|
instances.Add(channelInstance);
|
|
}
|
|
}
|
|
}
|
|
|
|
instance.SetProperty(AdministrationStrings.Channels, instances.ToArray());
|
|
}
|
|
|
|
static void FillExtensionsInfo(ServiceInfo info, IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
Fx.Assert(null != info, "");
|
|
ProviderBase.FillCollectionInfo(info.Service.Extensions, instance, AdministrationStrings.Extensions);
|
|
}
|
|
|
|
void FillServiceInfo(ServiceInfo info, IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
Fx.Assert(null != info, "");
|
|
ProviderBase.FillCollectionInfo(info.Service.BaseAddresses, instance, AdministrationStrings.BaseAddresses);
|
|
instance.SetProperty(AdministrationStrings.CounterInstanceName, PerformanceCounters.PerformanceCountersEnabled ? ServicePerformanceCounters.GetFriendlyInstanceName(info.Service) : String.Empty);
|
|
instance.SetProperty(AdministrationStrings.ConfigurationName, info.ConfigurationName);
|
|
instance.SetProperty(AdministrationStrings.DistinguishedName, info.DistinguishedName);
|
|
instance.SetProperty(AdministrationStrings.Name, info.Name);
|
|
instance.SetProperty(AdministrationStrings.Namespace, info.Namespace);
|
|
instance.SetProperty(AdministrationStrings.Metadata, info.Metadata);
|
|
instance.SetProperty(AdministrationStrings.Opened, ManagementExtension.GetTimeOpened(info.Service));
|
|
|
|
|
|
FillBehaviorsInfo(info, instance);
|
|
FillExtensionsInfo(info, instance);
|
|
FillChannelsInfo(info, instance);
|
|
}
|
|
|
|
void FillBehaviorInfo(IServiceBehavior behavior, IWmiInstance existingInstance, out IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != existingInstance, "");
|
|
Fx.Assert(null != behavior, "");
|
|
instance = null;
|
|
if (behavior is AspNetCompatibilityRequirementsAttribute)
|
|
{
|
|
instance = existingInstance.NewInstance("AspNetCompatibilityRequirementsAttribute");
|
|
AspNetCompatibilityRequirementsAttribute specificBehavior = (AspNetCompatibilityRequirementsAttribute)behavior;
|
|
instance.SetProperty(AdministrationStrings.RequirementsMode, specificBehavior.RequirementsMode.ToString());
|
|
}
|
|
else if (behavior is ServiceCredentials)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceCredentials");
|
|
ServiceCredentials specificBehavior = (ServiceCredentials)behavior;
|
|
if (specificBehavior.ClientCertificate != null && specificBehavior.ClientCertificate.Certificate != null)
|
|
{
|
|
string result = string.Empty;
|
|
result += String.Format(CultureInfo.InvariantCulture, "Certificate: {0}\n", specificBehavior.ClientCertificate.Certificate);
|
|
instance.SetProperty(AdministrationStrings.ClientCertificate, result);
|
|
}
|
|
if (specificBehavior.IssuedTokenAuthentication != null && specificBehavior.IssuedTokenAuthentication.KnownCertificates != null)
|
|
{
|
|
string result = string.Empty;
|
|
result += String.Format(CultureInfo.InvariantCulture, "AllowUntrustedRsaIssuers: {0}\n", specificBehavior.IssuedTokenAuthentication.AllowUntrustedRsaIssuers);
|
|
result += String.Format(CultureInfo.InvariantCulture, "CertificateValidationMode: {0}\n", specificBehavior.IssuedTokenAuthentication.CertificateValidationMode);
|
|
result += String.Format(CultureInfo.InvariantCulture, "RevocationMode: {0}\n", specificBehavior.IssuedTokenAuthentication.RevocationMode);
|
|
result += String.Format(CultureInfo.InvariantCulture, "TrustedStoreLocation: {0}\n", specificBehavior.IssuedTokenAuthentication.TrustedStoreLocation);
|
|
foreach (X509Certificate2 certificate in specificBehavior.IssuedTokenAuthentication.KnownCertificates)
|
|
{
|
|
if (certificate != null)
|
|
{
|
|
result += String.Format(CultureInfo.InvariantCulture, "Known certificate: {0}\n", certificate.FriendlyName);
|
|
}
|
|
}
|
|
result += String.Format(CultureInfo.InvariantCulture, "AudienceUriMode: {0}\n", specificBehavior.IssuedTokenAuthentication.AudienceUriMode);
|
|
if (specificBehavior.IssuedTokenAuthentication.AllowedAudienceUris != null)
|
|
{
|
|
foreach (string str in specificBehavior.IssuedTokenAuthentication.AllowedAudienceUris)
|
|
{
|
|
if (str != null)
|
|
{
|
|
result += String.Format(CultureInfo.InvariantCulture, "Allowed Uri: {0}\n", str);
|
|
}
|
|
}
|
|
}
|
|
|
|
instance.SetProperty(AdministrationStrings.IssuedTokenAuthentication, result);
|
|
}
|
|
if (specificBehavior.Peer != null && specificBehavior.Peer.Certificate != null)
|
|
{
|
|
string result = string.Empty;
|
|
result += String.Format(CultureInfo.InvariantCulture, "Certificate: {0}\n", specificBehavior.Peer.Certificate.ToString(true));
|
|
instance.SetProperty(AdministrationStrings.Peer, result);
|
|
}
|
|
if (specificBehavior.SecureConversationAuthentication != null && specificBehavior.SecureConversationAuthentication.SecurityContextClaimTypes != null)
|
|
{
|
|
string result = string.Empty;
|
|
foreach (Type claimType in specificBehavior.SecureConversationAuthentication.SecurityContextClaimTypes)
|
|
{
|
|
if (claimType != null)
|
|
{
|
|
result += String.Format(CultureInfo.InvariantCulture, "ClaimType: {0}\n", claimType);
|
|
}
|
|
}
|
|
instance.SetProperty(AdministrationStrings.SecureConversationAuthentication, result);
|
|
}
|
|
if (specificBehavior.ServiceCertificate != null && specificBehavior.ServiceCertificate.Certificate != null)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.ServiceCertificate, specificBehavior.ServiceCertificate.Certificate.ToString());
|
|
}
|
|
if (specificBehavior.UserNameAuthentication != null)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.UserNameAuthentication, String.Format(CultureInfo.InvariantCulture, "{0}: {1}", AdministrationStrings.ValidationMode, specificBehavior.UserNameAuthentication.UserNamePasswordValidationMode.ToString()));
|
|
}
|
|
if (specificBehavior.WindowsAuthentication != null)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.WindowsAuthentication, String.Format(CultureInfo.InvariantCulture, "{0}: {1}", AdministrationStrings.AllowAnonymous, specificBehavior.WindowsAuthentication.AllowAnonymousLogons.ToString()));
|
|
}
|
|
}
|
|
else if (behavior is ServiceAuthorizationBehavior)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceAuthorizationBehavior");
|
|
ServiceAuthorizationBehavior specificBehavior = (ServiceAuthorizationBehavior)behavior;
|
|
instance.SetProperty(AdministrationStrings.ImpersonateCallerForAllOperations, specificBehavior.ImpersonateCallerForAllOperations);
|
|
instance.SetProperty(AdministrationStrings.ImpersonateOnSerializingReply, specificBehavior.ImpersonateOnSerializingReply);
|
|
if (specificBehavior.RoleProvider != null)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.RoleProvider, specificBehavior.RoleProvider.ToString());
|
|
}
|
|
if (specificBehavior.ServiceAuthorizationManager != null)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.ServiceAuthorizationManager, specificBehavior.ServiceAuthorizationManager.ToString());
|
|
}
|
|
instance.SetProperty(AdministrationStrings.PrincipalPermissionMode, specificBehavior.PrincipalPermissionMode.ToString());
|
|
}
|
|
else if (behavior is ServiceSecurityAuditBehavior)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceSecurityAuditBehavior");
|
|
ServiceSecurityAuditBehavior specificBehavior = (ServiceSecurityAuditBehavior)behavior;
|
|
instance.SetProperty(AdministrationStrings.AuditLogLocation, specificBehavior.AuditLogLocation.ToString());
|
|
instance.SetProperty(AdministrationStrings.SuppressAuditFailure, specificBehavior.SuppressAuditFailure);
|
|
instance.SetProperty(AdministrationStrings.ServiceAuthorizationAuditLevel, specificBehavior.ServiceAuthorizationAuditLevel.ToString());
|
|
instance.SetProperty(AdministrationStrings.MessageAuthenticationAuditLevel, specificBehavior.MessageAuthenticationAuditLevel.ToString());
|
|
}
|
|
else if (behavior is ServiceBehaviorAttribute)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceBehaviorAttribute");
|
|
ServiceBehaviorAttribute serviceBehavior = (ServiceBehaviorAttribute)behavior;
|
|
instance.SetProperty(AdministrationStrings.AddressFilterMode, serviceBehavior.AddressFilterMode.ToString());
|
|
instance.SetProperty(AdministrationStrings.AutomaticSessionShutdown, serviceBehavior.AutomaticSessionShutdown);
|
|
instance.SetProperty(AdministrationStrings.ConcurrencyMode, serviceBehavior.ConcurrencyMode.ToString());
|
|
instance.SetProperty(AdministrationStrings.ConfigurationName, serviceBehavior.ConfigurationName);
|
|
instance.SetProperty(AdministrationStrings.EnsureOrderedDispatch, serviceBehavior.EnsureOrderedDispatch);
|
|
instance.SetProperty(AdministrationStrings.IgnoreExtensionDataObject, serviceBehavior.IgnoreExtensionDataObject);
|
|
instance.SetProperty(AdministrationStrings.IncludeExceptionDetailInFaults, serviceBehavior.IncludeExceptionDetailInFaults);
|
|
instance.SetProperty(AdministrationStrings.InstanceContextMode, serviceBehavior.InstanceContextMode.ToString());
|
|
instance.SetProperty(AdministrationStrings.MaxItemsInObjectGraph, serviceBehavior.MaxItemsInObjectGraph);
|
|
instance.SetProperty(AdministrationStrings.Name, serviceBehavior.Name);
|
|
instance.SetProperty(AdministrationStrings.Namespace, serviceBehavior.Namespace);
|
|
instance.SetProperty(AdministrationStrings.ReleaseServiceInstanceOnTransactionComplete, serviceBehavior.ReleaseServiceInstanceOnTransactionComplete);
|
|
instance.SetProperty(AdministrationStrings.TransactionAutoCompleteOnSessionClose, serviceBehavior.TransactionAutoCompleteOnSessionClose);
|
|
instance.SetProperty(AdministrationStrings.TransactionIsolationLevel, serviceBehavior.TransactionIsolationLevel.ToString());
|
|
if (serviceBehavior.TransactionTimeoutSet)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.TransactionTimeout, serviceBehavior.TransactionTimeoutTimespan);
|
|
}
|
|
instance.SetProperty(AdministrationStrings.UseSynchronizationContext, serviceBehavior.UseSynchronizationContext);
|
|
instance.SetProperty(AdministrationStrings.ValidateMustUnderstand, serviceBehavior.ValidateMustUnderstand);
|
|
}
|
|
else if (behavior is ServiceDebugBehavior)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceDebugBehavior");
|
|
ServiceDebugBehavior specificBehavior = (ServiceDebugBehavior)behavior;
|
|
if (null != specificBehavior.HttpHelpPageUrl)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.HttpHelpPageUrl, specificBehavior.HttpHelpPageUrl.ToString());
|
|
}
|
|
instance.SetProperty(AdministrationStrings.HttpHelpPageEnabled, specificBehavior.HttpHelpPageEnabled);
|
|
if (null != specificBehavior.HttpsHelpPageUrl)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.HttpsHelpPageUrl, specificBehavior.HttpsHelpPageUrl.ToString());
|
|
}
|
|
instance.SetProperty(AdministrationStrings.HttpsHelpPageEnabled, specificBehavior.HttpsHelpPageEnabled);
|
|
instance.SetProperty(AdministrationStrings.IncludeExceptionDetailInFaults, specificBehavior.IncludeExceptionDetailInFaults);
|
|
}
|
|
else if (behavior is ServiceMetadataBehavior)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceMetadataBehavior");
|
|
ServiceMetadataBehavior metadataBehavior = (ServiceMetadataBehavior)behavior;
|
|
if (null != metadataBehavior.ExternalMetadataLocation)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.ExternalMetadataLocation, metadataBehavior.ExternalMetadataLocation.ToString());
|
|
}
|
|
instance.SetProperty(AdministrationStrings.HttpGetEnabled, metadataBehavior.HttpGetEnabled);
|
|
if (null != metadataBehavior.HttpGetUrl)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.HttpGetUrl, metadataBehavior.HttpGetUrl.ToString());
|
|
}
|
|
instance.SetProperty(AdministrationStrings.HttpsGetEnabled, metadataBehavior.HttpsGetEnabled);
|
|
if (null != metadataBehavior.HttpsGetUrl)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.HttpsGetUrl, metadataBehavior.HttpsGetUrl.ToString());
|
|
}
|
|
FillMetadataExporterInfo(instance, metadataBehavior.MetadataExporter);
|
|
}
|
|
else if (behavior is ServiceThrottlingBehavior)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceThrottlingBehavior");
|
|
ServiceThrottlingBehavior throttlingBehavior = (ServiceThrottlingBehavior)behavior;
|
|
instance.SetProperty(AdministrationStrings.MaxConcurrentCalls, throttlingBehavior.MaxConcurrentCalls);
|
|
instance.SetProperty(AdministrationStrings.MaxConcurrentSessions, throttlingBehavior.MaxConcurrentSessions);
|
|
instance.SetProperty(AdministrationStrings.MaxConcurrentInstances, throttlingBehavior.MaxConcurrentInstances);
|
|
}
|
|
else if (behavior is ServiceTimeoutsBehavior)
|
|
{
|
|
instance = existingInstance.NewInstance("ServiceTimeoutsBehavior");
|
|
ServiceTimeoutsBehavior specificBehavior = (ServiceTimeoutsBehavior)behavior;
|
|
instance.SetProperty(AdministrationStrings.TransactionTimeout, specificBehavior.TransactionTimeout);
|
|
}
|
|
else if (behavior is IWmiInstanceProvider)
|
|
{
|
|
IWmiInstanceProvider instanceProvider = (IWmiInstanceProvider)behavior;
|
|
instance = existingInstance.NewInstance(instanceProvider.GetInstanceType());
|
|
instanceProvider.FillInstance(instance);
|
|
}
|
|
else
|
|
{
|
|
instance = existingInstance.NewInstance("Behavior");
|
|
}
|
|
if (null != instance)
|
|
{
|
|
instance.SetProperty(AdministrationStrings.Type, behavior.GetType().FullName);
|
|
}
|
|
}
|
|
|
|
void FillMetadataExporterInfo(IWmiInstance instance, MetadataExporter exporter)
|
|
{
|
|
DiagnosticUtility.EventLog.LogEvent(TraceEventType.Information, (ushort)System.Runtime.Diagnostics.EventLogCategory.Wmi, (uint)System.Runtime.Diagnostics.EventLogEventId.MessageLoggingOn, true, "metadata exporter called");
|
|
Fx.Assert(null != instance, "");
|
|
Fx.Assert(null != exporter, "");
|
|
IWmiInstance metadataExporterInstance = instance.NewInstance(AdministrationStrings.MetadataExporter);
|
|
metadataExporterInstance.SetProperty(AdministrationStrings.PolicyVersion, exporter.PolicyVersion.ToString());
|
|
instance.SetProperty(AdministrationStrings.MetadataExportInfo, metadataExporterInstance);
|
|
}
|
|
|
|
|
|
void FillChannelInfo(IChannel channel, IWmiInstance instance)
|
|
{
|
|
Fx.Assert(null != instance, "");
|
|
Fx.Assert(null != channel, "");
|
|
instance.SetProperty(AdministrationStrings.Type, channel.GetType().ToString());
|
|
|
|
ServiceChannel serviceChannel = ServiceChannelFactory.GetServiceChannel(channel);
|
|
if (null != serviceChannel)
|
|
{
|
|
string uri = serviceChannel.RemoteAddress == null ? String.Empty : serviceChannel.RemoteAddress.ToString();
|
|
instance.SetProperty(AdministrationStrings.RemoteAddress, uri);
|
|
string contractName = null != serviceChannel.ClientRuntime ? serviceChannel.ClientRuntime.ContractName : String.Empty;
|
|
string remoteEndpoint = EndpointInstanceProvider.EndpointReference(uri, contractName, false);
|
|
instance.SetProperty(AdministrationStrings.RemoteEndpoint, remoteEndpoint);
|
|
instance.SetProperty(AdministrationStrings.LocalAddress, serviceChannel.LocalAddress == null ? String.Empty : serviceChannel.LocalAddress.ToString());
|
|
instance.SetProperty(AdministrationStrings.SessionId, ((IContextChannel)serviceChannel).SessionId);
|
|
}
|
|
}
|
|
}
|
|
}
|