﻿<?xml version="1.0" encoding="utf-8"?><ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <Manifest>
    <Identity>
      <ID>ADSecurityGroupMembershipDiscovery</ID>
      <Version>1.0.0.0</Version>
    </Identity>
    <Name>ADSecurityGroupMembershipDiscovery</Name>
    <References>
      <Reference Alias="SCDW">
        <ID>Microsoft.SystemCenter.DataWarehouse.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Windows">
        <ID>Microsoft.Windows.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="MicrosoftSystemCenterInstanceGroupLibrary6062780">
        <ID>Microsoft.SystemCenter.InstanceGroup.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="System">
        <ID>System.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
      <Reference Alias="Health">
        <ID>System.Health.Library</ID>
        <Version>6.0.6278.0</Version>
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
      </Reference>
    </References>
  </Manifest>
  <TypeDefinitions>
    <EntityTypes>
      <ClassTypes>
        <ClassType ID="ADSecurityGroupMembershipDiscovery.Class" Accessibility="Internal" Abstract="false" Base="Windows!Microsoft.Windows.LocalApplication" Hosted="true" Singleton="false">
          <Property ID="ADGroupMembership" Type="string" Key="true" CaseSensitive="false" Length="256" MinLength="0" />
        </ClassType>
        <ClassType ID="UINameSpace8e14cb8716444609b6e9cb8a89224d26.Group" Accessibility="Public" Abstract="false" Base="MicrosoftSystemCenterInstanceGroupLibrary6062780!Microsoft.SystemCenter.InstanceGroup" Hosted="false" Singleton="true" />
      </ClassTypes>
    </EntityTypes>
  </TypeDefinitions>
  <Monitoring>
    <Discoveries>
      <Discovery ID="ADSecurityGroupMembershipDiscovery.Script" Enabled="true" Target="Windows!Microsoft.Windows.Computer" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryClass TypeID="Windows!Microsoft.Windows.Computer" />
          <DiscoveryRelationship TypeID="Windows!Microsoft.Windows.ComputerHostsLocalApplication" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
          <IntervalSeconds>86400</IntervalSeconds>
          <SyncTime />
          <ScriptName>DiscoverADGroupMembership.vbs</ScriptName>
          <Arguments>$MPElement$ $Target/Id$ $Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$ $Target/Property[Type="Windows!Microsoft.Windows.Computer"]/NetbiosComputerName$ "$Target/Property[Type="Windows!Microsoft.Windows.Computer"]/OrganizationalUnit$"</Arguments>
          <ScriptBody>
            On Error Resume Next

            Const E_ADS_PROPERTY_NOT_FOUND  = &amp;h8000500D

            Dim oArgs, oAPI, SourceType, SourceID, ManagedEntityID, TargetComputer, oDiscoveryData, oInst, SNetBiosName, sOU, sQuery, sDC, posDC


            'Grab required environment variables from OpsMgr
            Set oArgs = WScript.Arguments
            SourceType = 0
            ' SourceId is the GUID of the discovery object that runs the script.
            SourceId = oArgs(0)
            ' ManagedEntityId is the GUID of the computer class that is targeted by the script.
            ManagedEntityId = oArgs(1)
            ' TargetComputer is the Fully Qualified Domain Name
            ' of the computer that is targeted by the script. The FQDN
            ' is within Arg(2) of the command prompt.
            TargetComputer = oArgs(2)
            sNetBiosName = oArgs(3)
            sOU = oArgs(4)
            sQuery="LDAP://CN=" &amp; sNetBiosName &amp; "," &amp; sOU
            posDC=InStr(sQuery,"DC=")
            sDC=Right(sQuery, Len(sQuery)-(posDC-1))

            'Create required scripting objects
            Set objUser = GetObject(sQuery)
            Set oAPI = CreateObject("MOM.ScriptAPI")
            Set oDiscoveryData = oAPI.CreateDiscoveryData(SourceType, SourceId, ManagedEntityId)
            intPrimaryGroupID = objUser.Get("primaryGroupID")
            arrMemberOf = objUser.GetEx("memberOf")

            Call oAPI.LogScriptEvent("DiscoverADGroupMembership.vbs",1234,4,"AD Global Group Membership Discovery Started.  Parameters passed to the discovery script are, in order:  " &amp; SourceID &amp; " " &amp; ManagedEntityID &amp; " " &amp; TargetComputer &amp; " " &amp; sNetBiosName &amp; " " &amp; sOU)

            'Get Group Membeship
            If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then
            Call oAPI.LogScriptEvent("DiscoverADGroupMembership.vbs",9864,1,"The memberOf attribute is not set!")
            Else
            For Each Group in arrMemberOf
            Set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='ADSecurityGroupMembershipDiscovery.Class']$")
            Call oInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
            Call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", TargetComputer)
            Call oInst.AddProperty("$MPElement[Name='ADSecurityGroupMembershipDiscovery.Class']/ADGroupMembership$", Group)
            Call oDiscoveryData.AddInstance(oInst)
            Next
            End If

            'Reset variables and get primary group membership
            sQuery=sDC
            Set objConnection = CreateObject("ADODB.Connection")
            objConnection.Open "Provider=ADsDSOObject;"

            Set objCommand = CreateObject("ADODB.Command")
            objCommand.ActiveConnection = objConnection
            objCommand.CommandText = "&lt;LDAP://" &amp; sQuery &amp; "&gt;;(objectCategory=Group);distinguishedName,primaryGroupToken;subtree"
            Set objRecordSet = objCommand.Execute

            Do Until objRecordset.EOF
            If objRecordset.Fields("primaryGroupToken") = intPrimaryGroupID Then
            Set oInst = oDiscoveryData.CreateClassInstance("$MPElement[Name='ADSecurityGroupMembershipDiscovery.Class']$")
            Call oInst.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", TargetComputer)
            Call oInst.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", TargetComputer)
            Call oInst.AddProperty("$MPElement[Name='ADSecurityGroupMembershipDiscovery.Class']/ADGroupMembership$", objRecordset.Fields("distinguishedname"))
            Call oDiscoveryData.AddInstance(oInst)
            End If
            objRecordset.MoveNext
            Loop

            objConnection.Close

            Call oAPI.Return(oDiscoveryData)

            Call oAPI.LogScriptEvent("DiscoverADGroupMembership.vbs",1235,4,"AD Global Group Membership Discovery Finished. ")

          </ScriptBody>
          <TimeoutSeconds>60</TimeoutSeconds>
        </DataSource>
      </Discovery>
      <Discovery ID="UINameSpace8e14cb8716444609b6e9cb8a89224d26.Group.DiscoveryRule" Enabled="true" Target="UINameSpace8e14cb8716444609b6e9cb8a89224d26.Group" ConfirmDelivery="false" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
          <DiscoveryRelationship TypeID="MicrosoftSystemCenterInstanceGroupLibrary6062780!Microsoft.SystemCenter.InstanceGroupContainsEntities" />
        </DiscoveryTypes>
        <DataSource ID="GroupPopulationDataSource" TypeID="SC!Microsoft.SystemCenter.GroupPopulator">
          <RuleId>$MPElement$</RuleId>
          <GroupInstanceId>$MPElement[Name="UINameSpace8e14cb8716444609b6e9cb8a89224d26.Group"]$</GroupInstanceId>
          <MembershipRules>
            <MembershipRule>
              <MonitoringClass>$MPElement[Name="Windows!Microsoft.Windows.Computer"]$</MonitoringClass>
              <RelationshipClass>$MPElement[Name="MicrosoftSystemCenterInstanceGroupLibrary6062780!Microsoft.SystemCenter.InstanceGroupContainsEntities"]$</RelationshipClass>
              <Expression>
                <Contains>
                  <MonitoringClass>$MPElement[Name="ADSecurityGroupMembershipDiscovery.Class"]$</MonitoringClass>
                  <Expression>
                    <RegExExpression>
                      <ValueExpression>
                        <Property>$MPElement[Name="ADSecurityGroupMembershipDiscovery.Class"]/ADGroupMembership$</Property>
                      </ValueExpression>
                      <Operator>ContainsSubstring</Operator>
                      <Pattern>TestOverrideADSecGroup</Pattern>
                    </RegExExpression>
                  </Expression>
                </Contains>
              </Expression>
            </MembershipRule>
          </MembershipRules>
        </DataSource>
      </Discovery>
    </Discoveries>
  </Monitoring>
  <Presentation>
    <StringResources>
      <StringResource ID="MomUIGeneratedRuleef314ad0e9674204924201c69cdc1e20.AlertMessage" />
      <StringResource ID="MomUIGeneratedRule3da6aa8c04314436b722e1c70de31ad1.AlertMessage" />
      <StringResource ID="MomUIGeneratedRulecae5d23497de4e0eb380f2132b31f419.AlertMessage" />
    </StringResources>
  </Presentation>
  <LanguagePacks>
    <LanguagePack ID="ENU" IsDefault="true">
      <DisplayStrings>
        <DisplayString ElementID="ADSecurityGroupMembershipDiscovery">
          <Name>AD Security Group Membership Discovery</Name>
        </DisplayString>
        <DisplayString ElementID="ADSecurityGroupMembershipDiscovery.Class">
          <Name>ADSecurityGroupMembershipDiscovery.Class</Name>
        </DisplayString>
        <DisplayString ElementID="ADSecurityGroupMembershipDiscovery.Script">
          <Name>ADSecurityGroupMembershipDiscovery.Script</Name>
        </DisplayString>
        <DisplayString ElementID="UINameSpace8e14cb8716444609b6e9cb8a89224d26.Group">
          <Name>AD Security Group - Test Group</Name>
        </DisplayString>
        <DisplayString ElementID="UINameSpace8e14cb8716444609b6e9cb8a89224d26.Group.DiscoveryRule">
          <Name>Populate AD Security Group - Test Group</Name>
          <Description>This discovery rule populates the group 'AD Security Group - Test Group'</Description>
        </DisplayString>
        <DisplayString ElementID="MomUIGeneratedRuleef314ad0e9674204924201c69cdc1e20.AlertMessage">
          <Name>Test for event 9999 - AD Security Group Discovery MP</Name>
        </DisplayString>
        <DisplayString ElementID="MomUIGeneratedRule3da6aa8c04314436b722e1c70de31ad1.AlertMessage">
          <Name>Test for event 998 - AD Security Group Discovery MP</Name>
        </DisplayString>
        <DisplayString ElementID="MomUIGeneratedRulecae5d23497de4e0eb380f2132b31f419.AlertMessage">
          <Name>777</Name>
        </DisplayString>
      </DisplayStrings>
    </LanguagePack>
  </LanguagePacks>
</ManagementPack>
