Microsoft.Exchange.2010.ClientAccessComponent.DiscoveryDS (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource System.CommandExecuterDiscoveryDataSource Default

Overrideable Parameters:

IDParameterTypeSelector
IntervalSecondsint$Config/IntervalSeconds$
VerboseLoggingbool$Config/VerboseLogging$

Source Code:

<DataSourceModuleType ID="Microsoft.Exchange.2010.ClientAccessComponent.DiscoveryDS" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="VerboseLogging" type="xsd:boolean"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="VerboseLogging" Selector="$Config/VerboseLogging$" ParameterType="bool"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="System!System.CommandExecuterDiscoveryDataSource">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<ApplicationName>%windir%\System32\cscript.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>//Nologo $file/MicrosoftExchangeClientAccessComponentDiscovery.js$ 0 $MPElement$ $Target/Id$ $Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$ "$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/NetbiosComputerName$" "$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/ActiveDirectorySite$" "$Config/VerboseLogging$"</CommandLine>
<TimeoutSeconds>900</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>MicrosoftExchangeClientAccessComponentDiscovery.js</Name>
<Contents><Script>
// ----------------------------------------------------------------------
// Script to discover ClientAccessComponent entities.
// ----------------------------------------------------------------------

var EXPECTED_ARGUMENT_COUNT = 7;
var UNEXPECTED_ARGUMENT_COUNT_ERROR_ID = 101;

var DISCOVERY_STARTED_INF_ID = 1470;
var DISCOVERY_ENDED_INF_ID = 1471;
var DISCOVERY_PROGRESS_INF_ID = 1472;

var EVENT_SOURCE = "MicrosoftExchangeClientAccessComponentDiscovery.js";
var EVENT_TYPE_ERROR = 1;
var EVENT_TYPE_WARNING = 2;
var EVENT_TYPE_INFORMATION = 4;

var oAPI = new ActiveXObject("Mom.ScriptAPI");

var argumentsStr = "";
for (var i = 0; i &lt; WScript.Arguments.length; i++)
{
argumentsStr = argumentsStr.concat("\"", WScript.Arguments(i), "\" ");
}

if (WScript.Arguments.length!= EXPECTED_ARGUMENT_COUNT)
{
oAPI.LogScriptEvent(
EVENT_SOURCE,
UNEXPECTED_ARGUMENT_COUNT_ERROR_ID,
EVENT_TYPE_ERROR,
"Expected " + EXPECTED_ARGUMENT_COUNT + " arguments. But there were " + WScript.Arguments.length+ " arguments. Exiting script.\n Arguments: " + argumentsStr);

WScript.Quit(-1);
}

var sourceType = WScript.Arguments(0);
var sourceId = WScript.Arguments(1);
var managedEntityId = WScript.Arguments(2);
var computerPrincipalName = WScript.Arguments(3);
var computerNetbiosName = WScript.Arguments(4);
var computerActiveDirectorySite = WScript.Arguments(5);
var verboseLoggingString = WScript.Arguments(6);

// Convert variables from string to bool.
var verboseLogging = (verboseLoggingString.toLowerCase() == "true") ? true : false;

var infoOutput = "ClientAccessComponent Discovery script \n"
+ " Message: ";

main();

function main()
{
LogEvent(DISCOVERY_STARTED_INF_ID, EVENT_TYPE_INFORMATION, infoOutput + "Discovery Script started.\n Arguments: " + argumentsStr);

var discoveryData = oAPI.CreateDiscoveryData(sourceType, sourceId, managedEntityId);

// ----------------------------------------------------------------------
// Instantiate ClientAccessComponent classes.
// ----------------------------------------------------------------------
//
// Construct the ClientAccessRole class's Name key property.
var clientAccessRoleName = computerNetbiosName + " (Client Access) - " + computerActiveDirectorySite;

// Create the ClientAccessActiveSync instance.
var oCasAS = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessActiveSync']$");
oCasAS.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasAS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasAS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "ActiveSync - " + clientAccessRoleName);
discoveryData.AddInstance(oCasAS);

// Create the ClientAccessAutoDiscovery instance.
var oCasAutoDisco = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAutoDiscovery']$");
oCasAutoDisco.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasAutoDisco.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasAutoDisco.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "AutoDiscovery - " + clientAccessRoleName);
discoveryData.AddInstance(oCasAutoDisco);

