<?xml version="1.0" encoding="windows-1251" ?>
<document type="SelFTrendxTest" version="0.0" xmlns:m="xTest">
    <xTest type="USER_SCRIPT" 
            alias="HR-AT" 
            TitleRus="Расширенный HR-Тест" 
            TitleRootRus="Тесты оценки интенсивности работы персонала" 
            TitleEng="Advanced HR-test" 
            TitleRootEng="Professional HR Performance Tests" 
            TrafficLightsName="Advanced HR-test"
            Version="3.5.7">
        <Files>
            <File type="conf" name="VB.HR.AppActivityHRTest.xTest.xml"/>
            <File type="help" name="XT.VB.what-HR.BasicHRTest.html"/>
            <File type="dll" name="ST_SCTest.dll"/>
        </Files>
      <Keywords>
        <Keyword>HR</Keyword>
        <Keyword>Гамбургский Счет</Keyword>
        <Keyword>Персонал</Keyword>        
      </Keywords>
      <xTestProps>
            <log_level_def>2</log_level_def>
            <truncate_log>1</truncate_log>
            <aver_interval_duration_sec>60</aver_interval_duration_sec>
            <discovery_func>OnDiscovery</discovery_func>
            <work_func>OnDataReceived</work_func>
        </xTestProps>      
        <parameters TitleRus="Файлы списков контролируемых компьютеров:" TitleEng="LongHands Agents Files List:">
            <resources>
                <resource_id TitleRus="Имя файла со списком LHAgent (без расширения)" TitleEng="LongHands Agent Name"></resource_id>
            </resources>
            
            <common_attribs TitleRus="Список параметров (общие):" TitleEng="Parameters List (common):" SubTitleRus="Параметр" SubTitleEng="Parameter">            
                <Attrib Type="String" TitleRus="Сервер службы ProLAN HR-Directory" TitleEng="HR-Directory Server Name" Alias="c_parHRDirectoryServerName">127.0.0.1</Attrib>
                <!--
                <Attrib Type="String" TitleRus="Список бизнес-операций (через ;)" TitleEng="Business-operation list (; separated)" Alias="BusinessOperList">Учет материалов;E-Mail рассылки;Администрирование и управление;Взаимодействие с Microsoft;Взаимодействие с контрагентами;Взаимодействие с партнерами;Взаимодействие с провайдерами;Договора;Закрытие работ;Звонки;Изготовление рекламы;Консультант;Контент для сайта;Контроль взаиморасчетов;Маркетинг;Обработка запросов;Обучение;Оперативный Учет;Переписка;Поддержка офиса;Поддержка проектов;Поддержка сайтов;Поиск клиентов;Поручения;Почтовые рассылки;Работа с клиентами;Работа с партнерами;Рекламные мероприятия;Рекрутинг персонала;Сдача отчетности;Систематизация документов;Систематизация информации;Совещания;Составление отчетности;Стратегический Учет;Техническая работа;Учет затрат;Учет ОС;Учет работ;Учет товаров;Формирование книг п/п;Technical Presale;Программирование;Управление;Услуги;Администрирование;Перерыв;Инструктаж;Исходящие звонки, отправка факсов;</Attrib>
                -->
            </common_attribs>
            
            <resource_attribs TitleRus="Список параметров:" TitleEng="Parameters List:" SubTitleRus="Параметр" SubTitleEng="Parameter">
                <!-- Type: "String", "Bool", "Integer", "Double", "Enum" -->
            </resource_attribs>
        </parameters>
        <popupdisplay>
            <!-- Function: "EventCount", "Average", "Maximum", "Minimum" -->
            <description ru="Расширенный HR-Тест" en="Advanced HR-test"></description>
            
        </popupdisplay>
        <Script language="VBScript">
            <!--
Option Explicit 
Const ForReading = 1
Const g_dBadValue = 1.0e+308

Sub OnDiscovery(ByRef ResSet)

Dim ResCount, Unid, l_intDepartmentCount, arOneLine
Dim strOneLine, FirstLetter
Dim l_strLHAgentName, l_strDepartment, l_strUserName, l_strEvName, l_strAlias, l_Error

Dim i,j

Dim l_objAppManager
Dim l_objAppColl
Dim l_objApplication

Dim l_strConfigFileName
Dim l_objFileScriptObject

Dim l_objUAConfMgr
Dim l_objLog

