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

luke.s'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!

If the suggestion has helped to solve your problem, please mark the post as a solution.

Fábio Sanches
IT Technical Manager | WTR Services | www.wtrservices.com.br

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