// Create the ClientAccessFileDistributionService instance.
var oCasFds = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessFileDistributionService']$");
oCasFds.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasFds.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasFds.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "FDS - " + clientAccessRoleName);
discoveryData.AddInstance(oCasFds);

// Create the ClientAccessImap4 instance.
var oCasImap4 = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessImap4']$");
oCasImap4.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasImap4.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasImap4.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "IMAP4 - " + clientAccessRoleName);
discoveryData.AddInstance(oCasImap4);

// Create the ClientAccessInformationWorker instance.
var oCasIW = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessInformationWorker']$");
oCasIW.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasIW.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasIW.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "IW - " + clientAccessRoleName);
discoveryData.AddInstance(oCasIW);

// Create the ClientAccessOutlookWebAccess instance.
var oCasOwa = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookWebAccess']$");
oCasOwa.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOwa.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasOwa.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "OWA - " + clientAccessRoleName);
discoveryData.AddInstance(oCasOwa);

// Create the ClientAccessExchangeControlPanel instance.
var oCasEcp = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessExchangeControlPanel']$");
oCasEcp.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasEcp.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasEcp.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "ECP - " + clientAccessRoleName);
discoveryData.AddInstance(oCasEcp);

// Create the ClientAccessPop3 instance.
var oCasPop3 = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessPop3']$");
oCasPop3.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasPop3.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasPop3.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "POP3 - " + clientAccessRoleName);
discoveryData.AddInstance(oCasPop3);

// Create the ClientAccessServiceMonitoring instance.
var oCasServiceMonitoring = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessServiceMonitoring']$");
oCasServiceMonitoring.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasServiceMonitoring.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasServiceMonitoring.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Services - " + clientAccessRoleName);
discoveryData.AddInstance(oCasServiceMonitoring);

// Create the ClientAccessWebServices instance.
var oCasWS = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessWebServices']$");
oCasWS.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasWS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasWS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "WebServices - " + clientAccessRoleName);
discoveryData.AddInstance(oCasWS);

// Create the ClientAccessAvailabilityService instance.
var oCasAvailabilityService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAvailabilityService']$");
oCasAvailabilityService.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasAvailabilityService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasAvailabilityService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Availability Service - " + clientAccessRoleName);
discoveryData.AddInstance(oCasAvailabilityService);

// Create the ClientAccessOfflineAddressBook instance.
var oCasOfflineAddressBook = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOfflineAddressBook']$");
oCasOfflineAddressBook.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOfflineAddressBook.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasOfflineAddressBook.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Offline Address Book - " + clientAccessRoleName);
discoveryData.AddInstance(oCasOfflineAddressBook);

// Create the ClientAccessTestConfig instance.
var oClientAccessTestConfig = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessTestConfig']$");
oClientAccessTestConfig.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oClientAccessTestConfig.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oClientAccessTestConfig.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Client Access Test Config - " + clientAccessRoleName);
discoveryData.AddInstance(oClientAccessTestConfig);

// Create the ClientAccessUnifiedMessaging instance.
var oClientAccessUnifiedMessaging = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessUnifiedMessaging']$");
oClientAccessUnifiedMessaging.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oClientAccessUnifiedMessaging.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oClientAccessUnifiedMessaging.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Client Access Unified Messaging - " + clientAccessRoleName);
discoveryData.AddInstance(oClientAccessUnifiedMessaging);