Dim l_objResSetLog

    'Stop    

	  'On Error Resume Next
    ResSet.LogMsg("Start Sub OnDiscovery.")
    ResSet.SendProgressMessage("VBScript is running")
    
    ResSet.LogMsg("Try to create Create Scripting.FileSystemObject")
    
    Set l_objFileScriptObject = CreateObject("Scripting.FileSystemObject")
    
    If Err.Number Then
      ResSet.LogMsg("Create Object [Scripting.FileSystemObject] Failed.")
    	ResSet.ScriptError = -1
	    ResSet.ScriptErrorInfo = "Ошибка при запуске теста. Не удалось создать объект Scripting.FileSystemObject. Подробности в файле: xfiles_log.txt"
	    ResSet.LogMsg ("*** Start Description Error ***")
	    ResSet.LogMsg ("Error number: " & Err.Number)
      ResSet.LogMsg ("Error Description: " & Err.Description)
	    ResSet.LogMsg ("*** End Description Error ***")
		  Exit Sub
    Else
    	ResSet.LogMsg("End Create Object - Scripting.FileSystemObject Ok")
    End If

    ResCount=ResSet.Count
	
 	  If ResCount > 1 Then
 		  Call MsgBox ("Оцечный тест не поддерживает более одного конфигурационного списка пользователей. Будет использован только первый файл списка.", 48, "Базовый HR-Тест")
 	  End If
	  
    Unid = ResSet.UnidBase
        
    Set l_objLog = CreateObject("PLDBServiceLogComponent.PLDBServiceLog")    
    l_objLog.LogMode = 1

    l_objLog.EnableLog 1,"%temp%\PL_HR-AT_UAConfMgr.log",1,-1,2
    
    l_objLog.WriteLn "HR-AT: User activity conf mgr.",-1,2    

    Set l_objResSetLog = ResSet.Log
    
    For l_intDepartmentCount = 0 To ResCount - 1
    
	    l_strDepartment = Trim (ResSet.Resource(l_intDepartmentCount).Name)
	    l_strConfigFileName = ResSet.GetProcessDir & "\XFiles\" & l_strDepartment & ".txt"
	    ResSet.LogMsg("Grading test config file name: " & l_strConfigFileName)
                          
	    If l_objFileScriptObject.FileExists(l_strConfigFileName) Then

          ' Регистрация информации по пользователям
          Dim l_objUsersColl

          On Error Resume Next          
          Err.Clear
          
          DiscoverUsersInHRDirectory ResSet, l_objUsersColl, l_strConfigFileName

          If (Err.Number <> 0) Then
            ResSet.LogMsg("Failed to DiscoverUsersInHRDirectory. "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
	          ResSet.ScriptError = -1
	          ResSet.ScriptErrorInfo = "Невозможно выполнить обнаружение пользователей." & vbNewLine & vbNewLine & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source     
            Err.Clear            
            Exit Sub
          End If

          On Error GoTo 0
          
          Dim l_objUsersCollItems

          Set l_objUsersCollItems = l_objUsersColl.Items

          ResSet.LogMsg("Filtered users: ")
        
          TraceFilteredUsers ResSet, l_objUsersCollItems
          
          ' Сохраняем отфильтрованных пользователей для использования во время OnDataReceived
          Dim l_strTestAlias 
          
          l_strTestAlias = ResSet.TestAlias
          
          Dim l_strUserCollConfigFileName
          
          l_strUserCollConfigFileName = ResSet.GetProcessDir & "\Configs\" & l_strTestAlias & "_UserCollection.xml"
          
          l_objUsersColl.ConfigFileName = l_strUserCollConfigFileName
          
          l_objUsersColl.Save                     
          
          ' Map для регистрации TotalPerformance Click по всем компьютерам, на которых работает текущий пользователь
          Dim l_objUniqueUserMap
          
          Set l_objUniqueUserMap = CreateObject("ProLAN.VBScriptTools.Map")          
          
          ' Регистрируем события 
          
          ' Набор контроллируемых приложений
          Set l_objAppManager = GetUserActvityApplications()
          
          Set l_objAppColl = l_objAppManager.Applications

          For i = 0 to l_objUsersCollItems.Count - 1

            Dim l_objUser 
            
            Set l_objUser = l_objUsersCollItems.GetAt(i)
          
            ResSet.LogMsg("Users name: " & l_objUser.DisplayName)
            
            For j = 0 to l_objAppColl.GetCount - 1
            
                Set l_objApplication = l_objAppColl.GetAt(j)   
                  
                ResSet.LogMsg("Application Name: " & l_objApplication.Name)
                
                l_strEvName = "[" & l_objUser.ComputerName &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ")" & "(" & l_objApplication.Name & ") Performance (Click/min)"                                
                l_strAlias = l_objUser.ComputerName & l_objUser.DisplayName & LCase(l_objApplication.Name) & "_Performance"
                l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
                Unid = Unid + 1                  
                
            Next

	          l_strEvName = "[" & l_objUser.ComputerName &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ")" & "(" & "Прочее" & ") Performance (Click/min)"
	          l_strAlias = l_objUser.ComputerName & l_objUser.DisplayName & "other" & "_Performance"
	          l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
	          Unid = Unid + 1      
            
		        l_strEvName = "[" & l_objUser.ComputerName &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ") Total Performance (Click/min)"
		        l_strAlias = l_objUser.ComputerName & l_objUser.DisplayName &  "_TotalActivity"
		        l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
            Unid = Unid + 1
                                   
		        l_strEvName = "[" & l_objUser.ComputerName &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ") Agent Availability (%)"
		        l_strAlias = l_objUser.ComputerName & l_objUser.DisplayName & "_Availability"
		        l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
		        Unid = Unid + 1
            
            ' Регистрируем User Total Perfromance on all Computers (при необходимости)
            Dim l_objUserInMap
            
            l_objUserInMap = Null
            
            On Error Resume Next 
            
            Set l_objUserInMap = l_objUniqueUserMap.Find(UCase(l_objUser.Domain & "\" & l_objUser.Account))
            
            On Error GoTo 0 
            
            If IsNull(l_objUserInMap) = True Then 'Регистрируем событие
            
		          l_strEvName = "[" & "*" &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ") Total Performance (Click/min)"
		          l_strAlias = "*" & l_objUser.Domain & "\" & l_objUser.Account &  "_TotalActivity"
		          l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
              Unid = Unid + 1
                 
              ' Добавляем в карту
              l_objUniqueUserMap.Insert UCase(l_objUser.Domain & "\" & l_objUser.Account), l_objUser
              
            End If                             
            
            ' Регистрируем бизнес-операции
            Dim l_objBusinessOperColl
            Dim l_objBusinessOperCollItems
            Dim l_objBusinessOper
            
            Dim l_objBusinessOperActionClassesMap
            
            Set l_objBusinessOperActionClassesMap = CreateObject("ProLAN.VBScriptTools.Map")
            
            Set l_objBusinessOperColl = l_objUser.BusinessOperColl
            Set l_objBusinessOperCollItems = l_objBusinessOperColl.Items 
            
            For j = 0 to l_objBusinessOperCollItems.Count - 1
            
              Set l_objBusinessOper = l_objBusinessOperCollItems.GetAt(j)
              
		          l_strEvName = "[" & l_objUser.ComputerName &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ")" & "("& l_objBusinessOper.ActionClassID & "\" & l_objBusinessOper.ActionClassName & "\" & l_objBusinessOper.BusinessOperName & ") Business Operation"
		          l_strAlias = l_objUser.ComputerName & l_objUser.DisplayName & LCase(l_objBusinessOper.ActionClassName & "\" & l_objBusinessOper.BusinessOperName) & "_BusinessOperation"
              l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
              Unid = Unid + 1                  

              ' Добавляю бизнес операцию, если ее нет
              Dim l_objActionClassInMap
              
              l_objActionClassInMap = Null
              
              On Error Resume Next 
              
              Set l_objActionClassInMap = l_objBusinessOperActionClassesMap.Find(CStr(l_objBusinessOper.ActionClassID))
              
              On Error GoTo 0 
              
              If IsNull(l_objActionClassInMap) = True Then 'Регистрируем событие
                  l_objBusinessOperActionClassesMap.Insert CStr(l_objBusinessOper.ActionClassID), l_objBusinessOper
              End If

            Next
                                    
            ' Регистрируем Прочее для каждого класса
            l_objBusinessOperActionClassesMap.Reset
            
            Do While True

              Dim l_objActionClassItem
              
              l_objActionClassItem = Null
              
              On Error Resume Next 
              
              Set l_objActionClassItem = l_objBusinessOperActionClassesMap.GetNext 
              
              On Error GoTo 0 
              
              If IsNull(l_objActionClassItem)=False Then
              
	              l_strEvName = "[" & l_objUser.ComputerName &  "]" & "(" & l_objUser.DisplayName & "@" & l_strDepartment & ")" & "(" & l_objActionClassItem.ActionClassID & "\" & l_objActionClassItem.ActionClassName & "\" & "Прочее" & ") Business Operation"
	              l_strAlias = l_objUser.ComputerName & l_objUser.DisplayName & l_objActionClassItem.ActionClassName & LCase("other") & "_BusinessOperation"
                l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
                Unid = Unid + 1                  
                                    
              Else        
                  Exit Do                            
              End If    
              
            Loop
            
          Next      
          
	    Else
		    ResSet.ScriptErrorInfo = "Не найден конфигурационный файл, указанный в настройках теста. Проверьте наличие файла: '" & fileLongHandsAgents & "' и повторите запуск теста."
		    ResSet.ScriptError = -1
		    Exit Sub
	    End If
    Next

    l_strEvName = "Total Node Availability (%)"
    l_strAlias = "LHAgent_Availability"
    l_Error = ResSet.EventAdd(l_strEvName, l_strAlias, Unid)
    l_Error =  ResSet.AddTrafficLight(l_strAlias, l_strEvName, l_strEvName, "Average", "<", 5, 20, 50, 100)	
    Unid = Unid + 1

End Sub

Sub DiscoverUsersInHRDirectory(ByRef ResSet, ByRef objUsersColl, ByRef strConfigFileName)

'Stop

Dim l_objUAConfMgr
Dim l_objLog

    Set l_objLog = ResSet.Log

    Set l_objUAConfMgr = CreateObject("ProLAN.PLUserActivityConfigurationManager.PLUserActivityConfigurationManager")

    l_objUAConfMgr.Log = l_objLog

    l_objUAConfMgr.LoadConfigFile strConfigFileName

    'TraceTestConfig l_objUAConfMgr, l_objLog
    Dim l_objRequiredCompMap

    Set l_objRequiredCompMap = CreateObject("ProLAN.VBScriptTools.Map")

    ' Формируем map компьютеров
    CreateRequiredCompMap l_objUAConfMgr, l_objRequiredCompMap

    ' Регистрация информации по пользователям
    Dim l_objUsersColl

    Set l_objUsersColl = CreateObject("ProLAN.PLUserActivityItemsComponent.UserCollection")

    l_objUsersColl.Log = l_objLog

    Dim l_objUsersCollItems

    Set l_objUsersCollItems = l_objUsersColl.Items

    QueryAvailableUsers ResSet,l_objUAConfMgr,l_objUsersCollItems, l_objRequiredCompMap

    Set objUsersColl = l_objUsersColl

End Sub

Sub TraceFilteredUsers(ByRef ResSet, ByRef objDynamicArray)

Dim i

    For i = 0 to objDynamicArray.Count - 1
    
      Dim l_objUser 
      
      Set l_objUser = objDynamicArray.GetAt(i)
    
      ResSet.LogMsg("Users name: " & l_objUser.DisplayName)
    
    Next

End Sub

Sub QueryAvailableUsers(ByRef ResSet,ByRef objUAConfMgr,ByRef objDynamicArray, ByRef objRequiredCompMap)

    'Stop

    ' Запрос к HR-Directory о наличии работающих пользователей на указанных компьютерах

    Dim l_strHRDirectoryServerName
    
    l_strHRDirectoryServerName = ResSet.CommonProp.Attrib("c_parHRDirectoryServerName").Value    

    ResSet.LogMsg("HRDirectoryServerName: " & l_strHRDirectoryServerName)

    Dim l_strAvailableUsersQuery          
    Dim l_objSection
    Dim l_objItemColl
    Dim l_objItem
    Dim l_objItemFieldColl
    Dim l_objItemField
    Dim l_objItemFieldDomain
    Dim l_objItemFieldUserDisplayName
    Dim i,j
                     
    Set l_objSection=objUAConfMgr.GetSection("Users")
    
    Set l_objItemColl = l_objSection.Items

    Dim l_nQueryItemsNum
    Dim l_nUserIndex       
    
    l_nQueryItemsNum = 10 'Количество элементов, запрашиваемых за цикл запроса
    l_nUserIndex = 0
    
    Dim l_objDisplayNameMap ' Карта для предварительно заданного имени пользователя
    
    Set l_objDisplayNameMap = CreateObject("ProLAN.VBScriptTools.Map")
    
    For i = 0 To (l_objItemColl.GetCount - 1) / l_nQueryItemsNum + 1

        l_strAvailableUsersQuery = "Select * from CPLHRDirectoryUsers WHERE "
        
        l_objDisplayNameMap.Clear
        
        For j = 0 to  l_nQueryItemsNum
                  
          Set l_objItem = l_objItemColl.GetAt(l_nUserIndex)
                                     
          Set l_objItemFieldColl = l_objItem.ItemFields
          
          Set l_objItemField = l_objItemFieldColl.GetField("Account")
          Set l_objItemFieldDomain = l_objItemFieldColl.GetField("Domain")
          Set l_objItemFieldUserDisplayName = l_objItemFieldColl.GetField("UserName")
          
          If j <> 0 Then              
          
            l_strAvailableUsersQuery = l_strAvailableUsersQuery & " OR "
            
          End If
          
          l_strAvailableUsersQuery = l_strAvailableUsersQuery & "( m_strUserName = '" & l_objItemField.Value & "'" & " AND m_strDomainName='" & l_objItemFieldDomain.Value & "')"

          ' Добавляем Display имя пользователя в карту
          l_objDisplayNameMap.Insert UCase(l_objItemFieldDomain.Value & "\" & l_objItemField.Value), l_objItemFieldUserDisplayName.Value
        
          l_nUserIndex = l_nUserIndex + 1          
        
          if l_nUserIndex=l_objItemColl.GetCount Then
            Exit For
          End If                  
        
        Next  
              
        ' Запрос
        ResSet.LogMsg("Select users from HR-Directory query: " & l_strAvailableUsersQuery)

        Dim l_objWMIService
        Dim l_objPLHRDirectoryUsersColl
        Dim l_objPLHRDirectoryUser

        Set l_objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\" & l_strHRDirectoryServerName & "\root\CIMV2") 

        Set l_objPLHRDirectoryUsersColl = l_objWMIService.ExecQuery(l_strAvailableUsersQuery)

        ResSet.LogMsg("HRDirectoryUsers:")

        For Each l_objPLHRDirectoryUser in l_objPLHRDirectoryUsersColl

          ResSet.LogMsg("User Full Name: " & l_objPLHRDirectoryUser.m_strUserCommonName)            
          
          'Проверяем наличие компьютера пользователя в списке разрешенных
          Dim l_objComp
          
          ResSet.LogMsg("Check if computer allowed: " & l_objPLHRDirectoryUser.m_strComputerName)            
          
          l_objComp = objRequiredCompMap.Find(UCase(l_objPLHRDirectoryUser.m_strComputerName))
                   
          If IsEmpty(l_objComp)=False Then                    
          
            'objDynamicArray.Add l_objPLHRDirectoryUser                            
            Dim l_objUser
            
            Set l_objUser = CreateObject("ProLAN.PLUserActivityItemsComponent.User")

            l_objUser.Domain = l_objPLHRDirectoryUser.m_strDomainName
            l_objUser.Account = l_objPLHRDirectoryUser.m_strUserName
            l_objUser.DisplayName = l_objPLHRDirectoryUser.m_strUserCommonName
            l_objUser.ComputerName = l_objPLHRDirectoryUser.m_strComputerName
            
            Dim l_strDisplayName
            
            l_strDisplayName = l_objDisplayNameMap.Find(UCase(l_objUser.Domain & "\" & l_objUser.Account))
            
            If IsEmpty(l_strDisplayName)=False Then ' Заменяем имя на предварительно заданное в конфигурации
            
              l_objUser.DisplayName = l_strDisplayName
              
            End If

            ' Обнаруживаем запущенные бизнес-операции
            On Error Resume Next            
            Err.Clear
            
            QueryBusinessOperations ResSet,l_objUser

            If (Err.Number <> 0) Then
              ResSet.LogMsg("Failed to QueryBusinessOperations. "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
              Err.Clear                          
            Else
            
              ' Добавляем компьютер в карту  
              objDynamicArray.Add l_objUser  
              
            End If

            On Error GoTo 0
                                    
          Else
          
            ResSet.LogMsg("Computer: " & l_objPLHRDirectoryUser.m_strComputerName & " is not allowed")            
          
          End If            

        Next
       
        if l_nUserIndex=l_objItemColl.GetCount Then
          Exit For
        End If
       
    Next                              

End Sub

Sub QueryBusinessOperations(ByRef ResSet, ByRef objUser)

'Stop

Dim l_objLog

    Set l_objLog = ResSet.Log

    ResSet.LogMsg("Querying business operations from comp: " & objUser.ComputerName)

    Dim l_objWMIService

    Set l_objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\" & objUser.ComputerName & "\root\CIMV2") 

    Dim l_strFullAccount
         
    l_strFullAccount = objUser.Domain & "\" & objUser.Account

    ResSet.LogMsg("Querying data for user: " & l_strFullAccount)                      

    Dim l_strQuery 
    
    l_strQuery = "SELECT * FROM CPLBusinessOperationActivity WHERE " & " m_strUserName='" & objUser.Account & "' " & " AND m_strDomainName='" & objUser.Domain & "' "

    ResSet.LogMsg("Query: " & l_strQuery)                   
    
    Dim l_objPLBusinessOperationActivity
    Dim l_objItem

	  Set l_objPLBusinessOperationActivity = l_objWMIService.ExecQuery(l_strQuery)

    For Each l_objItem in l_objPLBusinessOperationActivity

        ResSet.LogMsg("SessionID: " & l_objItem.m_dwSessionID & " User Name: " & l_objItem.m_strUserName & " Domain Name: " & l_objItem.m_strDomainName & " IntervalEnd: " & l_objItem.m_dtIntervalEnd & " m_dwIntervalDurationSec: " & l_objItem.m_dwIntervalDurationSec & " m_strBusinessOperName: " & l_objItem.m_strBusinessOperName & " BusinessOperDurationSec: " & l_objItem.m_dwBusinessOperDurationSec)
        
        ' Добавляем элемент в коллекцию Business Operations
        Dim l_objBusinessOperColl
        Dim l_objBusinessOperCollItems
        Dim l_objBusinessOper
        
        Set l_objBusinessOperColl = objUser.BusinessOperColl
        Set l_objBusinessOperCollItems = l_objBusinessOperColl.Items 

        Set l_objBusinessOper = CreateObject("ProLAN.PLUserActivityItemsComponent.BusinessOperation")
        
        l_objBusinessOper.Log = l_objLog
        
        l_objBusinessOper.BusinessOperName = l_objItem.m_strBusinessOperName
        l_objBusinessOper.ActionClassName = l_objItem.m_strActionClassName
        l_objBusinessOper.ActionClassID = l_objItem.m_dwActionClassId
        l_objBusinessOper.SubClassName = l_objItem.m_strSubClassName

        l_objBusinessOper.ThresholdRed = l_objItem.m_dwThresholdRed
        l_objBusinessOper.ThresholdBlRed = l_objItem.m_dwThresholdBlRed
        l_objBusinessOper.ThresholdYellow = l_objItem.m_dwThresholdYellow
        l_objBusinessOper.ThresholdBlYellow = l_objItem.m_dwThresholdBlYellow

        l_objBusinessOperCollItems.Add l_objBusinessOper        
        
    Next                            

End Sub


Sub CreateRequiredCompMap(ByRef objUAConfMgr, ByRef objRequiredCompMap)

Dim l_objSection
Dim l_objItemColl
Dim l_objItem
Dim l_objItemFieldColl
Dim l_objItemField
Dim i

    Set l_objSection=objUAConfMgr.GetSection("Computers")
    
    Set l_objItemColl = l_objSection.Items
    
    For i = 0 To l_objItemColl.GetCount - 1

        Set l_objItem = l_objItemColl.GetAt(i)
                                   
        Set l_objItemFieldColl = l_objItem.ItemFields
        
        Set l_objItemField = l_objItemFieldColl.GetField("ComputerName")
        
        objRequiredCompMap.Insert UCase(l_objItemField.Value), UCase(l_objItemField.Value)
    
    Next

End Sub

Sub OnDataReceived(ByRef ResSet)

  'Stop
  	
	Dim i
	Dim l_MouseRate, l_KeyboardRate, l_strAlias

  Dim l_objAppManager
  Dim l_objAppColl
  Dim l_objApplication
  
  Dim l_nTotalPerformance
  
  On Error Resume Next

  ' Набор контроллируемых приложений
  Set l_objAppManager = GetUserActvityApplications()
  
  Set l_objAppColl = l_objAppManager.Applications

	ResSet.LogMsg("Start OnDataReceived")
	
  '// Init hash for quick event search
  ResSet.InitEventsHash
  'DtError = ResSet.InternalError  
    
  ' Log из ResSet
  Dim l_objResSetLog
  
  Set l_objResSetLog = ResSet.Log
  
  ' Загружаем коллецию пользователей
  Dim l_strTestAlias 
  
  l_strTestAlias = ResSet.TestAlias
  
  Dim l_objUsersColl
  
  Set l_objUsersColl = CreateObject("ProLAN.PLUserActivityItemsComponent.UserCollection")
  
  l_objUsersColl.Log = l_objResSetLog
  
  Dim l_strUserCollConfigFileName
  
  l_strUserCollConfigFileName = ResSet.GetProcessDir & "\Configs\" & l_strTestAlias & "_UserCollection.xml"
  
  l_objUsersColl.ConfigFileName = l_strUserCollConfigFileName
  
  l_objUsersColl.Restore                     

  Dim l_objUsersCollItems

  Set l_objUsersCollItems = l_objUsersColl.Items
 
  ResSet.LogMsg("Filtered users: ")

  TraceFilteredUsers ResSet, l_objUsersCollItems
  
  Dim l_bIsRediscoveryRequired
  
  l_bIsRediscoveryRequired = False
  
  Do While Not ResSet.StopTest
  
      ResSet.LogMsg("Start Loop")

      If ResSet.IsNewSLaPeriod Then
                                      
        Dim l_nUserIndex
        Dim l_nDataAvailable
        Dim l_nAvailableUsers
        
 			  If (ResSet.IsRediscoveryRunning = True) Or (l_bIsRediscoveryRequired = True) Then
        
              If l_bIsRediscoveryRequired Then
                  ResSet.StartRediscovery()          
              End If
        
			        ResSet.LogMsg("Discovery condition has been detected, breaking OnDataReceived loop.")
	        	  Exit Do
		    End If
        
        l_nAvailableUsers = 0
        
        For l_nUserIndex = 0 To l_objUsersCollItems.Count - 1
          
          Dim l_objUser 
          
          Set l_objUser = l_objUsersCollItems.GetAt(l_nUserIndex)
        
          l_nDataAvailable = 0
        
          GetUserActivityData ResSet, l_objUser, l_objAppManager, l_nDataAvailable                                           
        
          If (Err.Number <> 0) Then
            ResSet.LogMsg("Failed to GetUserActivityData. "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
	          ResSet.ScriptError = -1
	          ResSet.ScriptErrorInfo = "Невозможно получить данные о приложениях пользователя." & vbNewLine & vbNewLine & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source     
            Err.Clear            
          End If
            
          l_nAvailableUsers = l_nAvailableUsers + l_nDataAvailable                   
          
          GetBusinessOperActivityData ResSet, l_objUser

          If (Err.Number <> 0) Then
            ResSet.LogMsg("Failed to GetBusinessOperActivityData. "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
	          ResSet.ScriptError = -1
	          ResSet.ScriptErrorInfo = "Невозможно получить данные о бизней операциях пользователя." & vbNewLine & vbNewLine & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source     
            Err.Clear            
          End If

        Next
        
        SetTotalPerformanceClicks ResSet, l_objUsersCollItems

        If (Err.Number <> 0) Then
          ResSet.LogMsg("Failed to SetTotalPerformanceClicks. "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
          ResSet.ScriptError = -1
          ResSet.ScriptErrorInfo = "Невозможно задать TotalPerformanceClicks для пользователей." & vbNewLine & vbNewLine & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source     
          Err.Clear            
        End If

        l_strAlias = "LHAgent_Availability"
        
        If l_objUsersCollItems.Count = 0 Then
	        ResSet.Events(l_strAlias).Value = 0
        Else
	        ResSet.Events(l_strAlias).Value = (l_nAvailableUsers / l_objUsersCollItems.Count * 100)
        End If
            
        ResSet.SendSLaEvents()
        ResetEvents ResSet
        
        'ResSet.Sleep 5000 
                  
        l_bIsRediscoveryRequired = IsRediscoveryRequired(ResSet,l_objUsersColl)

        If (Err.Number <> 0) Then
          ResSet.LogMsg("Failed to IsRediscoveryRequired. "  & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source)  
          ResSet.ScriptError = -1
          ResSet.ScriptErrorInfo = "Ошибка во время проверки условия Rediscovery." & vbNewLine & vbNewLine & "Error Number: "  & CStr(Err.Number) & " Error Descr: " & Err.Description & " Err Source: " & Err.Source     
          Err.Clear            
        End If

        ResSet.LogMsg("Is Rediscovery Required: " & l_bIsRediscoveryRequired)  

        'If l_bIsRediscoveryRequired Then
        '    ResSet.StartRediscovery()          
        'End If
                  
    Else
        ResSet.Sleep 5000 ' 5 sec
    End If
    ResSet.LogMsg("End Loop")
    
    'If ResSet.IsRediscoveryRunning = True Then
    '    ResSet.LogMsg("Discovery condition has been detected, breaking OnDataReceived loop.")
    '    Exit Do
    'End If
        
  Loop
End Sub

Sub SetTotalPerformanceClicks(ByRef ResSet, ByRef objUsersCollItems)

'Stop

    Dim l_nUserIndex
    Dim l_strAlias

    Dim l_objUniqueUserMap
    
    Set l_objUniqueUserMap = CreateObject("ProLAN.VBScriptTools.Map")          

    For l_nUserIndex = 0 To objUsersCollItems.Count - 1

        Dim l_objUserSrc 
        
        Set l_objUserSrc = objUsersCollItems.GetAt(l_nUserIndex)

        Dim l_strUserSrcKey
        
        l_strUserSrcKey = l_objUserSrc.Domain & "\" & l_objUserSrc.Account

        Dim l_objUserInMap
        
        l_objUserInMap = Null
        
        On Error Resume Next 
        
        Set l_objUserInMap = l_objUniqueUserMap.Find(UCase(l_objUserSrc.Domain & "\" & l_objUserSrc.Account))
        
        On Error GoTo 0 
        
        If IsNull(l_objUserInMap) = True Then 'Регистрируем событие
                     
          ' Добавляем в карту
          l_objUniqueUserMap.Insert UCase(l_objUserSrc.Domain & "\" & l_objUserSrc.Account), l_objUserSrc
          
          Dim i
          Dim l_nClicksPerMinuteMax
          
          l_nClicksPerMinuteMax = l_objUserSrc.ClicksPerMinute
          
          For i = l_nUserIndex + 1 To objUsersCollItems.Count - 1
            
              Dim l_objUserDest
              
              Set l_objUserDest = objUsersCollItems.GetAt(i)
                      
              Dim l_strUserDestKey
              
              l_strUserDestKey = l_objUserDest.Domain & "\" & l_objUserDest.Account
                            
              If l_strUserSrcKey = l_strUserDestKey Then
                
                  Dim l_nClicksPerMinuteDest
                  
                  l_nClicksPerMinuteDest = l_objUserDest.ClicksPerMinute
                
                  If l_nClicksPerMinuteDest > l_nClicksPerMinuteMax Then              
                  
                    l_nClicksPerMinuteMax = l_nClicksPerMinuteDest                                         
                    
                  End If                  
                
              End If            
            
          Next

          ' Регистрируем метрику
          l_strAlias = "*" & l_objUserSrc.Domain & "\" & l_objUserSrc.Account &  "_TotalActivity"
          ResSet.Events(l_strAlias).Value = l_nClicksPerMinuteMax          

        End If                                            
        
    Next

End Sub

Function IsRediscoveryRequired(ByRef ResSet, ByRef objUsersCollCurr)

'Stop 

Dim l_strDepartment
Dim l_strConfigFileName

Dim l_bIsRediscoveryRequired

	    l_strDepartment = Trim (ResSet.Resource(0).Name)  ' Работаем только с первым списком
	    l_strConfigFileName = ResSet.GetProcessDir & "\XFiles\" & l_strDepartment & ".txt"
	    ResSet.LogMsg("Grading test config file name: " & l_strConfigFileName)

      Dim l_objUsersCollNew

      DiscoverUsersInHRDirectory ResSet, l_objUsersCollNew, l_strConfigFileName
      
      Dim l_flPercentNew
      Dim l_nItemsNew
      Dim l_flPercentDeprecated
      Dim l_nItemsDeprecated

      l_flPercentNew = 0.0
      l_nItemsNew = CLng(0)
      l_flPercentDeprecated = 0.0
      l_nItemsDeprecated = CLng(0)
      
      objUsersCollCurr.Diff l_objUsersCollNew, l_flPercentNew, l_nItemsNew, l_flPercentDeprecated, l_nItemsDeprecated

      ResSet.LogMsg("Percent new: " & l_flPercentNew & " Count new: " & l_nItemsNew & " PercentDeprecated: " & l_flPercentDeprecated & " ItemsDeprecated: " & l_nItemsDeprecated)
      
      l_bIsRediscoveryRequired = False
      
      If l_flPercentNew > 0.000001 Then
          l_bIsRediscoveryRequired = True
      End If
      
      If l_flPercentDeprecated > 10.0 Then
          l_bIsRediscoveryRequired = True
      End If
      
      IsRediscoveryRequired = l_bIsRediscoveryRequired

End Function


Sub GetUserActivityData(ByRef ResSet, ByRef objUser, ByRef objAppManager, ByRef nDataAvailable)

Dim l_objWMIService

Dim l_objPLUserActivity
Dim l_objItem

Dim l_strAgentHostName
Dim l_strAlias

Dim l_objEvent
Dim l_objAppColl
Dim l_objApplication

Dim i

Dim l_nOtherAppClicksPerMinute

Dim l_objWMI 
Dim l_objPingResults
Dim l_oPingResult
Dim l_bSucceededToPing

Dim l_nTotalPerformance

Dim l_bIsDataAvailable

    l_bIsDataAvailable = 0
    
    l_nTotalPerformance = 0
    l_nOtherAppClicksPerMinute = 0
    
    'Подключаемся к агенту
    l_strAgentHostName = objUser.ComputerName

    ResSet.LogMsg("Agent Host: " & l_strAgentHostName)

    'Пингуем агента для уменьшения возможного тайм-аута
    l_bSucceededToPing = False

    Set l_objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}//./root/cimv2")
	  Set l_objPingResults = l_objWMI.ExecQuery("Select * FROM Win32_PingStatus WHERE Address = '" & l_strAgentHostName & "'")
  
		For Each l_oPingResult In l_objPingResults
      If l_oPingResult.StatusCode = 0 Then
        l_bSucceededToPing = True 
        Exit For
      End If
    Next
 
    If l_bSucceededToPing <> True Then
      ResSet.LogMsg("Failed to ping: " & l_strAgentHostName)  
      Err.Raise vbObjectError 
    End If

    Set l_objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\" & l_strAgentHostName & "\root\CIMV2") 

    Dim l_strFullAccount

    l_strFullAccount = objUser.Domain & "\\" & objUser.Account
    
    Dim l_strQuery
    
    l_strQuery = "SELECT * FROM CPLGUIProcessActivity WHERE m_strUserName = '" & l_strFullAccount & "'"

    ResSet.LogMsg(l_strQuery)

    Set l_objPLUserActivity = l_objWMIService.ExecQuery(l_strQuery)
        
    ResSet.LogMsg("User activity start =====")    
    
    For Each l_objItem in l_objPLUserActivity

        ResSet.LogMsg("Active process: " & l_objItem.m_strProcessName & " Clicks Per Minute: " & l_objItem.m_dwClicksPerMinute & " User Name: " & l_objItem.m_strUserName)
        
        l_bIsDataAvailable = 1

        Set l_objAppColl = objAppManager.FindApplications(l_objItem.m_strProcessName)

        For i = 0 To l_objAppColl.GetCount - 1

            Set l_objApplication = l_objAppColl.GetAt(i)    

            ResSet.LogMsg("Application Name: " & l_objApplication.Name)            

            ' Регистрируем события активности процессов            
            l_strAlias = objUser.ComputerName & objUser.DisplayName & LCase(l_objApplication.Name) & "_Performance"
            
            ' Virtual Total
            l_nTotalPerformance = l_nTotalPerformance + l_objItem.m_dwClicksPerMinute        
            
            ResSet.Events(l_strAlias).Value = l_objItem.m_dwClicksPerMinute    
        Next

        If l_objAppColl.GetCount = 0 Then                  
                  
          ResSet.LogMsg("Application for process: " & l_objItem.m_strProcessName & " doesn't exists in coll")
          
          l_nOtherAppClicksPerMinute = l_nOtherAppClicksPerMinute + l_objItem.m_dwClicksPerMinute
          
          l_nTotalPerformance = l_nTotalPerformance + l_objItem.m_dwClicksPerMinute        
          
        End If
        
    Next                            
    
    ' Добавляем счетчик для other    
    l_strAlias = objUser.ComputerName & objUser.DisplayName & "other" & "_Performance"
    
    If l_nOtherAppClicksPerMinute<> 0 Then                   
      ResSet.Events(l_strAlias).Value = l_nOtherAppClicksPerMinute          
    Else
      ResSet.Events(l_strAlias).Value = g_dBadValue
    End If

    ' Метрику Total Performance фиксируем вне зависимости от доступности LHA агента
    l_strAlias = objUser.ComputerName & objUser.DisplayName &  "_TotalActivity"
    
    ResSet.Events(l_strAlias).Value = l_nTotalPerformance
    
    objUser.ClicksPerMinute = l_nTotalPerformance

    ' Метрика доступность данных
    l_strAlias = objUser.ComputerName & objUser.DisplayName & "_Availability"
    
    ResSet.Events(l_strAlias).Value = l_bIsDataAvailable
    
    nDataAvailable = l_bIsDataAvailable

    ResSet.LogMsg("User activity end =====")
            
End Sub

Sub GetBusinessOperActivityData(ByRef ResSet, ByRef objUser)

'Stop

Dim l_objWMIService
Dim l_objRefresher

Dim l_objItem

Dim l_strAgentHostName
Dim l_strAlias

Dim l_objEvent

Dim i

Dim l_objWMI 
Dim l_objPingResults
Dim l_oPingResult
Dim l_bSucceededToPing

Dim l_objPLBusinessOperationActivity

Dim l_nOtherBusinessOperations

Dim l_arrMonitoringSource

Dim l_strFullAccount


    l_nOtherBusinessOperations = 1
        
    'Подключаемся к агенту
    l_strAgentHostName = objUser.ComputerName

    ResSet.LogMsg("Agent Host: " & l_strAgentHostName)

    'Пингуем агента для уменьшения возможного тайм-аута
    l_bSucceededToPing = False

    Set l_objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}//./root/cimv2")
	  Set l_objPingResults = l_objWMI.ExecQuery("Select * FROM Win32_PingStatus WHERE Address = '" & l_strAgentHostName & "'")
  
		For Each l_oPingResult In l_objPingResults
      If l_oPingResult.StatusCode = 0 Then
        l_bSucceededToPing = True 
        Exit For
      End If
    Next
 
    If l_bSucceededToPing <> True Then
      ResSet.LogMsg("Failed to ping: " & l_strAgentHostName)  
      Err.Raise vbObjectError 
    End If

    Set l_objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\" & l_strAgentHostName & "\root\CIMV2") 

    ' Бизнес операции

    l_strFullAccount = objUser.Domain & "\" & objUser.Account

    ResSet.LogMsg("Querying data for user: " & l_strFullAccount)                      

    Dim l_strQuery

    ' m_dwActionClassID = 0 AND
    l_strQuery = "SELECT * FROM CPLBusinessOperationActivity WHERE  m_dwBusinessOperDurationSec > 0 " & " AND m_strUserName='" & objUser.Account & "' " & " AND m_strDomainName='" & objUser.Domain & "' "

    ResSet.LogMsg(l_strQuery)
    
	  Set l_objPLBusinessOperationActivity = l_objWMIService.ExecQuery(l_strQuery)

    'l_objRefresher.Refresh
        
    For Each l_objItem in l_objPLBusinessOperationActivity

        ResSet.LogMsg("SessionID: " & l_objItem.m_dwSessionID & " User Name: " & l_objItem.m_strUserName & " Domain Name: " & l_objItem.m_strDomainName & " IntervalEnd: " & l_objItem.m_dtIntervalEnd & " m_dwIntervalDurationSec: " & l_objItem.m_dwIntervalDurationSec & " m_strBusinessOperName: " & l_objItem.m_strBusinessOperName & " ActionClassName: " & l_objItem.m_strActionClassName & " BusinessOperDurationSec: " & l_objItem.m_dwBusinessOperDurationSec)

        Dim l_strBusinessOperKey 
        
        l_strBusinessOperKey = l_objItem.m_strActionClassName & "\" & l_objItem.m_strBusinessOperName

        Dim l_objBusinessOperColl
        Dim l_objBusinessOperCollItems
        Dim l_objBusinessOper
        
        Set l_objBusinessOperColl = objUser.BusinessOperColl
        Set l_objBusinessOperCollItems = l_objBusinessOperColl.Items 

        Dim l_boolIsBOExists
        
        l_boolIsBOExists = False

        For i = 0 To l_objBusinessOperCollItems.Count - 1
        
          Set l_objBusinessOper = l_objBusinessOperCollItems.GetAt(i)
          
          Dim l_strCurrBOKey
          
          l_strCurrBOKey = l_objBusinessOper.ActionClassName & "\" & l_objBusinessOper.BusinessOperName
          
          If l_strBusinessOperKey = l_strCurrBOKey Then
            l_boolIsBOExists = True
            Exit For
          End If
        
        Next
        
        If l_boolIsBOExists Then

            ResSet.LogMsg("Business Oper Name: " & l_strBusinessOperKey)            

            ' Регистрируем события активности процессов
            l_strAlias = objUser.ComputerName & objUser.DisplayName & LCase(l_strBusinessOperKey) & "_BusinessOperation"
            
            ResSet.Events(l_strAlias).Value = 1    
            
            l_nOtherBusinessOperations = 0

        Else

          ResSet.LogMsg("Business operations: " & l_strBusinessOperKey & " doesn't exist in coll")          

          ' Добавляем счетчик для other business operations
          l_strAlias = objUser.ComputerName & objUser.DisplayName & l_objItem.m_strActionClassName & LCase("other") & "_BusinessOperation"
          ResSet.Events(l_strAlias).Value = 1    

        End If
                
    Next                            
                    
    ResSet.LogMsg("Business operation start =====")    

End Sub

Sub ResetEvents(ByRef ResSet)
    Dim l_iEvCount, l_Indx

    l_iEvCount = ResSet.EventsCount
    
    For l_Indx = 0 To l_iEvCount - 1
        ResSet.Events(l_Indx).Value = ResSet.BadValue
    Next    

End Sub

' Список контролируемых приложений
Function GetApplicationsList()

'Stop

    Dim l_aApplications(6)

    ' Структура: элемент 0 - Имя приложения в user friendly написании, 1 и далее - название windows процессов 
    l_aApplications(0) = Array("Web-браузер","IExplore.exe","FireFox.exe","opera.exe")  
    l_aApplications(1) = Array("1C:Предприятие","1cv7s.exe")  
    l_aApplications(2) = Array("SAP","SAPClient.exe")  
    l_aApplications(3) = Array("Текстовый редактор","Winword.exe","Notepad.exe")  
    l_aApplications(4) = Array("Электронная таблица","excel.exe")  
    l_aApplications(5) = Array("Почтовый клиент","msimn.exe","outlook.exe")  
    l_aApplications(6) = Array("ICQ","icq.exe")  
    
    GetApplicationsList = l_aApplications
    
End Function


Function GetUserActvityApplications()

Dim l_objLog
Dim l_objAppManager

Dim l_objAppColl
Dim l_objApplication
Dim l_objProcessesColl
Dim l_objProcess

Dim l_aApplicationsList

Dim i,j

    Set l_objLog = CreateObject("PLDBServiceLogComponent.PLDBServiceLog")

    'l_objLog.AddDateTimePrefix = 1
    l_objLog.LogMode = 1

    l_objLog.EnableLog 1,"%temp%\PLTestAppManager.log",1,-1,2

    l_objLog.WriteLn CStr(Now) & " " & "User activity tester",-1,2

    Set l_objAppManager = CreateObject("ProLAN.PLUserActivityApplicationsManager.PLUserActivityApplicationsManager")

    l_objLog.WriteLn "Succeeded to create AppManager",-1,2

    l_objAppManager.Log = l_objLog

    l_objLog.WriteLn "Getting applications",-1,2

    Set l_objAppColl = l_objAppManager.Applications

    l_objAppColl.Log = l_objLog

    l_objLog.WriteLn "Creating application",-1,2

	l_aApplicationsList = GetApplicationsList ()

	For i=LBound(l_aApplicationsList) To UBound(l_aApplicationsList)

		Dim l_aAppProcesses 
		
		l_aAppProcesses = l_aApplicationsList(i)

		' Application
		Set l_objApplication = CreateObject("ProLAN.PLUserActivityApplicationsManager.PLUserActivityApplication")

		l_objApplication.Log = l_objLog

		l_objApplication.Name = l_aAppProcesses(0)
	
		l_objAppColl.Add l_objApplication	
		
		For j=LBound(l_aAppProcesses) + 1 To UBound(l_aAppProcesses)
			
			Set l_objProcessesColl = l_objApplication.Processes

			Set l_objProcess = CreateObject("ProLAN.PLUserActivityApplicationsManager.PLUserActivityProcess")

			l_objProcess.Name = l_aAppProcesses(j)

			l_objProcessesColl.Add l_objProcess
						
		Next
	Next 

    ' Тестовый вывод
    For i = 0 To l_objAppColl.GetCount - 1

        Set l_objApplication = l_objAppColl.GetAt(i)    

        l_objLog.WriteLn "Application Name: " & l_objApplication.Name,-1,2
        
        Set l_objProcessesColl = l_objApplication.Processes 
        
        For j = 0 To l_objProcessesColl.GetCount - 1
        
            Set l_objProcess = l_objProcessesColl.GetAt(j)
            
            l_objLog.WriteLn "Process Name: " & l_objProcess.Name,-1,2
        
        Next
        
    Next
    
    Set GetUserActvityApplications = l_objAppManager
    
End Function

--></Script>
    </xTest>
</document>
