Video Screencast Help
Symantec to Separate Into Two Focused, Industry-Leading Technology Companies. Learn more.

Coleta Customizada de Seriais de Software

Created: 23 Dec 2013 • Updated: 25 Dec 2013 | 10 comments
Arthur Oreana's picture
+4 4 Votes
Login to vote

Por muitas vezes em determinados projetos nos deparamos com a necessidade de customizar algo para atender um requisito exigido pelo cliente. Sabemos também da flexibilidade da plataforma Altiris, que nos permite construir basicamente qualquer tipo de customização. Graças a sua arquitetura e a maneira como os componentes estão dispostos, conseguimos agradar o cliente e disponibilizar a funcionalidade necessária.

Claro que cada customização tem a sua complexidade; por isso devemos avaliar no momento de uma pré-venda se a opção de criar algo para realizar uma determinada tarefa realmente é viável ou não.

Uma das funcionalidades disponíveis na plataforma Altiris é a opção de criarmos estruturas de dados que armazenarão informações diversas. O nome dessa estrutura é Data Class.

Nesse artigo vamos criar um data class customizado para armazenar os seriais de determinados softwares. Depois de seguir os passos aqui descritos e conseguir implantar essa customização em seu ambiente de testes, fique à vontade para alterar os scripts utilizados e assim ser capaz de coletar informações de outros softwares.

A criação de uma classe de dados customizada – ou Custom Data Class – é bem simples e nos permite armazenar e consultar os dados quando for necessário. No decorrer do artigo explicarei como criar uma estrutura e como consultar as informações dela.

 

Primeiro Passo: script de coleta de seriais

A função do script abaixo é verificar no registro do Windows se o serial de um determinado software está presente. Dependendo da versão do Office, Visio ou Project instalado na máquina-alvo o script executa funções específicas e armazena as informações em variáveis que posteriormente são enviadas para o Notification Server.

Por hora vale a pena percorrer o script, entender seu funcionamento e acompanhar as chamadas da função MsgBox para exibir os valores capturados durante a execução. Durante o artigo acrescentaremos a chamada da função responsável por enviar os dados para o Notification Server.

Dim nse

Set nse = WScript.CreateObject ("Altiris.AeXNSEvent")

nse.To = "{1592B913-72F3-4C36-91D2-D4EDA21D2F96}"

nse.Priority = 1


On Error Resume Next


Const HKEY_LOCAL_MACHINE = &H80000002


Dim aOffID(5,1)


aOffID(0,0) = "97"

aOffID(0,1) = "8.0"

aOffID(1,0) = "2000"

aOffID(1,1) = "9.0"

aOffID(2,0) = "XP"

aOffID(2,1) = "10.0"

aOffID(3,0) = "2003"

aOffID(3,1) = "11.0"

aOffID(4,0) = "2007"

aOffID(4,1) = "12.0"

aOffID(5,0) = "2010"

aOffID(5,1) = "14.0"


Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")

oCtx.Add "__ProviderArchitecture", 64


Set oLocator = CreateObject("Wbemscripting.SWbemLocator")

Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv")


osType = 32

oReg.GetStringValue HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PROCESSOR_ARCHITECTURE", osProc


If osProc = "x86" Then osType = 32

If osProc = "AMD64" Then osType = 64


For a = LBound(aOffID, 1) To UBound(aOffID, 1)

  If (aOffID(a,0) = "97") Then searchKey97 "SOFTWARE\Microsoft\Office\" & aOffID(a,1), true

  If (aOffID(a,0) = "2000") Then searchKey2000 "SOFTWARE\Microsoft\Office\" & aOffID(a,1) & "\Registration\ProductID", true


  searchKey "SOFTWARE\Microsoft\Office\" & aOffID(a,1) & "\Registration", true

  searchKey "SOFTWARE\Wow6432Node\Microsoft\Office\" & aOffID(a,1) & "\Registration", false

Next


Sub searchKey97(regKey, likeOS)

   oReg.GetStringValue HKEY_LOCAL_MACHINE, regKey, "BinDirPath", oDir97

  

   If IsNull (oDir97) Then Exit Sub


   oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Microsoft Reference\BookshelfF\96L", "PID", oProdID

   oKey = oProdID


   oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office8.0", "DisplayName", oEdit

   oProd = oEdit


   If Mid (oProdID,7,3) = "OEM" Then oOEM = " OEM"

  

   oProd = oProd & oOEM

   oBit = osType


   If Not likeOS Then oBit = 32


   oNote = ""


   writeXML oEdit,oProd,oProdID,oBit,oKey,oNote