// Create the ClientAccessMailboxReplicationService instance.
var oCasMrs = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessMailboxReplicationService']$");
oCasMrs.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasMrs.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasMrs.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Mailbox Replication Service - " + clientAccessRoleName);
discoveryData.AddInstance(oCasMrs);

// Create the ClientAccessAnonymousCalendarSharing instance.
var oCasAnonCalSharing = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAnonymousCalendarSharing']$");
oCasAnonCalSharing.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasAnonCalSharing.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasAnonCalSharing.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Anonymous Calendar Sharing - " + clientAccessRoleName);
discoveryData.AddInstance(oCasAnonCalSharing);

// ----------------------------------------------------------------------
// Instantiate CommonComponent classes hosted by ClientAccessRole.
// ----------------------------------------------------------------------
//
// Construct the CommonRole class's Name key property.
var commonRoleName = computerNetbiosName + " (Common) - " + computerActiveDirectorySite;

// Create the CommonAllServerRoles instance.
var oCommonAllServerRoles = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonAllServerRoles']$");
oCommonAllServerRoles.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonAllServerRoles.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonAllServerRoles.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Server - " + commonRoleName);
discoveryData.AddInstance(oCommonAllServerRoles);

// Create the CommonBestPracticeAnalyzer instance.
var oCommonBpa = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonBestPracticeAnalyzer']$");
oCommonBpa.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonBpa.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonBpa.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "ExBPA - " + commonRoleName);
discoveryData.AddInstance(oCommonBpa);

// Create the CommonFileDistributionService instance.
var oCommonFds = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonFileDistributionService']$");
oCommonFds.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonFds.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonFds.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Common FDS - " + commonRoleName);
discoveryData.AddInstance(oCommonFds);

// Create the CommonProblemAnalysis instance.
var oCommonProblemAnalysis = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonProblemAnalysis']$");
oCommonProblemAnalysis.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonProblemAnalysis.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonProblemAnalysis.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Watson Events - " + commonRoleName);
discoveryData.AddInstance(oCommonProblemAnalysis);

// Create the CommonServer instance.
var oCommonServer = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonServer']$");
oCommonServer.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonServer.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonServer.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Disk - " + commonRoleName);
discoveryData.AddInstance(oCommonServer);

// Create the CommonServiceMonitoring instance.
var oCommonServiceMonitoring = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonServiceMonitoring']$");
oCommonServiceMonitoring.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonServiceMonitoring.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonServiceMonitoring.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Common Services - " + commonRoleName);
discoveryData.AddInstance(oCommonServiceMonitoring);

// Create the CommonInternalRoleServices instance.
var oCommonInternalRoleServices = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonInternalRoleServices']$");
oCommonInternalRoleServices.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonInternalRoleServices.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonInternalRoleServices.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Common Services for Internal Roles - " + commonRoleName);
discoveryData.AddInstance(oCommonInternalRoleServices);

// Create the CommonMSExchangeRPCServiceMonitoring instance.
var oCommonMSExchangeRPCServiceMonitoring = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonMSExchangeRPCServiceMonitoring']$");
oCommonMSExchangeRPCServiceMonitoring.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonMSExchangeRPCServiceMonitoring.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonMSExchangeRPCServiceMonitoring.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "MSExchange RPC service - " + commonRoleName);
discoveryData.AddInstance(oCommonMSExchangeRPCServiceMonitoring);

// Create the CommonRemotePowerShell instance.
var oCommonRemotePowerShell = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonRemotePowerShell']$");
oCommonRemotePowerShell.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonRemotePowerShell.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonRemotePowerShell.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Remote PowerShell - " + commonRoleName);
discoveryData.AddInstance(oCommonRemotePowerShell);

// Create the Auditing instance.
var oCommonAuditing = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.Auditing']$");
oCommonAuditing.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonAuditing.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonAuditing.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Auditing - " + commonRoleName);
discoveryData.AddInstance(oCommonAuditing);

