none
Не работает Group Dynamic Population в Custom Management Pack RRS feed

  • Вопрос

  • Добрый день!

    Возникла необходимость разработать пакет управления. На данный момент возникла проблема с динамическим наполнением групп. Долго с этим мучался, создавал отдельные классы (группы, скрипты). После экспорта в SCOM группа появляется, но она пустая. Сначала думал, что я где-то ошибся в создании классов или Discoveries. Поэтому решил использовать для проверки готовый шаблон (взял с http://blogs.msdn.com/b/steverac/archive/2009/01/12/discovering-ad-security-groups-in-opsmgr-2007.aspx). Создал группу безопасности, добавил в нее учетные записи компьютеров, изменил xml файл пакета управления на нужную группу, но результат тот же. Скрипт этого пакета управления отрабатывает нормально (сужу по записям в журнале событий агентов).

    Кто знает, с чем может быть проблема? Или может быть есть логи, связанные с работой пакетов управления?

    1 ноября 2010 г. 8:02

Ответы

  • >Set relationshipInstance = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='GroupPopulation.TestGroup']$")

    Это не является relationship instance. Это группа. Исправьте на ссылку на relationship.

     


    http://OpsMgr.ru/
    • Помечено в качестве ответа egoncharov 3 ноября 2010 г. 9:46
    3 ноября 2010 г. 8:41
    Отвечающий

