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.
- Clique em “New data class” e preencha as informações gerais de acordo com a tela abaixo:
- 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:
- Um a um, informe os campos conforme exemplo abaixo, alterando apenas o parâmetro “Name”:
- A tela abaixo apresenta todos os campos necessários:
- 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:
- 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:
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.
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:
- 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:
- 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:
- 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:
- 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!