// Create the CommonConfigurationAuthorization instance.
var oCommonConfigurationAuthorization = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonConfigurationAuthorization']$");
oCommonConfigurationAuthorization.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonConfigurationAuthorization.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonConfigurationAuthorization.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Configuration Authorization - " + commonRoleName);
discoveryData.AddInstance(oCommonConfigurationAuthorization);

// Create the CommonProvisioningBroker instance.
var oCommonProvisioningBroker = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonProvisioningBroker']$");
oCommonProvisioningBroker.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonProvisioningBroker.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonProvisioningBroker.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Provisioning Broker - " + commonRoleName);
discoveryData.AddInstance(oCommonProvisioningBroker);

// Create the CommonTransportThrottlingClient instance.
var oCommonTransportThrottlingClient = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonTransportThrottlingClient']$");
oCommonTransportThrottlingClient.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCommonTransportThrottlingClient.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", commonRoleName);
oCommonTransportThrottlingClient.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Transport Throttling Client - " + commonRoleName);
discoveryData.AddInstance(oCommonTransportThrottlingClient);

// ----------------------------------------------------------------------
// Instantiate org level service classes related to ClientAccessComponent.
// ----------------------------------------------------------------------
//
// Create the ActiveSyncService instance.
var oASService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessActiveSyncService']$");
oASService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "ActiveSync Service - " + computerActiveDirectorySite);
oASService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oASService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oASService);

// Create the OutlookWebAccessService instance.
var oOwaService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookWebAccessService']$");
oOwaService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "OWA Service - " + computerActiveDirectorySite);
oOwaService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oOwaService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oOwaService);

// Create the ExchangeControlPanelService instance.
var oEcpService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessExchangeControlPanelService']$");
oEcpService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "ECP Service - " + computerActiveDirectorySite);
oEcpService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oEcpService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oEcpService);

// Create the WebServicesService instance.
var oWSService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessWebServicesService']$");
oWSService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "WebServices Service - " + computerActiveDirectorySite);
oWSService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oWSService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oWSService);

// Create the AvailabilityServicesService instance.
var oCasASService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAvailabilityServicesService']$");
oCasASService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "AvailabilityServices Service - " + computerActiveDirectorySite);
oCasASService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasASService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasASService);

// Create the OfflineAddressBookService instance.
var oCasOabService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOfflineAddressBookService']$");
oCasOabService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "OfflineAddressBook Service - " + computerActiveDirectorySite);
oCasOabService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasOabService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasOabService);

// Create the Imap4Service instance.
var oImap4Service = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessImap4Service']$");
oImap4Service.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "IMAP4 Service - " + computerActiveDirectorySite);
oImap4Service.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oImap4Service.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oImap4Service);

// Create the Pop3Service instance.
var oPop3Service = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessPop3Service']$");
oPop3Service.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "POP3 Service - " + computerActiveDirectorySite);
oPop3Service.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oPop3Service.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oPop3Service);

// Create the ClientAccessTestConfigService instance.
var oClientAccessTestConfigService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessTestConfigService']$");
oClientAccessTestConfigService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Client Access Test Configuration - " + computerActiveDirectorySite);
oClientAccessTestConfigService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oClientAccessTestConfigService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oClientAccessTestConfigService);

// Create the MailboxReplicationServices Service instance.
var oCasMrsService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessMailboxReplicationServicesService']$");
oCasMrsService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Mailbox Replication Services - " + computerActiveDirectorySite);
oCasMrsService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasMrsService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasMrsService);

// Create the ClientAccessAnonymousCalendarSharing Service instance
var oCasACS = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAnonymousCalendarSharingService']$");
oCasACS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Anonymous Calendar Sharing Services - " + computerActiveDirectorySite);
oCasACS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasACS.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasACS);
// ----------------------------------------------------------------------
// Instantiate org level service classes related to CommonComponent.
// ----------------------------------------------------------------------
//
// Create the CommonRemotePowerShellService instance.
var oCommonRemotePowerShellService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonRemotePowerShellService']$");
oCommonRemotePowerShellService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Remote PowerShell Service - " + computerActiveDirectorySite);
oCommonRemotePowerShellService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCommonRemotePowerShellService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCommonRemotePowerShellService);