End Sub


Sub searchKey2000(regKey, likeOS)

   oReg.GetStringValue HKEY_LOCAL_MACHINE, regKey, "", oProdID


   If IsNull (oProdID) Then Exit Sub


   oKey = oProdID

  

   oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0000040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Office 2000 Premium Edition CD1


   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0001040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Office 2000 Professional Edition

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0002040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Office 2000 Standard Edition

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0003040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Office 2000 Small Business Edition

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0004040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Office 2000 Premium CD2

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0010040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Access 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0011040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Excel 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0012040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft FrontPage 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0013040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft PowerPoint 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0014040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Publisher 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0016040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Outlook 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0017040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Word 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0018040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Microsoft Access 2000

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{001A040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Publisher Standalone OEM

   If IsNull (oEdit) Then oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{004F040C-78E1-11D2-B60F-006097C998E7}", "DisplayName", oEdit ''Access 2000 SR-1 Run-Time

   If Not IsNull (oEdit) Then oProd = oEdit


   If Mid (oProdID,7,3) = "OEM" Then oOEM = " OEM"


   oProd = oProd & oOEM

   oBit = osType


   If Not likeOS Then oBit = 32

  

   oNote = ""


   writeXML oEdit,oProd,oProdID,oBit,oKey,oNote

End Sub


Sub searchKey(regKey, likeOS)

   oReg.GetBinaryValue HKEY_LOCAL_MACHINE, regKey, "DigitalProductID", aDPIDBytes


   If IsNull(aDPIDBytes) Then

      oReg.EnumKey HKEY_LOCAL_MACHINE, regKey, aGUIDKeys


      If Not IsNull(aGUIDKeys) Then

         For Each GUIDKey In aGUIDKeys

            searchKey regKey & "\" & GUIDKey, likeOS

         Next

      End If


   Else

      oKey = decodeKey(aDPIDBytes, (a>4))

      oReg.GetStringValue HKEY_LOCAL_MACHINE, regKey, "ProductName", oEdit

      oReg.GetStringValue HKEY_LOCAL_MACHINE, regKey, "ProductName", oProd


      If likeOS Then

         oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Office\" & aOffID(a,1) & "\Common\ProductVersion", "LastProduct", oVer

     

      Else

         oReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Wow6432Node\Microsoft\Office\" & aOffID(a,1) & "\Common\ProductVersion", "LastProduct", oVer

      End If


      If (aOffID(a,0) = "XP") Then

         hProd = Mid ((Right(regKey,38)),4,2)


         Select Case hProd

            Case "11" oProductCode = "Microsoft Office XP Professional"

            Case "12" oProductCode = "Microsoft Office XP Standard"

            Case "13" oProductCode = "Microsoft Office XP Small Business"

            Case "14" oProductCode = "Microsoft Office XP Web Server"

            Case "15" oProductCode = "Microsoft Access 2002"

            Case "16" oProductCode = "Microsoft Excel 2002"

            Case "17" oProductCode = "Microsoft FrontPage 2002"

            Case "18" oProductCode = "Microsoft PowerPoint 2002"

            Case "19" oProductCode = "Microsoft Publisher 2002"

            Case "1A" oProductCode = "Microsoft Outlook 2002"

            Case "1B" oProductCode = "Microsoft Word 2002"

            Case "1C" oProductCode = "Microsoft Access 2002 Runtime"

            Case "27" oProductCode = "Microsoft Project 2002"

            Case "28" oProductCode = "Microsoft Office XP Professional with FrontPage"

            Case "31" oProductCode = "Microsoft Project 2002 Web Client"

            Case "32" oProductCode = "Microsoft Project 2002 Web Server"

            Case "3A" oProductCode = "Project 2002 Standard"

            Case "3B" oProductCode = "Project 2002 Professional"

            Case "51" oProductCode = "Microsoft Office Visio Professional 2002"

            Case "54" oProductCode = "Microsoft Office Visio Standard 2002"

         End Select

      End If


      If (aOffID(a,0) = "2003") Then

         hProd = Mid ((Right(regKey,38)),4,2)


         Select Case hProd

            Case "11" oProductCode = "Microsoft Office Professional Enterprise Edition 2003"

            Case "12" oProductCode = "Microsoft Office Standard Edition 2003"

            Case "13" oProductCode = "Microsoft Office Basic Edition 2003"

            Case "14" oProductCode = "Microsoft Windows SharePoint Services 2.0"

            Case "15" oProductCode = "Microsoft Office Access 2003"

            Case "16" oProductCode = "Microsoft Office Excel 2003"

            Case "17" oProductCode = "Microsoft Office FrontPage 2003"

            Case "18" oProductCode = "Microsoft Office PowerPoint 2003"

            Case "19" oProductCode = "Microsoft Office Publisher 2003"

            Case "1A" oProductCode = "Microsoft Office Outlook Professional 2003"

            Case "1B" oProductCode = "Microsoft Office Word 2003"

            Case "1C" oProductCode = "Microsoft Office Access 2003 Runtime"

            Case "1E" oProductCode = "Microsoft Office 2003 User Interface Pack"

            Case "1F" oProductCode = "Microsoft Office 2003 Proofing Tools"

            Case "23" oProductCode = "Microsoft Office 2003 Multilingual User Interface Pack"

            Case "24" oProductCode = "Microsoft Office 2003 Resource Kit"

            Case "26" oProductCode = "Microsoft Office XP Web Components"

            Case "2E" oProductCode = "Microsoft Office 2003 Research Service SDK"

            Case "44" oProductCode = "Microsoft Office InfoPath 2003"

            Case "83" oProductCode = "Microsoft Office 2003 HTML Viewer"

            Case "92" oProductCode = "Windows SharePoint Services 2.0 English Template Pack"

            Case "93" oProductCode = "Microsoft Office 2003 English Web Parts and Components"

            Case "A1" oProductCode = "Microsoft Office OneNote 2003"

            Case "A4" oProductCode = "Microsoft Office 2003 Web Components"

            Case "A5" oProductCode = "Microsoft SharePoint Migration Tool 2003"

            Case "AA" oProductCode = "Microsoft Office PowerPoint 2003 Presentation Broadcast"

            Case "AB" oProductCode = "Microsoft Office PowerPoint 2003 Template Pack 1"

            Case "AC" oProductCode = "Microsoft Office PowerPoint 2003 Template Pack 2"

            Case "AD" oProductCode = "Microsoft Office PowerPoint 2003 Template Pack 3"

            Case "AE" oProductCode = "Microsoft Organization Chart 2.0"

            Case "CA" oProductCode = "Microsoft Office Small Business Edition 2003"

            Case "D0" oProductCode = "Microsoft Office Access 2003 Developer Extensions"

            Case "DC" oProductCode = "Microsoft Office 2003 Smart Document SDK"

            Case "E0" oProductCode = "Microsoft Office Outlook Standard 2003"

            Case "E3" oProductCode = "Microsoft Office Professional Edition 2003 (with InfoPath 2003)"

            Case "FD" oProductCode = "Microsoft Office Outlook 2003 (distributed by MSN)"

            Case "FF" oProductCode = "Microsoft Office 2003 Edition Language Interface Pack"

            Case "F8" oProductCode = "Remove Hidden Data Tool"

            Case "3A" oProductCode = "Microsoft Office Project Standard 2003"

            Case "3B" oProductCode = "Microsoft Office Project Professional 2003"

            Case "32" oProductCode = "Microsoft Office Project Server 2003"

            Case "51" oProductCode = "Microsoft Office Visio Professional 2003"

            Case "52" oProductCode = "Microsoft Office Visio Viewer 2003"

            Case "53" oProductCode = "Microsoft Office Visio Standard 2003"

            Case "55" oProductCode = "Microsoft Office Visio for Enterprise Architects 2003"

            Case "5E" oProductCode = "Microsoft Office Visio 2003 Multilingual User Interface Pack"

         End Select

      End If


      If (aOffID(a,0) = "2007") Then

         hProd = Mid ((Right(regKey,38)),11,4)


         Select Case hProd

            Case "0011" oProductCode = "Microsoft Office Professional Plus 2007"

            Case "0012" oProductCode = "Microsoft Office Standard 2007"

            Case "0013" oProductCode = "Microsoft Office Basic 2007"

            Case "0014" oProductCode = "Microsoft Office Professional 2007"

            Case "0015" oProductCode = "Microsoft Office Access 2007"

            Case "0016" oProductCode = "Microsoft Office Excel 2007"

            Case "0017" oProductCode = "Microsoft Office SharePoint Designer 2007"

            Case "0018" oProductCode = "Microsoft Office PowerPoint 2007"

            Case "0019" oProductCode = "Microsoft Office Publisher 2007"

            Case "001A" oProductCode = "Microsoft Office Outlook 2007"

            Case "001B" oProductCode = "Microsoft Office Word 2007"

            Case "001C" oProductCode = "Microsoft Office Access Runtime 2007"

            Case "0020" oProductCode = "Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint 2007 File Formats"

            Case "0026" oProductCode = "Microsoft Expression Web"

            Case "002E" oProductCode = "Microsoft Office Ultimate 2007"

            Case "002F" oProductCode = "Microsoft Office Home and Student 2007"

            Case "0030" oProductCode = "Microsoft Office Enterprise 2007"

            Case "0031" oProductCode = "Microsoft Office Professional Hybrid 2007"

            Case "0033" oProductCode = "Microsoft Office Personal 2007"

            Case "0035" oProductCode = "Microsoft Office Professional Hybrid 2007"

            Case "003A" oProductCode = "Microsoft Office Project Standard 2007"

            Case "003B" oProductCode = "Microsoft Office Project Professional 2007"

            Case "0044" oProductCode = "Microsoft Office InfoPath 2007"

            Case "0051" oProductCode = "Microsoft Office Visio Professional 2007"

            Case "0052" oProductCode = "Microsoft Office Visio Viewer 2007"

            Case "0053" oProductCode = "Microsoft Office Visio Standard 2007"

            Case "00A1" oProductCode = "Microsoft Office OneNote 2007"

            Case "00A3" oProductCode = "Microsoft Office OneNote Home Student 2007"

            Case "00A7" oProductCode = "Calendar Printing Assistant for Microsoft Office Outlook 2007"

            Case "00A9" oProductCode = "Microsoft Office InterConnect 2007"

            Case "00AF" oProductCode = "Microsoft Office PowerPoint Viewer 2007 (English)"

            Case "00B0" oProductCode = "The Microsoft Save as PDF add-in"

            Case "00B1" oProductCode = "The Microsoft Save as XPS add-in"

            Case "00B2" oProductCode = "The Microsoft Save as PDF or XPS add-in"

            Case "00BA" oProductCode = "Microsoft Office Groove 2007"

            Case "00CA" oProductCode = "Microsoft Office Small Business 2007"

            Case "10D7" oProductCode = "Microsoft Office InfoPath Forms Services"

            Case "110D" oProductCode = "Microsoft Office SharePoint Server 2007"

            Case "1122" oProductCode = "Windows SharePoint Services Developer Resources 1.2"

            Case "0010" oProductCode = "SKU - Microsoft Software Update for Web Folders (English) 12"

         End Select


         oEdit = oProductCode

      End If


      If (aOffID(a,0) = "2010") Then

         For i = 280 to 312 Step 2

            If aDPIDBytes(i) <> 0 Then strEdition = strEdition & Chr(aDPIDBytes(i))

         Next


         Select Case strEdition

            Case "ProjectStdVL"    oEdit = "Microsoft Office Project Standard 2010 (VL)"

            Case "ProjectProVL"    oEdit = "Microsoft Office Project Professional2010 (VL)"

            Case "ProjectProMSDNR" oEdit = "Microsoft Project Professional 2010 (MSDN)"

            Case "HomeBusinessR"   oEdit = "Microsoft Office Home And Business 2010"

            Case "ProfessionalR"   oEdit = "Microsoft Office Professional 2010"

            Case "ProPlusR"        oEdit = "Microsoft Office Professional Plus 2010"

            Case "StandardR"       oEdit = "Microsoft Office Standard 2010"

            Case "StandardVL"      oEdit = "Microsoft Office Standard 2010 (VL)"

            Case "HomeStudentR"    oEdit = "Microsoft Office Home and Student 2010"

            Case "AccessRuntimeR"  oEdit = "Microsoft Office Access Runtime 2010"

            Case "VisioSIR"        oEdit = "Microsoft Office Visio Professional 2010"

            Case "SPDR"            oEdit = "Microsoft SharePoint Designer 2010"

            Case "ProjectProR"     oEdit = "Microsoft Project Professional 2010"

            Case "ProjectStdR"     oEdit = "Microsoft Project Standard 2010"

            Case "VisioSIVL"       oEdit = "Microsoft Visio 2010 Standard (VL)"

            Case "InfoPathR"       oEdit = "Microsoft Office InfoPath 2010"     

            Case Else              oEdit = "Microsoft Office Unknown Edition 2010: " & strEdition     

         End Select


         hProd = Mid ((Right(regkey,38)),11,4)


         Select Case hProd

            Case "0011" oProductCode = "Microsoft Office Professional Plus 2010"

            Case "0012" oProductCode = "Microsoft Office Standard 2010"

            Case "0013" oProductCode = "Microsoft Office Home and Business 2010"

            Case "0014" oProductCode = "Microsoft Office Professional 2010"

            Case "0015" oProductCode = "Microsoft Access 2010"

            Case "0016" oProductCode = "Microsoft Excel 2010"

            Case "0017" oProductCode = "Microsoft SharePoint Designer 2010"

            Case "0018" oProductCode = "Microsoft PowerPoint 2010"

            Case "0019" oProductCode = "Microsoft Publisher 2010"

            Case "001A" oProductCode = "Microsoft Outlook 2010"

            Case "001B" oProductCode = "Microsoft Word 2010"

            Case "001C" oProductCode = "Microsoft Access Runtime 2010"

            Case "001F" oProductCode = "Microsoft Office Proofing Tools Kit Compilation 2010"

            Case "002F" oProductCode = "Microsoft Office Home and Student 2010"

            Case "003A" oProductCode = "Microsoft Project Standard 2010"

            Case "003D" oProductCode = "Microsoft Office Single Image 2010"

            Case "003B" oProductCode = "Microsoft Project Professional 2010"

            Case "0044" oProductCode = "Microsoft InfoPath 2010"

            Case "0052" oProductCode = "Microsoft Visio Viewer 2010"

            Case "0057" oProductCode = "Microsoft Visio 2010"

            Case "007A" oProductCode = "Microsoft Outlook Connector"

            Case "008B" oProductCode = "Microsoft Office Small Business Basics 2010"

            Case "00A1" oProductCode = "Microsoft OneNote 2010"

            Case "00AF" oProductCode = "Microsoft PowerPoint Viewer 2010"

            Case "00BA" oProductCode = "Microsoft Office SharePoint Workspace 2010"

            Case "110D" oProductCode = "Microsoft Office SharePoint Server 2010"

            Case "110F" oProductCode = "Microsoft Project Server 2010"

         End Select

      End If


      If Not IsNull (oProductCode) Then oProd = oProductCode


      If Mid (oProdID,7,3) = "OEM" Then oOEM = " OEM"

     

      oProd = oProd & oOEM


      If IsNull (oEdit) Then oEdit = oProd

     

      oReg.GetStringValue HKEY_LOCAL_MACHINE, regKey, "ProductID", oProdID

      oBit = osType


      If Not likeOS Then oBit = 32

     

      oNote = ""


      writeNSE oEdit,oProd,oProdID,oBit,oKey,oNote

   End If

End Sub


Sub writeNSE (oEdit,oProd,oProdID,oBit,oKey,oNote)

   Dim objDCInstance

   Set objDCInstance = nse.AddDataClass ("{4e8d251e-cec2-4435-b245-e527f59a63df}")


   Dim objDataClass

   Set objDataClass = nse.AddDataBlock (objDCInstance)


   Dim objDataRow

   Set objDataRow = objDataClass.AddRow


   objDataRow.SetField 0, oEdit

   objDataRow.SetField 1, oProd

   objDataRow.SetField 2, oProdID

   objDataRow.SetField 3, oBit

   objDataRow.SetField 4, oKey

   objDataRow.SetField 5, oNote


   nse.SendQueued

End Sub


Function decodeKey(iValues, newOffice)

   Dim arrDPID, foundKeys

   arrDPID = Array()

   foundKeys = Array()


   If (newOffice) Then

      For i = 808 to 822

         ReDim Preserve arrDPID( UBound(arrDPID) + 1 )

         arrDPID( UBound(arrDPID) ) = iValues(i)

      Next

  

   Else

      For i = 52 to 66

         ReDim Preserve arrDPID( UBound(arrDPID) + 1 )

         arrDPID( UBound(arrDPID) ) = iValues(i)

      Next

   End If


   Dim arrChars

   arrChars = Array("B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9")


   For i = 24 To 0 Step -1

      k = 0


      For j = 14 To 0 Step -1

         k = k * 256 Xor arrDPID(j)

         arrDPID(j) = Int(k / 24)

         k = k Mod 24

      Next


      strProductKey = arrChars(k) & strProductKey


      If i Mod 5 = 0 And i <> 0 Then strProductKey = "-" & strProductKey

   Next


   ReDim Preserve foundKeys( UBound(foundKeys) + 1 )

  

   foundKeys( UBound(foundKeys) ) = strProductKey


   strKey = UBound(foundKeys)


   decodeKey = foundKeys(strKey)

End Function

Segundo Passo: entender a estrutura gerada pelo script

Agora que entendemos o objetivo e o funcionamento do script, é importante entender o resultado gerado pelo mesmo. Copie o script do passo acima e cole o conteúdo no bloco de notas. Dê um nome qualquer, como “ColetaSeriais.vbs”, e coloque o script no desktop de uma máquina-alvo.

Antes de executar o script é importante dizer que o conteúdo gerado por ele estará disponível na pasta que contém a fila do agente: “C:\Program Files\Altiris\Altiris Agent\Queue\<Nome do Servidor SMP>”. Ao executar o script o conteúdo aparece rapidamente na pasta e logo que é processado, desaparece. Portanto seja rápido para executar, dar um CTRL+C nos arquivos e um CTRL+V no desktop.

Depois de executar o script e copiar os arquivos gerados por ele para o desktop da máquina-alvo, abra um dos arquivos – geralmente são gerados dois – e analise o conteúdo, que deve ser semelhante ao abaixo:

<?xml version="1.0"?>

<message>

<to>{1592B913-72F3-4C36-91D2-D4EDA21D2F96}</to>

<priority>1</priority>

<msgId>{E03288D6-C490-41EE-9F9D-82EBA4F83DC8}</msgId>

<time>20131220060008.914000+480</time>

<from>

       <resource typeGuid="{2C3CB3BB-FEE9-48DF-804F-90856198B600}" guid="{C8AD41C6-7663-45B1-97E9-7151ABB6194C}" name="WIN7">

              <key name="fqdn" value="WIN7.ses.local"/>

              <key name="name.domain" value="WIN7.SES"/>

              <key name="uniqueid" value="hTb0l3RZKzqNkZGcJHVFrA=="/>

              <key name="uniqueid" value="tyuSc23itsGsVGJIBsg0RQ=="/>

       </resource>

</from>

<body>

       <inventory>

              <dataClass guid="{4e8d251e-cec2-4435-b245-e527f59a63df}">

                     <data>

                           <resource partialUpdate="false">

                                  <row c0="Microsoft Office Standard 2010 (VL)" c1="Microsoft Office Standard 2010" c2="82503-001-0000106-38277" c3="64" c4="XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" c5="" hash="FBOSq+KqyozClXgqoFpGug=="/>

                           </resource>

                           <resource partialUpdate="false">

                                  <row c0="Microsoft Office Project Professional2010 (VL)" c1="Microsoft Project Professional 2010" c2="82503-001-0000205-49789" c3="64" c4="XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" c5="" hash="oXZ58MD3Q9ad0ZSiPNIZRw=="/>

                           </resource>

                     </data>

              </dataClass>

       </inventory>

</body>

</message>

Basicamente o resultado gerado é um XML com informações no formato esperado pelo Notification Server, como: para qual data class a informação será enviada, qual a prioridade de envio, se o update é parcial e o mais importante, as informações sobre os softwares que procuramos e os seriais deles.

Como exemplo, vamos separar o trecho abaixo:

<row c0="Microsoft Office Project Professional2010 (VL)" c1="Microsoft Project Professional 2010" c2="82503-001-0000205-49789" c3="64" c4="XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" c5="" hash="oXZ58MD3Q9ad0ZSiPNIZRw=="/>

As informações que precisamos estão em estruturas como c0, c1, c2 e assim por diante. O nome do software, por exemplo, está na coluna c1 enquanto o serial está na coluna c4.

Terceiro Passo: criação do data class customizado

Agora que temos o script coletando as informações e gerando o resultado na fila do agente da nossa máquina-alvo, é hora de criar o data class no lado do servidor para armazenar as informações que serão enviadas.

A criação do data class customizado é simples e rápida. Apesar disso é importante ficar atento para a posição do campo, que deve ser a mesma gerada pelo script VBS. Se as posições não estiverem iguais pode acontecer de uma determinada informação ir parar em outra coluna do nosso data class customizado, o que obviamente não queremos.

Outro item de atenção é o GUID do data class, que deve ser colocado no script para o envio das informações para o data class correto. Depois de criarmos o data class vamos realizar essa alteração.

Um lembrete importante é que a cada alteração efetuada no data class, o GUID também muda. Isso significa que temos que atualizar o script que está na máquina-alvo. No decorrer do artigo veremos que depois de automatizar a tarefa, essa alteração é simples e não causa nenhum impacto importante.

Antes de criar o data class customizado, é importante saber os campos que queremos armazenar:

  • NomeVL
  • Nome
  • Id
  • Bits
  • Chave
  • Hash

Siga os passos abaixo para criar o data class customizado:

  • Vá em Settings > All Settings > Settings > Discovery and Inventory > Inventory Solution > Manage Custom Data Classes.

terceiro_passo_item_1.jpg

  • Clique em “New data class” e preencha as informações gerais de acordo com a tela abaixo:

terceiro_passo_item_2.jpg

  • Clique em OK para fechar a caixa de diálogo acima e começarmos a informar os campos na ordem correta, para recebermos as informações que serão enviadas pelo agente.
  • Agora selecione o data class e clique em “Add Attribute”, destacado na imagem abaixo:

terceiro_passo_item_4.jpg

  • Um a um, informe os campos conforme exemplo abaixo, alterando apenas o parâmetro “Name”:

terceiro_passo_item_5.jpg

  • A tela abaixo apresenta todos os campos necessários:

terceiro_passo_item_6.jpg

  • Por último, antes de salvar o nosso data class customizado, é importante marcar o campo que permitirá armazenar vários registros vindos de um mesmo computador:

terceiro_passo_item_7.jpg

  • Após todos os procedimentos acima, clique em “Save Changes”.

Quarto Passo: alterar o script para inserir o GUID do data class

Agora que temos o data class criado, vamos selecionar o GUID e inserí-lo no script. Assim garantimos que a informação coletada será entregue para o data class correto.

Para saber o GUID do data class que acabamos de criar, selecione o data class “ColetaSeriais” e clique no botão indicado abaixo:

quarto_passo.jpg

Copie o valor do GUID, no nosso exemplo “1f5ce21a-bb0b-411d-a4c2-027e80ffd973” e cole-o no script que está na máquina-alvo. Cuidado para não copiar algum espaço em branco porque o script não irá enviar as informações para o data class. Segue a linha que devemos alterar:

Sub writeNSE (oEdit,oProd,oProdID,oBit,oKey,oNote)

   Dim objDCInstance

   Set objDCInstance = nse.AddDataClass ("{1f5ce21a-bb0b-411d-a4c2-027e80ffd973}")


   Dim objDataClass

   Set objDataClass = nse.AddDataBlock (objDCInstance)


   Dim objDataRow

   Set objDataRow = objDataClass.AddRow


   objDataRow.SetField 0, oEdit

   objDataRow.SetField 1, oProd

   objDataRow.SetField 2, oProdID

   objDataRow.SetField 3, oBit

   objDataRow.SetField 4, oKey

   objDataRow.SetField 5, oNote


   nse.SendQueued

End Sub

 

Quinto Passo: testar a execução do script

Hora de testar o nosso script. Nesse momento a tabela que irá armazenar as informações no servidor já está criada e pronta para receber os dados. No passo anterior podemos ver o nome da tabela, no campo “Table Name”: Inv_ColetaSeriais.

Dê um clique duplo no script e vamos consultar a tabela no servidor para verificar se os valores estão presentes.

Basicamente temos duas alternativas para visualizar as informações: consultando diretamente no banco de dados ou através do Resource Manager.

Consulta no Banco de Dados:

select * from Symantec_CMDB.dbo.Inv_ColetaSeriais

Consulta no Resource Manager:

  • Vá em Manage > Computers e selecione a máquina-alvo na lista de computadores.
  • Clique com o botão direito e escolha a opção “Resource Manager”
  • Na nova janela que irá abrir, escolha a opção “View > Inventory”.
  • No frame que fica no meio, escolha “Data Classes > Inventory > Custom” e selecione o nosso data class “ColetaSeriais”. Verifique se as informações estão presentes.

Importante: execute o comando de exclusão das linhas inseridas apenas por questão “estética”, já que nos passos seguintes iremos criar a Task para executar o script automaticamente e veremos se os valores foram inseridos na tabela.

quinto_passo.jpg

Sexto Passo: automatizando a execução da coleta através de uma Task

Para executarmos o procedimento visto nos passos acima de maneira automática podemos fazer uso da criação de uma Task. A principal vantagem é utilizar a estrutura da plataforma para fazer a distribuição da task nas máquinas-alvo e permitir a criação de um agendamento; dessa maneira automatizamos o processo e partimos para o próximo passo: criar um relatório para visualização das informações coletadas.

A criação da Task é simples e pode ser feita seguindo os passos abaixo:

  • Vá em Manage > Jobs and Tasks
  • Do lado esquerdo selecione System Jobs and Tasks > Discovery and Inventory > Inventory.
  • Clique com o botão direito na pasta e selecione a opção New > Task. Irá abrir uma janela onde você deverá selecionar a opção Run Script, uma das últimas da lista de opções.
  • Altere o nome da Task para um nome qualquer. Em Script type selecione a opção VBScript e cole o conteúdo todo do script no campo central. Depois dessas configurações, a sua tela ficará semelhante a tela abaixo:

sexto_passo_item_4.jpg

  • Clique em OK para salvar a Task.
  • A tela de criação de Task é dividida em duas seções: Script Details, onde fizemos todas as configurações, e Task Status, onde podemos criar uma agenda para a execução da Task de maneira automática ou esporadicamente através da opção Quick Run.
  • Para o nosso artigo vamos apenas clicar em Quick Run. Ao clicar irá abrir uma janela para seleção do recurso-alvo, que no nosso exemplo é a máquina WIN7. Depois de selecionar a máquina-alvo e clicar em Run, a Task iniciará a executar, conforme exemplo abaixo:

sexto_passo_item_7.jpg

  • Depois da execução, siga os passos descritos no passo 5 para visualizar as informações.

Sétimo Passo: criando um relatório para exibição dos seriais coletados

A criação do relatório também é bem simples e pode ser facilmente executada seguindo os passos abaixo.

  • Vá em Reports > All Reports
  • Clique com o botão direito em Reports > New > Folder. Vamos criar uma nova pasta apenas para separar o nosso relatório dos demais.
  • Informe qualquer valor para o nome da pasta, conforme exemplo abaixo:

setimo_passo_item_3.jpg
 

  • Clique com o botão direito na pasta recém criada e escolha a opção New > Report > SQL Report. A consulta pode variar de acordo com a necessidade do seu projeto ou de outros requisitos, mas basicamente o que precisamos é selecionar as informações da tabela, conforme exemplo abaixo:

setimo_passo_item_4.jpg

  • Clique em Save Changes e visualize as informações coletadas automaticamente!

Conclusão

Diversas vezes durante a execução de um projeto nos deparamos com alguns obstáculos. O propósito desse artigo é oferecer para a equipe responsável pelo projeto uma maneira sucinta e elegante de conseguir adicionar uma funcionalidade que não é nativa na solução.

O exemplo aplicado aqui – coleta de seriais de software – pode ser estendido para diversas outras situações. Quaisquer melhorias nesse script, como a adição de novos softwares, será compartilhada nesse forum para facilitar o dia-a-dia do time estendido. Façam bom uso!

Obrigado!

Comments 10 CommentsJump to latest comment

fabio.sanches's picture

Inventário customizado é uma funcionalidade do Altiris que realmente impressiona os clientes pela flexibilidade (e funciona muito bem!).

Excelente artigo Arthur! Obrigado por compartilhar!

0
Login to vote
Pedro Laviano's picture

Ótimo post Arthur!

Obrigado por compartilhar.

0
Login to vote
dlopes's picture

Obrigado por compartilhar!

Daniel Lopes de Oliveira
Technical Team Leader - Endpoint Management & Mobility

0
Login to vote
Rodrigo Ferreira Noronha's picture

Muito útil e bem explicado.

0
Login to vote
KleytonF's picture

Parabéns, muito bom!

0
Login to vote
rafaelfontana's picture

Utilizei alguns passos como base, e utilizei uns samples do Altiris e criei um inventário customizado com sucesso. Ótimo artigo.

0
Login to vote
luizphelipesilva's picture

Parabens, muito util e bem explicado.

Luiz Phelipe da Silva

luiz.phelipe@wtrservices.com.br

0
Login to vote
JeanWilson's picture

Could someone translate this for me?  I am looking to report on Microsoft product license key in our environment

0
Login to vote
Arthur Oreana's picture

Hi BillyJean! I'll send you a private message.

Kindly,
Arthur Oreana.

Arthur Oreana

0
Login to vote
Rafausk's picture

Muito bom o artigo!!

Obrigado por compartilhar!!!

0
Login to vote