Инвентаризация и рационализация: управляем программными активами крупных компаний. Опыт использования Microsoft Assessment and Planning Toolkit

    Недавно на Хабре появилась обзорная статья об инструментах Microsoft MAPT. Программа предназначена для проведения инвентаризации ИТ-инфраструктуры, помощи в миграции машин на новую версию ОС, оценки загруженности серверов, консолидации их на платформе Hyper-V и т.п. Мы решили рассказать о реальном опыте использования этого инструмента для решения настоящих бизнес-задач.

    Задача, которая стояла перед нашей компанией, состояла в проведении точной и аккуратной инвентаризации всего ПО на рабочих станциях пользователей с последующей его рационализацией. Последняя основывается на создании так называемого MAL, или списка стандартного ПО, которое будет разрешено для использования в компании. Основная идея – управлять ПО, а именно — сократить количество ПО, проведя стандартизацию по версиям, редакциям и языкам там, где это возможно, а также учесть функционал приложений и некоторые вопросы лицензирования. Сокращая количество разрешённого ПО, мы не только экономим на лицензиях, но и уменьшаем стоимость поддержки пользовательских приложений.

    Основным преимуществом MAPT перед другими средствами инвентаризации является бесплатность решения, относительная простота использования, а также архитектура решения без использования программ-агентов, устанавливаемых на клиентских рабочих станциях.

    Именно эти преимущества и склонили чашу весов в пользу инструментов MAPT при выборе технического средства решения поставленной задачи. В статье мы расскажем, какие решения при работе с MAPT предлагает и реализует наша компания в рамках программы по комплексной экспертизе компании. Ее цель — оценка затрат на преобразование, стандартизацию и оптимизацию ИТ-процессов на географически распределённых объектах Заказчика и последующий аутсорсинг определённых процессов.

    Разумеется, MAPT, являясь бесплатным решением, не лишён и серьёзных недостатков. Среди них: ограниченность собираемых инвентаризационных данных, отчётов, готовых «из коробки», возможности легко настраивать параметры инвентаризации и отчётности, используя GUI-интерфейс. Также серьёзным ограничением является возможность MAPT обновлять данные о ПО и конфигурации тех рабочих станций и серверов, которые уже были однажды инвентаризированы.

    Поэтому мы расскажем о том, что конкретно мы предлагаем, чтобы справиться с некоторыми из упомянутых проблем. В рамках публикации будут рассматриваться только вопросы инвентаризации рабочих мест пользователей MAPT, однако, возможно и проведение инвентаризации серверов Windows/Unix и SQL.

    Вводная информация:

    Заказчик – глобальная производственная компания.

    В поддержке ICL Services находятся:
    1. основные компоненты серверной инфраструктуры ЦОД;
    2. офисные рабочие места в 11 локациях 9 стран Европы;
    3. инфраструктура рабочих мест пользователей стандартизирована;
    4. используется только стандартизированное ПО;
    5. внедрены все основные ITSM процессы.

    В производственных же локациях ИТ-инфраструктура уникальна, слабо интегрирована с процессами в офисных центрах, и ПО не стандартизировано, и, как следствие, такая модель недостаточно эффективна с точки зрения экономичности, управляемости и стоимости поддержки. Именно эти локации нам и требовалось подготовить к будущей стандартизации на основе централизованных стандартов и процессов.

    Исходные данные:
    • 11 производственных объектов
    • Более 2000 пользователей
    • Не стандартизированное ПО
    • Отсутствие точных данных об установленном ПО
    • Отсутствие процессов автоматизации установки ПО
    • Отсутствие точных данных о количестве пользователей
    • Отсутствие достоверных данных о точном количестве рабочих станций и серверов
    • Сжатые сроки

    Задачи:
    1. в короткие сроки провести инвентаризацию ПО с целью последующей оценки затрат на преобразование;
    2. получить точные данные о количестве рабочих станций и пользователей;
    3. получить достоверные и точные данные об используемом ПО;
    4. рационализировать инвентаризованное ПО с целью получения, так называемого, MAL (Master Application List, список стандартных приложений);
    5. оптимизировать MAL с учётом данных о приложениях, которые мы уже имеем в своём портфолио.

    В данной статье затронем первые 4 пункта, так как для выполнения этих задач использовался MAPT. Ввиду ограниченности времени на реализацию задачи и сил локальных ИТ-специалистов в локациях, а также ожидаемых больших объёмов данных, решение должно было быть простым, устанавливаться быстро и минимально взаимодействовать с пользователем. Выбор пал на MAPT, как на бесплатное решение, не использующее клиентское ПО – агенты.

    Однако помимо преимуществ, решение MAPT нуждалось в доработке для достижения поставленных целей.

    Например, отчёты, создаваемые MAPT, были далеки «от идеала», а именно, не содержали информации о ПО, установленном на каждой конкретной машине и обо всех пользователях конкретной рабочей станции. Нами было принято решение доработать функционал MAPT, благо что все возможности для этого имеются в распоряжении без необходимости сложного программирования аддонов, плагинов или отдельных утилит. Оказалось, что программу можно «доделать», добавив свои xml шаблоны и хранимые процедуры в БД SQL. Потратив некоторое время на то, чтобы разобраться с внутренней архитектурой MAPT, мы добавили в утилиту инвентаризацию папок в корне диска C:, папок в %Program Files%, ярлыков приложений, получили список пользователей, когда-либо производивших вход на рабочую станцию, список аддонов Microsoft Office и Internet Explorer и ряд других вспомогательных данных, облегчивших нам сбор и анализ данных. Внесённые изменения позволили сделать данные об установленном ПО более точными, достоверными и полными.

    Мы рассмотрим работу утилиты с Windows машинами на конкретном сценарии, покажем как разобраться, что на самом деле собирается, где найти логи и файлы конфигурации. Рассчитываем, что читатель, как минимум, слышал о WMI и имеет базовые знания о MS SQL. Многое из описанного ниже не содержится в документации и является результатом нашего анализа принципов работы MAPT.

    К сожалению, через GUI интерфейс не получится конкретно указать те данные, которые необходимо собрать с машин. Но оказалось, что MAPT очень гибкий инструмент, если залезть немного глубже интерфейсной части. Утилита умеет выполнять на удалённых машинах WMI запросы, PowerShell скрипты, передавать команды по SSH и получать результаты выполнения SQL запросов для Oracle и MS SQL СУБД. Практически вся логика работы описывается в xml файлах. В них указано, что нужно делать с машинами в том или ином сценарии инвентаризации. При желании можно создать свои собственные сценарии или адаптировать их под ваши нужды. Это позволит, например, сократить объем, передаваемого по сети трафика, или добавить то, чего не достаёт из коробки.

    Установка

    Установить MAPT можно как на клиентскую (Windows 7 SP1, Windows 8), так и на серверную ОС (Windows Server 2008 R2, Windows Server 2012). Программа по умолчанию устанавливает SQL Server 2012 Express LocalDB. Но нам для работы с базой данных напрямую понадобится SMSS (SQL Server Management Studio), поэтому перед установкой самого MAP Toolkit рекомендую поставить SQL Express 2012 With Tools (SQLEXPRWT_x64_ENU.exe). Обратите внимание, что SQL нужно ставить до установки MAP Toolkit на ту же машину, а SQL instance необходимо назвать MAPS. Только в этом случае установщик MAPT найдет SQL Instance, сконфигурирует его и не будет ставить SQL Server 2012 Express LocalDB. Подробную информацию о требованиях к системе для установки MAPT можно найти на странице загрузки.

    MAPT проводит манипуляции с машинами с использованием удаленного доступа по сети. Установка агентов на машины не требуется, но нужно настроить межсетевые экраны и учесть нагрузку на сеть во время инвентаризации. Если верить Microsoft, то на каждую машину будет генерироваться до 1 МБ трафика. В случае малой пропускной способности сети попробуйте уменьшить количество машин, которые одновременно проходят инвентаризацию, отредактировав файл MapToolkit.exe.config, как указано здесь.

    Перед тем, как проводить инвентаризацию на живых машинах, можно попробовать MAPT с демо БД, которая находится на странице загрузки MAPT (MAPT Training Kit). Там же лежат примеры Excel отчетов (MAP_sample_Documents).

    MAP Toolkit устанавливается в папку “C:\Program Files\Microsoft Assessment and Planning Toolkit”

    image

    В папке Metadata содержатся xml шаблоны, отвечающие за логику работы инвентаризации. При старте MAPT автоматически подхватывает все xml файлы из этой папки и пытается их обработать. На них мы и будем ссылать в дальнейшем.

    Запустим программу, создадим по запросу чистую БД и нажмем на кнопку «Perform An Inventory», MAPT предложит выбрать один из сценариев инвентаризации:

    image

    Доступные из коробки сценарии перечислены в файле DisplayedScenarios.xml:

    • Windows Computers (WMI)
    • Linux/UNIX computers (SSH)
    • VMware computers (VMWare)
    • Active Devices and Users (WMI, AD)
    • Exchange Server (WMI, AD, PowerShell)
    • Forefront Endpoint Protection Server (WMI, PowerShell)
    • Lync Server (PowerShell, SQL Windows, SQL Native, WMI)
    • SWID tagging (WMI, PowerShell)
    • SQL Server Inventory (aka SQL Light) (WMI)
    • SQL Server with Database Details (WMI, SQL Windows, SQL Native)
    • Windows Azure Platform Migration (WMI, SQL Windows, SQL Native)
    • Oracle (WMI, SSH, Oracle)
    • Windows OEM Licensing compliance (WMI, PowerShell)
    • Client Access Tracking for Windows Server 2012 (WMI)
    • Client Access Tracking for SQL Server 2012 (WMI)
    • Client Access Tracking for Configuration Manager (WMI)
    • Client Access Tracking for SharePoint Server 2013 (WMI)
    • Client Access Tracking for Remote Desktop Services (WMI, PowerShell)

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

    Сценарий Windows Computers
    Рассмотрим работу программы на примере сценария Windows Computers.

    DisplayedScenarios.xml из папке Metadata указывает, что сценарий Windows Computers зависит от DataGroup AllWMI:

    <Scenarios>
        <!-- Windows Computers (WMI)-->
        <Scenario Name="Windows computers" DisplayOrder="0">
          <Description Name="Description_1">
            InventoryAssessmentWizard.TechnologyPickerPage.DescriptionLabel.WindowsComputers.Text
          </Description>
          <DependsOn>
            <DataGroup Name="AllWMI" />
          </DependsOn>
        </Scenario>
    

    DataGroups и их зависимости описаны в файле DataGroups.xml:
    <DataGroup Name="AllWMI" >
          <DependsOn>
            <DataGroup Name="Base" />
            <DataGroup Name="Client" />
            <DataGroup Name="Server" />
            <DataGroup Name="BrowserTier1" />
            <DataGroup Name="BrowserTier2" />
            <DataGroup Name="BrowserTier3" />
            <DataGroup Name="BrowserTier4" />
            <DataGroup Name="FailoverCluster" />
            <DataGroup Name="GuestHostHyperVTier0" />
            <DataGroup Name="IISTier0" />
            <DataGroup Name="IISTier1" />
            <DataGroup Name="IISTier2" />
            <DataGroup Name="SCCMServerTier1" />
            <DataGroup Name="SCCMServerTier2" />        
            <DataGroup Name="SQLTier0" />
            <DataGroup Name="WindowsServicesFiles" />
            <DataGroup Name="64BitWindows" />
            <DataGroup Name="LyncTier1" />
            <DataGroup Name="SharePoint" />
          </DependsOn>
        </DataGroup>
    


    У групп, от которых зависит AllWMI, тоже есть свои зависимости. На основе этого составляется порядок, в котором должна проходить инвентаризация на каждой машине.

    На имя DataGroup, в свою очередь, ссылаются классы инвентаризации, которые описаны в файлах DataGroup*.xml.
    Посмотрим, например, в файл DataGroupBase.xml:
    <WmiClass Namespace="root\CIMV2" ClassName="Win32_PageFileSetting" Guid="DAD0DF3F-44A5-4184-9E2B-225EF2B9176B">
        <DataGroup Name="Base" />
        <Query>SELECT * FROM Win32_PageFileSetting</Query>
        <StoredProcedure Name="[Win_Inventory].[InsupdDevicesWin32_PageFileSetting]" />
        <Attribute Source="MaximumSize" Destination="@maximum_size" />
      </WmiClass>
    


    На каждой из машин, которые мы инвентаризируем, будет выполнен WMI запрос «SELECT * FROM Win32_PageFileSetting». После выполнения WMI запроса, будет вызвана хранимая процедура Win_Inventory.InsupdDevicesWin32_PageFileSetting из БД. В качестве параметра она получит значение MaximumSize и добавит в свою очередь записи в нужные таблицы БД.

    Этот запрос будет выполняться для каждого сценария, у которого в зависимостях находится GroupName с именем Base.

    Теперь запустим SQL Server Management Studio и подключимся к локальному инстансу MAPS.

    Найдем хранимую процедуру Win_Inventory.InsupdDevicesWin32_PageFileSetting и посмотрим ее содержимое:
    ALTER PROCEDURE [Win_Inventory].[InsupdDevicesWin32_PageFileSetting]
        (
            ----------These Are The Required Parameters-------------
            @collector_id                    int,
            @dns_host_name                   nvarchar(256),
            @device_number                   uniqueidentifier,
            --------------------------------------------------------
            @maximum_size                    bigint = NULL
        )
    
        AS
        SET NOCOUNT ON
        DECLARE @err_code INT
    
        /*
        *********************************************************************
        *    Update An Existing Row In [dbo].[devices] Table
        *********************************************************************
        */
    
        BEGIN
            UPDATE [Core_Inventory].[Devices]
            SET
                [MaximumSize] = COALESCE(@maximum_size, [MaximumSize]),
                [UpdateCollectorId] = @collector_id,
                [UpdateDatetime] = GETUTCDATE(),
                [WmiDatetime] = GETUTCDATE()
            WHERE [DeviceNumber] = @device_number
    
            SET @err_code = @@ERROR
    
            END
    
        RETURN @err_code
    


    Параметры collector_id, dns_host_name, device_number передаются во все хранимые процедуры во время инвентаризации. Значение параметра maximum_size получается с удаленной машины описанным выше WMI запросом. Данная процедура обновляет записи в таблице Core_Inventory.Devices, которая содержит все устройства, найденные при инвентаризации. Каждое устройство в БД идентифицируется по полю DeviceNumber. Это поле является первичным ключом в таблице Core_Inventory.Devices.

    Стоит помнить, что MAPT не инвентаризирует одно и то же устройство дважды. Если данные о машине уже попали в БД, то в следующий раз MAPT просто проигнорирует ее. Поэтому, строго говоря, MAPT будет полезен только в случаях необходимости именно разовой инвентаризации, а для процессов управления программными активами лучше использовать более подходящие для этого средства. Подобная логика работы позволяет запускать MAPT многократно на одну и ту же коллекцию машин и собирать информацию только о новых доступных в сети машинах. Но для того, чтобы собрать свежие данные, придется либо создать новую БД, либо удалить запись из таблицы Core_Inventory.Devices. Каскадное удаление уничтожит записи об устройстве в других таблицах. Конечно же, следует делать копии перед внесением в БД изменений вручную.

    Подобным образом можно проследить логику работы всего сценария и понять попадают ли в инвентаризацию те данные, которые вам могут понадобиться.

    Классы инвентаризации

    Выше мы привели пример только для одного из классов инвентаризации — WmiClass. Все доступные классы можно найти в xml-схеме, которая «спрятана» внутри файла «c:\Program Files\Microsoft Assessment and Planning Toolkit\bin\Microsoft.AssessmentPlatform.InventoryCommon.dll». Откройте файл текстовым редактором, найдите строку «xs:schema» и сохраните найденный текстовый кусок в новый файл с расширением xsd или xml.

    Доступны следующие классы:

    ADClass — позволяет проводить инвентаризацию объектов в Active Directory с помощью LDAP запросов.

    Пример из DataGroupActiveDevicesTier1.xml:
    <ADClass ClassName="ADUserAccounts"
               Guid="94574F36-8024-4377-A72D-43FFB7ED60B2"
               Namespace="LDAP://$domainDN">
        <DataGroup Name="ActiveDevicesTier1"/>
        <!--
          == The Exchange usage tracking scenario already set up the necessary structure for
          == identifying the device used as the "victim" for collecting the user mailbox information.
          == We're reusing this logic and using the same machine to collect general user information
          == for the Active Devices scenario.
          -->
        <CollectIf Expr="ShouldCollectExchangeADMailboxItems"/>
        <PreprocessingQuery SubstitutionTargets="Namespace AttributeDefault">
          <Variable Name="domainDN"/>
          <Variable Name="NetBIOSDomain"/>
          <Sql>
            SELECT eafd.[NCName] AS [domainDN],
                   eafd.[NETBIOsName] AS [NetBIOSDomain]
            FROM [UT_Exchange_Inventory].[AdForestDomains] eafd
            WHERE eafd.[DeviceNumber] = @device_number
          </Sql>
        </PreprocessingQuery>
        <Query>
          (objectClass=user)
        </Query>
        <StoredProcedure Name="[ZZGenerated].[InsupdAdDiscoveredUsers]" Table="[UT_ActiveDaU_Inventory].[AdDiscoveredUsers]"/>
        <Attribute Source="objectSid" Destination="@ObjectSid" DestinationType="Sid" IsKeyField="true"/>
        <Attribute Source="accountExpires" Destination="@AccountExpires" SourceType="DateTicksSince1601" DestinationType="DateTime"/>
        <Attribute Source="cn" Destination="@Cn" />
        <Attribute Source="displayName" Destination="@DisplayName" />
        <Attribute Source="distinguishedName" Destination="@DistinguishedName" />
        <Attribute Source="givenName" Destination="@GivenName" />
        <Attribute Source="lastLogon" Destination="@LastLogon" SourceType="DateTicksSince1601" DestinationType="DateTime" />
        <Attribute Source="lastLogonTimestamp" Destination="@LastLogonTimestamp" SourceType="DateTicksSince1601" DestinationType="DateTime" />
        <Attribute Source="logonCount" Destination="@LogonCount" />
        <Attribute Source="middleName" Destination="@MiddleName" />
        <Attribute Source="name" Destination="@Name" />
        <Attribute Default="$NetBIOSDomain" Destination="@NetBIOsDomain"/>
        <Attribute Source="objectGuid" Destination="@ObjectGuid" DestinationType="Guid" />
        <Attribute Source="primaryGroupID" Destination="@PrimaryGroupID" />
        <Attribute Source="pwdLastSet" Destination="@PwdLastSet" SourceType="DateTicksSince1601" DestinationType="DateTime" />
        <Attribute Source="sAMAccountName" Destination="@SAMAccountName" />
        <Attribute Source="sAMAccountType" Destination="@SAMAccountType" />
        <Attribute Source="sn" Destination="@Sn" />
        <Attribute Source="userAccountControl" Destination="@UserAccountControl" />
        <Attribute Source="whenChanged" Destination="@WhenChanged" SourceType="DateTicksSince1601" DestinationType="DateTime" />
        <Attribute Source="whenCreated" Destination="@WhenCreated" SourceType="DateTicksSince1601" DestinationType="DateTime" />
      </ADClass>
    


    В примере выше выполняется LDAP запрос (objectClass=user) и часть из полученных атрибутов сохраняется в БД. Обратите внимание, что перед LDAP запросом выполняется SQL запрос (PreprocessingQuery), результаты которого используются в переменных $domainDN, $NetBIOSDomain.

    PerfmonClass – позволяет использовать счетчики производительности.

    RegistryClass – позволяет получать значения из реестра. На удаленной машине должен быть запущен сервис Remote Registry.

    Пример из DataGroup64BitWindows.xml:

    <RegistryClass Namespace="HKEY_LOCAL_MACHINE"
                   ClassName="Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
                   Guid="B4FAED2A-1402-4209-8A77-FF52417E0E0F">
        <DataGroup Name="64BitWindows" />
        <StoredProcedure Name="[ZZGenerated].[InsupdProductsUninstall]" />
        <Attribute Source="$0" Destination="@ProductCode" IsKeyField="true" />
        <Attribute Source="DisplayName" SourceType="String" />
        <Attribute Source="DisplayVersion" SourceType="String" />
        <Attribute Source="InstallDate" SourceType="String" />
        <Attribute Source="InstallLocation" SourceType="String" />
        <Attribute Source="ParentDisplayName" SourceType="String" />
        <Attribute Source="ParentKeyName" SourceType="String" />
        <Attribute Source="Publisher" SourceType="String" />
        <Attribute Source="SystemComponent" SourceType="DWord String" DestinationType="long" />
        <Attribute Source="VersionMajor" SourceType="DWord String" DestinationType="long" />
        <Attribute Source="VersionMinor" SourceType="DWord String" DestinationType="long" />
      </RegistryClass>
    

    Этот класс будет вызван для каждого из подключей первого уровня из ветки HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall (благодаря использованию символа * в атрибуте ClassName). При этом значение переменной $0 будет заменено на имя ключа во время вызова хранимой процедуры.

    SchemaGenClass – источник, из которого класс получает данные, не понятен. Вызов этого класса не привязан к DataGroup.
    SqlClass – позволяет выполнять SQL запросы.

    SshClass – позволяет выполнять команды с использованием протокола SSH. Используется для инвентаризации Linux машин.

    VmwareClass – позволяет собирать информацию о хостах VMWare ESX и размещенных на них машинах с помощью VMWare API.

    WmiClass – позволяет выполнять WMI запросы.

    Пример из DataGroupBase.xml:
    <WmiClass Namespace="root\CIMV2"
              ClassName="ComputerSystemProduct"
              Guid="110F25FB-ECF2-4397-BB2D-0B3D493167B0">
        <DataGroup Name="Base" />
        <Query>SELECT * FROM Win32_ComputerSystemProduct</Query>
        <StoredProcedure Name="[ZZGenerated].[InsupdComputerSystemProduct]" Table="[Win_Inventory].[ComputerSystemProduct]" />
        <Attribute Source="Caption"/>
        <Attribute Source="Description"/>
        <Attribute Source="IdentifyingNumber"/>
        <Attribute Source="Name"/>
        <Attribute Source="SKUNumber"/>
        <Attribute Source="UUID" Destination="@UUiD"/>
        <Attribute Source="Vendor"/>
        <Attribute Source="Version"/>
      </WmiClass>
    

    PowerShellClass – позволяет выполнять PowerShell скрипты.

    Отчёты

    На выходе MAP Toolkit предоставляет отчёт в формате xlsx для Microsoft Office Excel. В папке DocumentTemplate лежит Template.xlsx файл, который используется для генерации отчетов. Если требуется изменить оформление, можно копию этого файла с новым именем в той же папке и отредактировать его с помощью MS Excel. Сами правила для генерации содержимого отчетов можно найти в xml темплейтах в папке XMLLibrary. Например, при создании отчета «Windows 7 Readiness» используется файл Windows7Assessment.xml.

    <Worksheet Name="DiscoveredApplications" Template="Default">
        <Constant Name="Title" Type="String">Discovered Applications</Constant>
        <Constant Name="Description" Type="String">This worksheet describes up to 60,000 applications discovered through the inventory process on client machines and provides a count of the number of times a particular version of the software was found. The data in this sheet is based solely upon computers where a successful inventory was performed.</Constant>
        <Table Name="Table" RetainHeader="false">
          <Sql SkipFirstRow="false">EXEC [Win_Reporting].[GetDiscoveredApplications] 'en', 60000</Sql>
        </Table>
      </Worksheet>
    


    В этом файле указано, какой xlsx темплейт использовать для генерации, имя хранимой процедуры, которая должна вернуть данные для отчета и т.д.

    В самой хранимой процедуре выполняется SELECT, а имена возвращаемых полей переносятся в имена столбцов в Excel отчете.

    SQL:
    CREATE PROCEDURE [Win_Reporting].[GetDiscoveredApplications]
    (
        @culture_info	nvarchar(25),
        @max_rows_to_return bigint = 0
    )
    AS
    BEGIN
        SET NOCOUNT ON
    
    SET ROWCOUNT @max_rows_to_return -- default value of 0 will
                                     -- return all rows.
        
    
                   SELECT wis.[name] AS 'Application', 
                           wis.[version] AS 'Software Version',
                           COUNT(wis.[name]) AS 'Number of Installed Copies'
                     FROM [Win_Assessment].[WindowsInstalledSoftwareView] wis
                        INNER JOIN [Win_Assessment].[HardwareAssessmentClientsIncludeVmView] haciv   -- only client devices applications are returned
                             ON (wis.[DeviceNumber] = haciv.[DeviceNumber])
                    WHERE wis.[InstallState] = 5  -- WMI App Installed
                      AND wis.[name] IS NOT NULL
                 GROUP BY [name], [version]
                 ORDER BY COUNT([name]) DESC 
                   
    SET ROWCOUNT 0    -- reset ROWCOUNT to not affect other queries
    
    END
    


    На скриншоте представлен фрагмент отчета MS Excel, получаемый в результате описанных действий

    image

    Логирование

    Программа сохраняет логи работы в профиле пользователя, под которым она запускается: %LOCALAPPDATA%\Microsoft\MAP\MapToolkit.log. Если нужно собрать больше информации, то можно отредактировать файл Logging.cfg, раскомментировав нужные строки. В этой же папке лежит файл AppConfigInfo.xml, в котором можно выставить максимальное количество объектов инвентаризации и интервал времени для измерения производительности. По умолчанию, для сбора информации со счётчиков производительности на удалённых машинах, MAPT отправляет запросы на каждую машину раз в 5 минут.

    Обработка собранных данных

    Создав хранимые процедуры на создание новых таблиц и заполнив их требуемыми данными, а также сформировав с помощью хранимых процедур и настроек XML файлов нужные нам отчеты, мы можем, например, задать правила нормализации ПО, то есть обработать «сырые» данные из реестра или файловой системы об установленном ПО таким образом, чтобы в отчетах фигурировали понятные и соответствующие реальности записи о ПО (имя и версия приложения), которые, в частности, было бы удобно использовать для управления лицензиями. Например, мы можем сгруппировать записи о ПО, представляющие единое семейство в одну запись, заменить запись о ПО для удобства дальнейшего анализа и т.д.

    Примерно такой функционал реализуется в различных коммерческих решениях по управлению программными активами. Обычно он продаётся как отдельный модуль – база Software Recognition, содержащая соответствия сырых данных инвентаризации нормализованным записям ПО. Разумеется, коммерческие решения обязаны регулярно обновлять такие базы.

    В нашем же случае было необходимо, как уже говорилось, создать MAL (Master Application List). В такой работе невозможно осуществить 100% автоматизацию каким бы то ни было средством, так как она опирается на опыт и знания в сфере ПО для рабочих станций, специфику ИТ-инфраструктуры каждой конкретной локации Заказчика, вопросов лицензирования и т.д.

    Вопрос создания MAL, без преувеличения, является одним из ключевых в управлении программными активами, и зачастую незаслуженно не рассматривается в контексте процессов SAM. (Узнать о других компонентах успешного управления программными активами можно на странице нашей компании).

    Стоит отметить, что эту сложную задачу можно немного упростить, предварительно создав таблицу «рекомендаций» для связей типа «Нерационализированное приложение и версия – Рационализированное приложение и версия». Например, мы можем рационализировать все архиваторы к 7-Zip 9.20.

    image

    Создав необходимые процедуры и настроив MAPT для реализации поставленных целей, нашей компании удалось существенно сократить время на их выполнение и рационализировать более чем 8500 уникальных записей ПО (имя-версия) к 300 приложениям, что означает оптимизацию стоимости поддержки парка ПО Заказчика в несколько раз в локациях, где осуществлялся данный проект.

    Мы рассмотрели лишь некоторые практические преимущества, которые может предоставить нам ручная кастомизация MAPT. Для реализации конкретных задач остается лишь правильно использовать инструментарий WMI, Active Directory, а также других классов, описанных в этой статье, таких как VmWare, SQL. И, конечно, в распоряжении администратора все возможности языка Powershell, которые трудно переоценить. То есть – простор для творчества однозначно есть. Надеемся, что наш опыт интересен для вашего бизнеса и мы сможем быть полезны в вопросах адаптации MAPT к выполнению конкретных задач управления программными активами.

    Авторы ShamRous и ignatyev

    Only registered users can participate in poll. Log in, please.

    Как в Вашей компании управляют программными активами?

    ICL Services
    100.40
    Цифровые технологии для бизнеса
    Share post

    Comments 0

    Only users with full accounts can post comments. Log in, please.