// ----------------------------------------------------------------------
// Instantiate org level service classes related to UnifiedMessagingComponent.
// ----------------------------------------------------------------------
//
// Create the UnifiedMessagingService instance.
var oUnifiedMessagingService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.UnifiedMessagingService']$");
oUnifiedMessagingService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Unified Messaging Service - " + computerActiveDirectorySite);
oUnifiedMessagingService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oUnifiedMessagingService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oUnifiedMessagingService)

// ----------------------------------------------------------------------
// Create relationships from org level services to ClientAccessComponent.
// ----------------------------------------------------------------------
//
// Create containment relationship from ActiveSyncService to ClientAccessActiveSync.
var oASServiceContainsCasAS = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessActiveSyncService.Contains.Microsoft.Exchange.2010.ClientAccessActiveSync']$");
oASServiceContainsCasAS.Source = oASService;
oASServiceContainsCasAS.Target = oCasAS;
discoveryData.AddInstance(oASServiceContainsCasAS);

// Create containment relationship from OutlookWebAccessService to ClientAccessOutlookWebAccess.
var oOwaServiceContainsCasOwa = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookWebAccessService.Contains.Microsoft.Exchange.2010.ClientAccessOutlookWebAccess']$");
oOwaServiceContainsCasOwa.Source = oOwaService;
oOwaServiceContainsCasOwa.Target = oCasOwa;
discoveryData.AddInstance(oOwaServiceContainsCasOwa);

// Create containment relationship from ExchangeControlPanelService to ClientAccessExchangeControlPanel.
var oEcpServiceContainsCasEcp = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessExchangeControlPanelService.Contains.Microsoft.Exchange.2010.ClientAccessExchangeControlPanel']$");
oEcpServiceContainsCasEcp.Source = oEcpService;
oEcpServiceContainsCasEcp.Target = oCasEcp;
discoveryData.AddInstance(oEcpServiceContainsCasEcp);

// Create containment relationship from WebServicesService to ClientAccessWebServices.
var oWSServiceContainsCasWS = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessWebServicesService.Contains.Microsoft.Exchange.2010.ClientAccessWebServices']$");
oWSServiceContainsCasWS.Source = oWSService;
oWSServiceContainsCasWS.Target = oCasWS;
discoveryData.AddInstance(oWSServiceContainsCasWS);

// Create containment relationship from ClientAccessAvailabilityServicesService to ClientAccessAvailabilityService.
var oASServiceContainsCasAS = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAvailabilityServicesService.Contains.Microsoft.Exchange.2010.ClientAccessAvailabilityService']$");
oASServiceContainsCasAS.Source = oCasASService;
oASServiceContainsCasAS.Target = oCasAvailabilityService;
discoveryData.AddInstance(oASServiceContainsCasAS);

// Create containment relationship from ClientAccessAnonymousCalendarSharingService to ClientAccessAnonymousCalendarSharing.
var oACSServiceContainsCasACS = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessAnonymousCalendarSharingService.Contains.Microsoft.Exchange.2010.ClientAccessAnonymousCalendarSharing']$");
oACSServiceContainsCasACS.Source = oCasACS;
oACSServiceContainsCasACS.Target = oCasAnonCalSharing;
discoveryData.AddInstance(oACSServiceContainsCasACS);

// Create containment relationship from ClientAccessOfflineAddressBookService to ClientAccessOfflineAddressBook.
var oOabServiceContainsCasOab = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOfflineAddressBookService.Contains.Microsoft.Exchange.2010.ClientAccessOfflineAddressBook']$");
oOabServiceContainsCasOab.Source = oCasOabService;
oOabServiceContainsCasOab.Target = oCasOfflineAddressBook;
discoveryData.AddInstance(oOabServiceContainsCasOab);