Все ответы

  • Добрый день.

    В общем случае никаких логов, кроме стандартного Operations Manager eventlog, нет.

    Во-первых, нужно посмотреть там - нет ли ошибок, связанных с модулями.

    Во-вторых, взять скрипт из правила и запустить вручную со всеми необходиммыми параметрами(такими,какие передаются скрипту во время запуска из модуля). Посмотрите вывод. Скрипт нужно запускать с теми же правами, как его запускает OpsMgr.


    http://OpsMgr.ru/
    2 ноября 2010 г. 4:25
    Отвечающий
  • Спасибо за ответ.

    1. Ошибок связанных с пакетами управления нет.

    2. Для тестов брал еще один пакет управления с http://blogs.msdn.com/b/steverac/archive/2010/01/16/populating-groups-from-a-text-file-step-by-step.aspx. Так вот. Если импортировать этот пакет управления без изменений, то группа создается и наполняется серверами. Если я модифицирую пакет - изменяю vbs скрипт, то группа не наполняется. Очевидно, что я мог ошибиться в скрипте. Но, я пытался сделать как вы указали, т.е. запускить скрипт от имени OpsMgr Action Account с нужными параметрами (параметры получал путем добавления в скрипт Call oAPI.LogScriptEvent).
    Скрипт создает xml файл, похожий на xml файл скачанного пакета управления, но данные в группу не заносятся. Ошибок в журнале событий нет. Причем, если запустить скрипт из пакета управления (путем copy - paste), то создается xml файл с тегами ClassInstances и RelationshipInstance. Если я запускаю скрипт, созданные Operation Manager (находится в папке C:\Program Files\System Center Operations Manager 2007\Health Service State\Monitoring Host Temporary Files xx\xxxx), то создается xml файл только с тегом RelationshipInstance (в обоих случаях).

    Если надо, я выложу xml файл пакета управления.

    2 ноября 2010 г. 14:18
  • Выкладывайте XML.


    http://OpsMgr.ru/
    2 ноября 2010 г. 14:36
    Отвечающий
  • Поэкспериментировал с пакетами, судя по всему - дело в скрипте, но никак не могу найти, что я не так сделал.

    Вот исходный работающий пакет (построенный на основе пакета, приведенного на этой странице):

    <ManagementPack ContentReadable="true" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <Manifest>
      <Identity>
       <ID>Test.Management.Pack</ID>
       <Version>1.0.0.14</Version>
      </Identity>
      <Name>Test.Management.Pack</Name>
      <References>
       <Reference Alias="SC">
        <ID>Microsoft.SystemCenter.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="Health">
        <ID>System.Health.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>
      </References>
     </Manifest>
     <TypeDefinitions>
      <EntityTypes>
       <ClassTypes>
        <ClassType ID="GroupPopulation.TestGroup" Accessibility="Internal" Abstract="false" Base="System!System.Group" Hosted="false" Singleton="true" />
       </ClassTypes>
       <RelationshipTypes>
        <RelationshipType ID="GroupPopulation.TestGroupContainsWindowsComputers" Accessibility="Internal" Abstract="false" Base="System!System.Containment">
         <Source>GroupPopulation.TestGroup</Source>
         <Target>Windows!Microsoft.Windows.Computer</Target>
        </RelationshipType>
       </RelationshipTypes>
      </EntityTypes>
     </TypeDefinitions>
     <Monitoring>
      <Discoveries>
       <Discovery ID="TestGroup.Discovery" Enabled="true" Target="SC!Microsoft.SystemCenter.RootManagementServer" ConfirmDelivery="true" Remotable="true" Priority="Normal">
        <Category>Discovery</Category>
        <DiscoveryTypes>
         <DiscoveryClass TypeID="GroupPopulation.TestGroup" />
        </DiscoveryTypes>
        <DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.DiscoveryProvider">
         <IntervalSeconds>60</IntervalSeconds>
         <SyncTime />
         <ScriptName>TestGroupDiscovery.vbs</ScriptName>
         <Arguments>$MPElement$ $Target/Id$</Arguments>
         <ScriptBody><![CDATA[Dim SourceId
    Dim objConnection
    Dim oRS
    Dim sConnectString
    Dim ManagedEntityID
    Dim oAPI
    Dim oDiscoveryData
    Dim oAttributes
    Dim oLocation
    Dim oHostName
    Dim oMOdel
    Dim oState
    Dim oRegion
    Dim oFSO
    Dim oINst
    dim fsoFile
    SourceId        = WScript.Arguments(0)
    ManagedEntityId     = WScript.Arguments(1)
    
    Set oAPI        = CreateObject("MOM.ScriptAPI")
    Set oDiscoveryData   = oAPI.CreateDiscoveryData(0,SourceId,ManagedEntityId)
    Set oFSO 		= CreateObject("Scripting.FileSystemObject") 
    Set groupInstance 	= oDiscoveryData.CreateClassInstance("$MPElement[Name='GroupPopulation.TestGroup']$")
    set fsoFile		=ofso.opentextfile("c:\Servers.txt", 1)
    
    oAttributes=fsofile.readline
    
    Do Until fsofile.AtEndOFStream 
    	oAttributes=fsofile.readline
    	oLocation=Left(oAttributes,(InStr(oAttributes,",")-1))
    	oAttributes=Right(oAttributes,Len(oAttributes)-Len(oLocation)-1)
    	oHostName=Left(oAttributes,(InStr(oattributes,",")-1))
    	oAttributes=Right(oAttributes,Len(oAttributes)-Len(oHostName)-1)
    	oModel=Left(oAttributes,(InStr(oattributes,",")-1))
    	oAttributes=Right(oAttributes,Len(oAttributes)-Len(oModel)-1)
    	oState=Left(oAttributes,(InStr(oattributes,",")-1))
    	oAttributes=Right(oAttributes,Len(oAttributes)-Len(oState)-1)
    	oRegion=oAttributes
    	oAttributes=""
    
    	If oRegion="West" Then
    		Set ServeriNstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Windows!Microsoft.Windows.Computer']$")
    		serverInstance.AddProperty "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$",oHostName
    		Set relationshipInstance = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='GroupPopulation.TestGroupContainsWindowsComputers']$")
    		relationshipInstance.Source = groupInstance
    		relationshipInstance.Target = serverInstance
    		oDiscoveryData.AddInstance relationshipInstance
    	End If
    Loop
    
          Call oAPI.LogScriptEvent("TestGroupDiscovery.vbs",1234,4,"started. Parameters passed to the discovery script are, in order: " & SourceID & " " & ManagedEntityID & ".")
    
    
    
    'Once the discovery data is obtained it needs to be submitted
    Call oAPI.Return(oDiscoveryData)
               
    ]]></ScriptBody>
         <TimeoutSeconds>120</TimeoutSeconds>
        </DataSource>
       </Discovery>
      </Discoveries>
     </Monitoring>
     <LanguagePacks>
      <LanguagePack ID="ENU" IsDefault="true">
       <DisplayStrings>
        <DisplayString ElementID="GroupPopulation.TestGroup">
         <Name>Test Servers Group</Name>
        </DisplayString>
        <DisplayString ElementID="GroupPopulation.TestGroupContainsWindowsComputers">
         <Name>Test Group Contains Windows Computers</Name>
        </DisplayString>
        <DisplayString ElementID="TestGroup.Discovery">
         <Name>Test Group Discovery</Name>
        </DisplayString>
       </DisplayStrings>
      </LanguagePack>
     </LanguagePacks>
    </ManagementPack>
    

    Содержимое файла C:\Servers.txt:

    LocationCode,host,model,State,Region
    1,ad.domain.com,IBM,Ukraine,Test
    2,ad3.domain.com,HP,Ukraine,Test

    Сервера ad.domain.com и ad3.domain.com появляются в группе Operations Manager.

    Меняю файл на C:\Servers2.txt:

    Host,Role
    ad.domain.com,DC
    ad3.domain.com,DC

    Соответственно, меняю скрипт в пакете на

     

    Dim SourceId
    Dim objConnection
    Dim oRS
    Dim sConnectString
    Dim ManagedEntityID
    Dim oAPI
    Dim oDiscoveryData
    Dim oAttributes
    Dim oHost
    Dim oRole
    SourceId        = WScript.Arguments(0)
    ManagedEntityId     = WScript.Arguments(1)
    
    Set oAPI        = CreateObject("MOM.ScriptAPI")
    Set oDiscoveryData   = oAPI.CreateDiscoveryData(0,SourceId,ManagedEntityId)
    Set oFSO 		= CreateObject("Scripting.FileSystemObject") 
    Set groupInstance 	= oDiscoveryData.CreateClassInstance("$MPElement[Name='GroupPopulation.TestGroup']$")
    set fsoFile		=ofso.opentextfile("c:\Servers2.txt", 1)
    
    oAttributes=fsofile.readline
    
    Do Until fsofile.AtEndOFStream 
    	oAttributes=fsofile.readline
    	oHost=Left(oAttributes,(InStr(oAttributes,",")-1))
    	oAttributes=Right(oAttributes,Len(oAttributes)-Len(oHost)-1)
    	oRole=oAttributes
    	oAttributes=""
    
    	If oRole="DC" Then
    		Set ServeriNstance = oDiscoveryData.CreateClassInstance("$MPElement[Name='Windows!Microsoft.Windows.Computer']$")
    		serverInstance.AddProperty "$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", oHost
    		Set relationshipInstance = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='GroupPopulation.TestGroup']$")
    		relationshipInstance.Source = groupInstance
    		relationshipInstance.Target = serverInstance
    		oDiscoveryData.AddInstance relationshipInstance
    	End If
    Loop
    
          Call oAPI.LogScriptEvent("TestGroupDiscovery.vbs",1234,4,"started. Parameters passed to the discovery script are, in order: " & SourceID & " " & ManagedEntityID & ".")
    
    'Once the discovery data is obtained it needs to be submitted
    Call oAPI.Return(oDiscoveryData)
    
    

     

     

    Если использовать последний скрипт, группа почем-то не наполняется.

    3 ноября 2010 г. 8:04
  • >Set relationshipInstance = oDiscoveryData.CreateRelationshipInstance("$MPElement[Name='GroupPopulation.TestGroup']$")

    Это не является relationship instance. Это группа. Исправьте на ссылку на relationship.

     


    http://OpsMgr.ru/
    • Помечено в качестве ответа egoncharov 3 ноября 2010 г. 9:46
    3 ноября 2010 г. 8:41
    Отвечающий
  • Как все просто оказалось. Спасибо, Алексей, большое. Вы в очередной раз мне помогли!

    3 ноября 2010 г. 9:46