NS7.1 Custom inventory help - registry values
Hi folks,
I need some help with a custom inventory of a registry key. I have scoured the forums here, and found many helpful articles, which have gotten me as far as I have. I have created a custom dataclass and modified the sample Windows custom inventory script for registry data - all of this was a lot simpler than I expected it to be. However, something isn't working, so obviously I've done something wrong. After running my custom inventory on a client, my dataclass is still empty.
What I am trying to do: I am attempting to query ONE registry key: “HKLM\SOFTWARE\Nico Mak Computing\WinZip\WinIni" to grab 7 registry values. Later, we will create a filter based upon these values in order to set up an Application Metering policy to block unlicensed copies of Winzip. Can anyone identify what I am doing wrong?
Here is an example of the Winzip "Winini" registry key I am trying to grab data from. This computer only has 2 of the 7 registry values I want to grab. As you can see, this will be a pretty simple registry inventory. No multiple keys, just multiple values within the same registry key.
So, based on that registry key, I made the following data class:
Lastly, there is my script:
'Gather registry key value from machine and posting data to NS using Altiris NSE Component
'===================================================================================================================
' On Error Resume Next
const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set oReg=GetObject( _
"winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Nico Mak Computing\WinZip\WinIni"
strValueName1 = "Setup"
strValueName2 = "win32_version"
strValueName3 = "Name"
strValueName4 = "SN"
strValueName5 = "UZQF"
StrValueName6 = "Name1"
StrValueName7 = "SN1"
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName1,Setup
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName2,win32_version
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName3,Name
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName4,SN
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName5,UZQF
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName6,Name1
oReg.GetStringValue _
HKEY_LOCAL_MACHINE,strKeyPath,strValueName7,SN1
if isnull(Setup) then
Setup = "missing"
end if
if isnull(win32_version) then
win32_version = "missing"
end if
if isnull(Name) then
Name = "missing"
end if
if isnull(SN) then
SN = "missing"
end if
if isnull(UZQF) then
UZQF = "missing"
end if
if isnull(Name1) then
SN = "missing"
end if
if isnull(SN) then
SN = "missing"
end if
'===================================================================================================================
'Create instance of Altiris NSE component
dim nse
set nse = WScript.CreateObject ("Altiris.AeXNSEvent")
' Set the header data of the NSE
' Please don't modify this GUID
nse.To = "{1592B913-72F3-4C36-91D2-D4EDA21D2F96}"
nse.Priority = 1
'Create Inventory data block. Here assumption is that the data class with below guid is already configured on server
dim objDCInstance
'Insert custom Data Class GUID here
set objDCInstance = nse.AddDataClass ("{6741a63d-8c48-428d-a7c0-54e3421e60f0 }")
dim objDataClass
set objDataClass = nse.AddDataBlock (objDCInstance)
'Add a new row
dim objDataRow
set objDataRow = objDataClass.AddRow
'Set columns
objDataRow.SetField 0, Setup
objDataRow.SetField 1, win32_version
objDataRow.SetField 2, Name
objDataRow.SetField 3, UZQF
objDataRow.SetField 3, SN
objDataRow.SetField 3, Name1
objDataRow.SetField 3, SN
nse.SendQueued
So, that's everything. Should be pretty simple, right? I have a feeling someone is going to point out one really obvious thing that I did wrong, and once corrected, everything should work. Well, I'm hoping at any rate...
Any help would be appreciated! Thank you,
Dustin
Comments 6 Comments • Jump to latest comment
I imagine that you have already spotted the really obvious thing wrong with your script, but in case you haven't:
objDataRow.SetField 0, Setup
objDataRow.SetField 1, win32_version
objDataRow.SetField 2, Name
objDataRow.SetField 3, UZQF
objDataRow.SetField 3, SN
objDataRow.SetField 3, Name1
objDataRow.SetField 3, SN
Yep, that was about as obvious as it gets, and thanks, I did miss it. Still, dataclass is empty. Any other pointers?
You could just specify the (exact) name of the custom inventory instead, instead of the GUID.
'Insert custom Data Class GUID here
set objDCInstance = nse.AddDataClass ("MyCustomInventory")
Execute the script locally on the client and then check if the (custom inventory) table has been populated with that client's inventory data
Just had some free time to give you this;
change CUSTOM_INVENTORY_NAME_OR_GUID to your actuall custom inventory name or guid.
Option Explicit '// Desc: The data class WinZip_License_Inventory stores information WinZip licenses '// DataClass.Field 0 = Setup '// DataClass.Field 1 = win32_version '// DataClass.Field 2 = Name '// DataClass.Field 3 = SN '// DataClass.Field 4 = UZQF '// DataClass.Field 5 = Name1 '// DataClass.Field 6 = SN1 '//////////////////////////////////////////////////////////// Const CUSTOM_INVENTORY_NAME_OR_GUID = "WinZip_License_Inventory" Const REG_KEY = "HKEY_LOCAL_MACHINE\SOFTWARE\Nico Mak Computing\WinZip\WinIni" Const REG_ENTRIES = "Setup,win32_version,Name,SN,UZQF,Name1,SN1" Dim value Dim oNSEvent, oDataBlock '// WinZip not installed; no need to send inventory data '// (default registry entry does not exist) If (not GetRegistryEntry(REG_KEY, "", value)) Then wscript.quit(0) Set oDataBlock = NSE_CreateCustomInvDataBlock(CUSTOM_INVENTORY_NAME_OR_GUID, oNSEvent) '// failed to add inventory data if (not AddInventoryData(oDataBlock)) then wscript.quit(1) '// Send inventory data oNSEvent.SendQueued Function AddInventoryData(ByRef oNSEDataBlock) On Error Resume Next Dim oDataRow, values, i, value AddInventoryData = false err.clear Set oDataRow = oNSEDataBlock.AddRow If (Err <> 0) Then Exit Function values = split(REG_ENTRIES, ",") for i = 0 to ubound(values) If (not GetRegistryEntry(REG_KEY, values(i), value)) Then value = "missing" end if oDataRow.SetField i, ToXmlString(value) If (Err <> 0) Then Exit Function next AddInventoryData = true End Function Function NSE_CreateCustomInvDataBlock(ByVal sCustomInvName, ByRef oNSEvent) On Error Resume Next Dim oDataClass Set NSE_CreateCustomInvDataBlock = Nothing Set oNSEvent = Nothing Err.Clear Set oNSEvent = CreateObject("Altiris.AeXNSEvent") If (Err <> 0) Then Exit Function ' Set the header data of the NSE (don't modify this GUID) oNSEvent.To = "{1592B913-72F3-4C36-91D2-D4EDA21D2F96}" '// Basic Inventory Capture Item (Inventory Capture Item) oNSEvent.Priority = 1 Set oDataClass = oNSEvent.AddDataClass(sCustomInvName) If (Err <> 0) Then Exit Function Set NSE_CreateCustomInvDataBlock = oNSEvent.AddDataBlock(oDataClass) If (Err <> 0) Then Exit Function End Function Function ToXmlString(value) Dim sXmlString If (IsNull(value)) Then sXmlString = value Else sXmlString = value sXmlString = Replace(sXmlString, "&", "&") sXmlString = Replace(sXmlString, """", """) sXmlString = Replace(sXmlString, "<", "<") sXmlString = Replace(sXmlString, ">", ">") End If ToXMLString = sXmlString End Function Function GetRegistryEntry(sRegPath, sEntryName, value) on error resume next dim oWshShell, regpath GetRegistryEntry = false regpath = sRegPath If (Right(regpath, 1) <> "\") Then regpath = regpath & "\" regpath = regpath & sEntryName Set oWshShell = CreateObject("WScript.Shell") Err.Clear value = oWshShell.RegRead(regpath) If (Err = 0) Then GetRegistryEntry = true Err.Clear Set oWshShell = Nothing End FunctionI think I see why you're having problem with your empty dataclass,
set objDCInstance = nse.AddDataClass ("{6741a63d-8c48-428d-a7c0-54e3421e60f0 }")
remove the space at the end, your guid should look like: "{6741a63d-8c48-428d-a7c0-54e3421e60f0}"
Would you like to reply?
Login or Register to post your comment.