// Create containment relationship from Imap4Service to ClientAccessImap4.
var oImap4ServiceContainsCasImap4 = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessImap4Service.Contains.Microsoft.Exchange.2010.ClientAccessImap4']$");
oImap4ServiceContainsCasImap4.Source = oImap4Service;
oImap4ServiceContainsCasImap4.Target = oCasImap4;
discoveryData.AddInstance(oImap4ServiceContainsCasImap4);

// Create containment relationship from Pop3Service to ClientAccessPop3.
var oPop3ServiceContainsCasPop3 = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessPop3Service.Contains.Microsoft.Exchange.2010.ClientAccessPop3']$");
oPop3ServiceContainsCasPop3.Source = oPop3Service;
oPop3ServiceContainsCasPop3.Target = oCasPop3;
discoveryData.AddInstance(oPop3ServiceContainsCasPop3);

// Create containment relationship from ClientAccessTestConfigService to ClientAccessTestConfig.
var oClientAccessTestConfigServiceContainsClientAccessTestConfig = discoveryData.CreateRelationshipInstance("$MPElement[Name='ExchangeReverseRollup_Microsoft.Exchange.2010.ClientAccessTestConfigService.Contains.Microsoft.Exchange.2010.ClientAccessTestConfig']$");
oClientAccessTestConfigServiceContainsClientAccessTestConfig.Source = oClientAccessTestConfigService;
oClientAccessTestConfigServiceContainsClientAccessTestConfig.Target = oClientAccessTestConfig;
discoveryData.AddInstance(oClientAccessTestConfigServiceContainsClientAccessTestConfig);

// Create containment relationship from MailboxReplicationServicesService to MailboxReplicationService.
var oCasMrsServiceContainsCasMrs = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessMailboxReplicationServicesService.Contains.Microsoft.Exchange.2010.ClientAccessMailboxReplicationService']$");
oCasMrsServiceContainsCasMrs.Source = oCasMrsService;
oCasMrsServiceContainsCasMrs.Target = oCasMrs;
discoveryData.AddInstance(oCasMrsServiceContainsCasMrs);

{
// Create the OutlookService instance.
var oCasOutlookService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookService']$");
oCasOutlookService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Outlook Service - " + computerActiveDirectorySite);
oCasOutlookService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasOutlookService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasOutlookService);

// Create the ClientAccessOutlook instance.
var oCasOutlook = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlook']$");
oCasOutlook.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOutlook.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasOutlook.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Outlook Connectivity - " + clientAccessRoleName);
discoveryData.AddInstance(oCasOutlook);

// Create containment relationship from ClientAccessOutlookService to ClientAccessOutlook.
var oOutlookServiceContainsOutlook = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookService.Contains.Microsoft.Exchange.2010.ClientAccessOutlook']$");
oOutlookServiceContainsOutlook.Source = oCasOutlookService;
oOutlookServiceContainsOutlook.Target = oCasOutlook;
discoveryData.AddInstance(oOutlookServiceContainsOutlook);
}

{
// Create the OutlookServer instance.
var oCasOutlookServerService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookServerService']$");
oCasOutlookServerService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Outlook Server - " + computerActiveDirectorySite);
oCasOutlookServerService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasOutlookServerService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasOutlookServerService);

// Create the ClientAccessOutlookLocalServer instance.
var oCasOutlookLocalServer = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookLocalServer']$");
oCasOutlookLocalServer.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOutlookLocalServer.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasOutlookLocalServer.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Outlook Connectivity (Local Server) - " + clientAccessRoleName);
discoveryData.AddInstance(oCasOutlookLocalServer);

// Create containment relationship from ClientAccessOutlookServer to ClientAccessOutlookLocalServer.
var oOutlookServerContainsOutlookLocalServer = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookServerService.Contains.Microsoft.Exchange.2010.ClientAccessOutlookLocalServer']$");
oOutlookServerContainsOutlookLocalServer.Source = oCasOutlookServerService;
oOutlookServerContainsOutlookLocalServer.Target = oCasOutlookLocalServer;
discoveryData.AddInstance(oOutlookServerContainsOutlookLocalServer);
}

{
// Create the ClientAccessOutlookPerformance instance.
var oCasOutlookPerformanceService = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookPerformanceService']$");
oCasOutlookPerformanceService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ServiceName$", "Outlook Performance - " + computerActiveDirectorySite);
oCasOutlookPerformanceService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/InstanceName$", computerActiveDirectorySite);
oCasOutlookPerformanceService.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Service']/ActiveDirectorySite$", computerActiveDirectorySite);
discoveryData.AddInstance(oCasOutlookPerformanceService);

// Create the ClientAccessOutlookInstancePerformance instance.
var rcaPerfCounterName = "Win32_PerfRawData_MSExchangeRpcClientAccessPerServer_MSExchangeRpcClientAccessPerServer";
var objWMIService = GetObject("winmgmts:\\\\.\\root\\cimv2");
var rcaPerfCounter = objWMIService.ExecQuery("SELECT * FROM " + rcaPerfCounterName);

var rcaPerfCounterInstances = new Enumerator(rcaPerfCounter);
while(!rcaPerfCounterInstances.atEnd())
{
// Each instance is a Mailbox server connects to this Client Access server
var rcaPerfCounterInstance = rcaPerfCounterInstances.item();

// Create an instance per Mailbox server
var oCasOutlookInstancePerformance = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookInstancePerformance']$");
oCasOutlookInstancePerformance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOutlookInstancePerformance.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);

// Instance display name. Due to multiple instances are a flat list, add the CAS server name to the displayName.
oCasOutlookInstancePerformance.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Outlook Mailbox Performance Counter - " + shortName(computerPrincipalName) + " -&gt; " + shortName(rcaPerfCounterInstance.Name));
oCasOutlookInstancePerformance.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/InstanceName$", rcaPerfCounterInstance.Name);
discoveryData.AddInstance(oCasOutlookInstancePerformance);

// Create containment relationship from ClientAccessOutlookService to ClientAccessOutlookInstancePerformance.
// This is one to many relationship
var oOutlookPerformanceContainsOutlookInstancePerformance = discoveryData.CreateRelationshipInstance("$MPElement[Name='ExchangeReverseRollup_Microsoft.Exchange.2010.ClientAccessOutlookPerformanceService.Contains.Microsoft.Exchange.2010.ClientAccessOutlookInstancePerformance']$");
oOutlookPerformanceContainsOutlookInstancePerformance.Source = oCasOutlookPerformanceService;
oOutlookPerformanceContainsOutlookInstancePerformance.Target = oCasOutlookInstancePerformance;
discoveryData.AddInstance(oOutlookPerformanceContainsOutlookInstancePerformance);

rcaPerfCounterInstances.moveNext();
}

// Create the ClientAccessOutlook Directory availability performance counter.
var oCasOutlookDirectoryPerformanceCounter = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookDirectory']$");
oCasOutlookDirectoryPerformanceCounter.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOutlookDirectoryPerformanceCounter.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasOutlookDirectoryPerformanceCounter.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Outlook Directory Performance Counter - " + clientAccessRoleName);
discoveryData.AddInstance(oCasOutlookDirectoryPerformanceCounter);

// Create containment relationship from ClientAccessOutlookPerformance to ClientAccessOutlookDirectory.
var oOutlookPerformanceContainsDirectory = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookPerformanceService.Contains.Microsoft.Exchange.2010.ClientAccessOutlookDirectory']$");
oOutlookPerformanceContainsDirectory.Source = oCasOutlookPerformanceService;
oOutlookPerformanceContainsDirectory.Target = oCasOutlookDirectoryPerformanceCounter;
discoveryData.AddInstance(oOutlookPerformanceContainsDirectory);

// Create the ClientAccessOutlook external components availability performance counter.
var oCasOutlookRpcProxyPerformanceCounter = discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookRpcProxy']$");
oCasOutlookRpcProxyPerformanceCounter.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", computerPrincipalName);
oCasOutlookRpcProxyPerformanceCounter.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.ServerRole']/RoleName$", clientAccessRoleName);
oCasOutlookRpcProxyPerformanceCounter.AddProperty("$MPElement[Name='Microsoft.Exchange.2010.Component']/ComponentName$", "Windows RpcProxy Performance Counter - " + clientAccessRoleName);
discoveryData.AddInstance(oCasOutlookRpcProxyPerformanceCounter);

// Create containment relationship from ClientAccessOutlookPerformance to ClientAccessOutlookRpcProxy.
var oOutlookPerformanceContainsRpcProxy = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.ClientAccessOutlookPerformanceService.Contains.Microsoft.Exchange.2010.ClientAccessOutlookRpcProxy']$");
oOutlookPerformanceContainsRpcProxy.Source = oCasOutlookPerformanceService;
oOutlookPerformanceContainsRpcProxy.Target = oCasOutlookRpcProxyPerformanceCounter;
discoveryData.AddInstance(oOutlookPerformanceContainsRpcProxy);
}

// ----------------------------------------------------------------------
// Create relationships from org level services to CommonComponent.
// ----------------------------------------------------------------------
//
// Create containment relationship from CommonRemotePowerShellService to CommonRemotePowerShell.
var oCommonRemotePowerShellServiceContainsCommonRemotePowerShell = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.CommonRemotePowerShellService.Contains.Microsoft.Exchange.2010.CommonRemotePowerShell']$");
oCommonRemotePowerShellServiceContainsCommonRemotePowerShell.Source = oCommonRemotePowerShellService;
oCommonRemotePowerShellServiceContainsCommonRemotePowerShell.Target = oCommonRemotePowerShell;
discoveryData.AddInstance(oCommonRemotePowerShellServiceContainsCommonRemotePowerShell);

// ----------------------------------------------------------------------
// Create relationships from org level services to UnifiedMessagingComponent.
// ----------------------------------------------------------------------
//
// Create containment relationship from UnifiedMessagingService to ClientAccessUnifiedMessaging.
var oUnifiedMessagingServiceContainsClientAccessUnifiedMessaging = discoveryData.CreateRelationshipInstance("$MPElement[Name='Microsoft.Exchange.2010.UnifiedMessagingService.Contains.Microsoft.Exchange.2010.ClientAccessUnifiedMessaging']$");
oUnifiedMessagingServiceContainsClientAccessUnifiedMessaging.Source = oUnifiedMessagingService;
oUnifiedMessagingServiceContainsClientAccessUnifiedMessaging.Target = oClientAccessUnifiedMessaging;
discoveryData.AddInstance(oUnifiedMessagingServiceContainsClientAccessUnifiedMessaging);

oAPI.Return(discoveryData);

LogEvent(DISCOVERY_ENDED_INF_ID, EVENT_TYPE_INFORMATION, infoOutput + "Exiting Discovery." );
}

function shortName(longName)
{
var shortName = longName;
var shortNameIndex = shortName.indexOf('.');
if (shortNameIndex &gt; 0)
{
shortName = shortName.substr(0, shortNameIndex);
}
return shortName;
}

//
// Log to EventLog if verboseLogging is set
//
function LogEvent(eventId, eventType, message)
{
if (verboseLogging)
{
oAPI.LogScriptEvent(EVENT_SOURCE, eventId, eventType, message);
}
}
</Script></Contents>
</File>
</Files>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
</DataSourceModuleType>