Tuesday, 30 December 2008

Error ''Item has already been added'' when trying to set Resource Type in a CMDB or Connector Rule

Applies To

• Altiris Connector 6.5
• CMDB 6.5


After upgrading to CMDB/Asset 6.5, when trying to set the Resource Type within a CMDB or Connector rule, the following error may be shown:

Module: AltirisNativeHelper.dll
Source: global.asax
Description: Unhandled exception.  Type=System.ArgumentException Msg=Item has already been added.  Key in dictionary: "8b92ef99-7bac-49a0-8694-48d7558bc7ee"  Key being added: "8b92ef99-7bac-49a0-8694-48d7558bc7ee"
   at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
   at System.Collections.Hashtable.Add(Object key, Object value)
   at Altiris.NS.Connector.Web.ImportExportRule.CreateDataClassesMappingsTable(Boolean bReloadColumns, Boolean bSetSavedValues)
   at Altiris.NS.Connector.Web.ImportExportRule.CreateAllMappingControls(Boolean bReloadColumns, Boolean bSetSavedValues)
   at Altiris.NS.Connector.Web.ImportExportRule.ResourceType_Change(Object sender, EventArgs e)
   at System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
   at System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
   at System.Web.UI.Page.RaiseChangedEvents()
   at System.Web.UI.Page.ProcessRequestMain()

The following Resource Types have been reported as affected by this issue, others could be affected:

Network Printer
Office Equipment


This can be caused by having the Accounting Information data class directly associated to a child Resource Type and the child's Base Resource Type, Asset.


  1. Back up the Altiris database
  2. Run the following sql script against the Altiris database

--Set up @ResourceTypeDataClassAssoc table variable
DECLARE @ResourceTypeDataClassAssoc TABLE
ResourceType nvarchar(250),
ResourceTypeGuid uniqueidentifier,
depth bit,
BaseResourceType nvarchar(250),
BaseResourceTypeGuid uniqueidentifier,
DataClass nvarchar(250),
ResourceDataClassGuid uniqueidentifier

populate @ResourceTypeDataClassAssoc with data classes
associated to resource types at each level in the hierarchy
INSERT INTO @ResourceTypeDataClassAssoc
SELECT i.name as ResourceType, rth.ResourceTypeGuid, rth.depth, i2.name as BaseResourceType,
rth.BaseResourceTypeGuid, i3.name as DataClass, rtdc.ResourceDataClassGuid
FROM ResourceTypeHierarchy rth
JOIN item i on rth.ResourceTypeGuid = i.Guid
JOIN item i2 on rth.BaseResourceTypeGuid = i2.Guid
JOIN ResourceTypeDataClass rtdc on rth.BaseResourceTypeGuid = rtdc.ResourceTypeGuid
JOIN item i3 ON rtdc.ResourceDataClassGuid = i3.Guid

Find resource types that have data classes associated directly, and indirectly through
any base resource type in their hierarchy, and delete them from the ResourceTypeDataClass table
DELETE FROM ResourceTypeDataClass
FROM @ResourceTypeDataClassAssoc rt1
  JOIN @ResourceTypeDataClassAssoc rt2 ON rt1.ResourceTypeGuid = rt2.ResourceTypeGuid
  AND rt1.BaseResourceType != rt2.BaseResourceType
  AND rt1.ResourceDataClassGuid = rt2.ResourceDataClassGuid
WHERE rt1.depth = 0
  AND ResourceTypeDataClass.ResourceTypeGuid = rt1.ResourceTypeGuid
  AND ResourceTypeDataClass.ResourceDataClassGuid = rt1.ResourceDataClassGuid

Tuesday, 9 December 2008

SBS 2003 and the 16 Gb Exchange limit solution

All credit goes to Michael for his post


  • Small Business Server 2003 - Release 2
  • Symptoms:
    • Users could not connect to Exchange via Outlook
    • Web Outlook was producing errors

Servers event logs showed following recurring errors:

Event Type: Error
Event Source: MSExchangeSA
Event Category: MAPI Session
Event ID: 9175
Date:  9/20/2007
Time:  3:53:59 PM
User:  N/A
The MAPI call ‘OpenMsgStore’ failed with the following error:
The attempt to log on to the Microsoft Exchange Server computer has failed.
The MAPI provider failed.
Microsoft Exchange Server Information Store
ID no: 8004011d-0512-00000000

A search on that Event ID produced all sorts of interesting results. I must have read through the first 15-20 entries there and settled on this Microsoft Knowledge Base article (#320705). [NOTE: this is NOT what I ended up doing!] I started to go through the steps and decided before I started running command line switches on things, messing with moving the Information Store around or merging .PST files, I would read up and dig around a bit more in the Event log.

I figured that it would be important to do a little forensics to see if I could see another event that may have caused the Information Store to crap out. So, I found an event that happened right before all of the 9175’s started happening. This is what it contained:

Event Type: Warning
Event Source: ESE
Event Category: Space Management
Event ID: 445
Date:  9/20/2007
Time:  1:46:26 PM
User:  N/A
Information Store (4996) First Storage Group: The database F:\Exchsrvr\MDBDATA\priv1.edb has reached its maximum size of 16383 MB. If the database cannot be restarted, an offline defragmentation may be performed to reduce its size.

Back to Google to see if Exchange SP2 can be installed on SBS 2003…and I came across this FAQ on Microsoft. In it, I came upon the answers I was looking for:

Q. Does SP2 work on Microsoft Windows Small Business Server 2003?
A. Yes. Windows Small Business Server 2003 with SP1 fully supports Exchange Server 2003 SP2. Exchange Server 2003 SP2 was tested to ensure compatibility.

Q. Did the storage limit change for SP2?
A. Based on feedback from customers and because of the evolution of e-mail usage, we are increasing the storage limit for Exchange Server 2003 Standard Edition with SP2 to 75 gigabytes (GB). In order to prevent the database from growing unexpectedly after an upgrade to SP2, the limit is set to 18 GB and can be set up to 75 GB by using a registry key. For more information about setting the limit, see the Exchange Server 2003 Help, updated during the SP2 installation.
Q. Does the storage limit change apply to Windows Small Business Server 2003?
A. Yes. Windows Small Business Server 2003 users can take advantage of the storage limit changes implemented in Exchange Server 2003 SP2.

GREAT! So the next thing was to get Exchange SP2 installed. The download is located here. (Saved you some search time, right?)

Installation went fine without issue. The installer stopped and started services as it was supposed to and everything updated perfectly. Once the install was complete, people could connect to Exchange via Outlook immediately. BUT WAIT! There was one more thing that had to be done after this upgrade. I guess that after the upgrade, the File Store is only updated to 18 Gigs (I believe). So, in order to really take advantage of more space, you have to do a registry hack. Here is what you need to do (oh, and one reminder: While I have personally done the steps above and they seemed to have worked for me, I cannot guarantee that they will work for you, nor that you are free from risk doing any of this stuff written above; you take these actions at your own risk and I will not be held responsible for anything “bad” that you may do to your computer...anyway…)
Here are the steps for the registry hack:

  1. Open your Registry Editor (if you don’t know how to do this…you shouldn’t be reading this article)
  2. Navigate to: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\<Servername>\Private-GUID
  3. Create a DWORD entry by right-clicking on the folder and selecting NEW > DWORD Value
  4. Enter a DECIMAL value of anything between 18 and 75 (making sure that it is not larger than the free space on the drive where your store resides)
  5. Do Steps 3 and 4 again with: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeIS\<Servername>\Public-GUID
  6. Exit the Registry Editor and go into Services and restart the “Microsoft Exchange Information Store”
  7. That’s it!

To check to see if your new setting was stored properly, wait a few minutes and then look for Event ID#1216. That event should give you details on your new Store size (example below).

Event Type: Information
Event Source: MSExchangeIS Mailbox Store
Event Category: General
Event ID: 1216
Date:  9/20/2007
Time:  4:25:24 PM
User:  N/A
The Exchange store ‘First Storage Group\Mailbox Store (XXXXXXXXX-SERVER)’ is limited to 50 GB. The current physical size of this database (the .edb file and the .stm file) is 15 GB. If the physical size of this database minus its logical free space exceeds the limit of 50 GB, the database will be dismounted on a regular basis.

If you found this usefull remember to click on an AD.



Migrating a Citrix datastore ( access, sql express ) to Microsoft SQL ( sql , sql express )

I've found this post on one the forums and the procedure works like a charm !

Migrating a Citrix Access data store to Microsoft SQL Server 2005

The following instructions outline the process of migrating a Citrix MetaFrame XP Access data store to Microsoft SQL Server. Please note, this process requires the Citrix servers to be restarted and adequate backup measures should be taken prior to migration in case of failure. citrixInformation in this article has been taken from the following sources: • How to create a database for use as a data store using SQL Server (http://support.citrix.com/kb/entry!default.jspa?categoryID=118&entryID=3412)• Advanced Concepts - Farm Maintenance (http://support.citrix.com/kb/entry!default.jspa?categoryID=118&entryID=2188)
To migrate a Citrix Presetation Server data store to Microsoft SQL Server:

I. Create the target database on the SQL server:

1. Start SQL Enterprise Manager.

2. in the left-hand pane, expand the tree until you reach folder level.

3. Right-click on the databases folder and select New Database

4. In the dialog box, enter a name into the Name textbox and click OK. The name entered is not important.

5. Expand the security folder.

6. Right-click Logins and select New Login

7. A dialog box appears with the General tab displayed. In the Name textbox, enter a username for the new login. Make a note of this username, as you will need it during the migration procedure.

8. In the Authentication section of the General tab, click SQL Server Authentication and enter a password. Make a note of this password, as you will need it during the migration procedure.

9. In the Defaults are of the General tab, change the database to the name you specified in step 4.

10. Click the Database Access tab. In the Database list, select the database name specified in step 4.

11. In the Database Roles list, select DB_Owner. Leave the other selected roles checked. 12. Click OK. You are prompted to confirm your password at this point. 13. The database isnow created. Exit SQL Enterprise Manager.

II. Create a new DSN file pointing to the database created above:

1. Start ODBC Data Source Administrator.

2. Select the File DSN tab, and click Add.

3. In the driver list, select SQL Server and click Next.

4. Click Browse and navigate to the %PROGRAMFILES%\Citrix\Independent Management Architecture folder. Enter a filename for the DSN. Click OK then click Next.

5. Confirm the information entered, then click Finish.

6. The Create a new Data Source to SQL Server dialog, enter a description if required.

7. In the SQL Server box, enter the name of the SQL Server on which the database has been created. Click Next.

8. Click With SQL Server authentication using a login ID and password entered by the user then enter the Login ID and password of the database user created above. Click Next

9. Check Change the default database to and select the name of the database created above. Click Next, then click Finish.

10. In the ODBC Microsoft SQL Server Setup dialog, click Test Data Source button to ensure connectivity. Once finished, click OK to finalise DSN creation.

III. On the host server, start Command Prompt and change to the %PROGRAMFILES%\Citrix\Independent Management Architecture folder.

IV. Execute the dsmaint migrate command with the following parameters:

dsmaint migrate /srcdsn:path and name of existing DSN /srcuser:leave blank /srcpwd:leave blank /dstdsn:path and name of new DSN /dstuser:new DSN login name /dstpwd:new DSN password

V. Once the migration procedure has finished (it can take anywhere from a few seconds to a few minutes), execute the dsmaint config command with the following parameters: dsmaint config /user:new DSN login name /pwd:new DSN password /dsn:path and name of new DSN ds

VI. Stop and restart the IMA service. After the IMA service has restarted, all other servers begin accessing the new data store through the host server. t Please note: Restarting the IMA Service may cause the SNMP service to Dr Watson if SNMP is enabled. This is benign and can safely be ignored.

VII. Copy the new DSN file to all other servers in the farm.

VIII. Execute the dsmaint config command on each server with the same parameters as above to establish a direct connection to the new data store.

IX. Stop and restart the IMA service on all remaining indirect servers in the farm.

Friday, 5 December 2008

SCCM : How To Include Files , Folders & Registry Settings in USMT 3.x

When you specify the migration .xml files, USMT migrates the settings and components specified in What Does USMT 3.0 Migrate?. To include additional files and settings, we recommend that you create a custom .xml file and then include this .xml file on both command lines. This way, you can keep your changes separate from the default .xml files and it may be easier to track your modifications.

To migrate a single registry key

The following .xml file migrates a single registry key.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Application" context="System">
<displayName>Component to migrate only registry value string</displayName>
<role role="Settings">
<pattern type="Registry">HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache [Persistent]</pattern>

To migrate a specific folder

To migrate a folder from a specific drive
Including subfolders

The following .xml file migrates all files and subfolders from C:\EngineeringDrafts to the destination computer.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Documents" context="System">
<displayName>Component to migrate all Engineering Drafts Documents including subfolders</displayName>
<role role="Data"> <rules> <include>
<pattern type="File">C:\EngineeringDrafts\* [*]</pattern>
</include> </rules> </role>
Excluding subfolders

The following .xml file migrates all files from C:\EngineeringDrafts, but does not migrate any subfolders within C:\EngineeringDrafts.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Documents" context="System">
<displayName>Component to migrate all Engineering Drafts Documents without subfolders</displayName>
<role role="Data"> <rules> <include>
<pattern type="File"> C:\EngineeringDrafts\ [*]</pattern>
</include> </rules> </role>
To migrate a folder from any location

The following .xml file migrates all files and subfolders of the EngineeringDrafts folder from any drive on the computer. If multiple folders exist with the same name all such files will get migrated.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Documents" context="System">
<displayName>Component to migrate all Engineering Drafts Documents folder on any drive on the computer </displayName>
<role role="Data">
<script>MigXmlHelper.GenerateDrivePatterns ("\EngineeringDrafts\* [*] ", "Fixed")</script>
<script>MigXmlHelper.GenerateDrivePatterns ("*\EngineeringDrafts\* [*] ", "Fixed")</script>

The following .xml file migrates all files and subfolders of the EngineeringDrafts folder from where ever it exists on the C: drive. If multiple folders exist with the same name all such folders will get migrated

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Documents" context="System">
<displayName>Component to migrate all Engineering Drafts Documents EngineeringDrafts folder from where ever it exists on the C: drive </displayName>
<role role="Data">
<pattern type="File"> C:\*\EngineeringDrafts\* [*]</pattern>
<pattern type="File"> C:\EngineeringDrafts\* [*]</pattern>

To migrate a file type into a specific folder

The following .xml file migrates .mp3 files located in the fixed drives on the source computer into the 'C:\Music folder on the destination computer.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Documents" context="System">
<displayName>All .mp3 files to My Documents</displayName>
<role role="Data">
<script>MigXmlHelper.GenerateDrivePatterns ("* [*.mp3]", "Fixed")</script>
<!-- Migrates all the .mp3 files in the store to the C:\Music folder during LoadState -->
<locationModify script="MigXmlHelper.Move('C:\Music')">
<script>MigXmlHelper.GenerateDrivePatterns ("* [*.mp3]", "Fixed")</script>

To migrate a specific file

The following examples show how to migrate a file from a specific folder, and how to migrate a file from any location.

To migrate a file from a folder

The following .xml file migrates only Sample.doc from C:\EngineeringDrafts to the destination computer.

<migration urlid="http://www.microsoft.com/migration/1.0/migxmlext/test">
<component type="Documents" context="System">
<displayName>Component to migrate all Engineering Drafts Documents</displayName>
<role role="Data"> <rules> <include>
<pattern type="File"> C:\EngineeringDrafts\ [Sample.doc]</pattern>
</include> </rules> </role>
To migrate a file from any location

To migrate Sample.doc from where ever it exists on the C: drive, use <pattern> as follows. If multiple files exist with the same name on the C: drive, then all of these files will be migrated.

<pattern type="File"> C:\* [Sample.doc] </pattern>

To migrate Sample.doc from any drive on the computer, use <script> as follows. If multiple files exist with the same name, all such files will get migrated.

<script>MigXmlHelper.GenerateDrivePatterns("* [sample.doc]", “Fixed”)</script>

SCCM : XML examples for use in USMT 3.0.1

Can be found over here


Thursday, 4 December 2008

Altiris Notification Server (NS) reports for Altiris Deployment Server (DS)

Following links will give you some NS reports for DS



Shows a listing of all DS jobs that are currently (actively) deploying. 
Count of all computers with pending DS jobs. Right-click option will list the jobs pending for the selected computer. 
List of scheduled DS jobs that have been scheduled for more than X amount of days, with 30 as the default. 
List of all scheduled DS jobs, but you have the option of entering full/partial computer name and DS Job name to filter your results. The default is a full list of all scheduled DS jobs for all computers. 
Like report #2, but this is for Completed jobs, rather than pending. 
Like report #4, but this is for Completed Jobs, rather than pending. 



Report to give you jobs that are scheduled in the future for DS 
Report to find all of your WOL proxies 


Altiris Database Structure (Schema) of NS or any other database

Article ID: 1485

These are SQL scripts to show and capture the Database structure of the Notification Server or any other database.

-- SQL Script to capture the database table structure
[table_name] as [Table Name],
[column_name] as [Column Name],
case [data_type]
when 'varchar' then [data_type] + '(' + cast([character_maximum_length] as varchar) + ')'
when 'nvarchar' then [data_type] + '(' + cast([character_maximum_length] as nvarchar) + ')'
else [data_type]
end as [Data Type],
case [is_nullable]
when 'No' then 'No'
else 'Yes'
end as [Nullable],
isnull([column_default], '') as [Default Value],
isnull(cast([numeric_precision] as nvarchar),'') as [Precision],
isnull(cast([numeric_precision_radix] as nvarchar),'') as [Precision Radix],
isnull([collation_name],'') as [Collation Name]
from information_schema.[columns]
where [table_catalog] like '%'
and [table_schema] like 'dbo'
and [table_name] like '%'
and [column_name] like '%'
and [data_type] like '%'
order by [table_name], [ordinal_position]

-- SQL Script to capture the names of the database objects
select distinct
case [xtype]
when 'C' then 'CHECK constraint'
when 'D' then 'DEFAULT constraint'
when 'F' then 'FOREIGN KEY constraint'
when 'L' then 'Log'
when 'FN' then 'Scalar function'
when 'IF' then 'Inlined table-function'
when 'P' then 'Stored procedure'
when 'PK' then 'PRIMARY KEY constraint'
when 'RF' then 'Replication filter stored procedure'
when 'S' then 'SYSTEM table'
when 'TF' then 'Table function'
when 'TR' then 'Trigger'
when 'U' then 'User table'
when 'UQ' then 'UNIQUE constraint'
when 'V' then 'View'
when 'X' then 'Extended stored procedure'
end as [xtype],
[name] as [Name]
from [dbo].[sysobjects]
where [xtype] in ('C', 'D', 'FN','P', 'PK', 'TR', 'U', 'V')
and [name] like '%'
order by [xtype], [name]

-- SQL Script to capture the Names and Definitions of Views
[table_name] as [View Name],
[view_definition] as [View Definition]
from information_schema.[views]
where [table_name] like '%'
order by [table_name]

-- SQL Script to capture the Names and Definitions of functions and procedures
[routine_type] as [Routine Type],
[routine_name] as [Routine Name],
[routine_definition] as [Routine Definition]
from information_schema.[routines]
where [routine_type] in ('FUNCTION','PROCEDURE')
and [routine_name] like '%'
order by [routine_name]

-- SQL Script to capture the Names and Parameters of functions and procedures

[specific_name] as [Routine Name],
[parameter_name] as [Parameter Name],
case [data_type]
when 'varchar' then [data_type] + '(' + cast([character_maximum_length] as varchar) + ')'
when 'nvarchar' then [data_type] + '(' + cast([character_maximum_length] as nvarchar) + ')'
else [data_type]
end as [Data Type]
from information_schema.[parameters]
where [specific_name] like '%'
order by [specific_name], [ordinal_position]

-- SQL Script to capture the GUID and Table names
-- This could help your SQL joins on what table have what guids.
[column_name] as [Guid Name],
[table_name] as [Table Name],
case [is_nullable]
when 'YES' then 'Yes'
else 'No'
end as [Nullable],
isnull([column_default], '') as [Default Value]
from information_schema.[columns]
where [table_schema] = 'dbo'
and [data_type] like 'uniqueidentifier'
order by [column_name], [table_name]

-- To look at the table or view definition

sp_help TableName
sp_help ViewName

sp_columns TableName

-- To look at what indexes are in a table

sp_helpindex TableName

-- To look at the definition of a stored procedure or a view

sp_helptext StoredProcedureName

sp_helptext ViewName

-- To look at the database object (tables, views, stored procedures) dependencies

sp_depends DatabaseObject


  • Run these SQL scripts in Query Analyzer and save the result to a CSV file for study.
  • You will need to select the database (Altiris, Altiris_Incidents, express …) in Query Analyzer you wish to capture the schema.
  • In the where clause of the scripts, I left variables to filter (table_catalog, table_schema, table_name, column_name, data_type ...) and narrow your results.
  • These are SQL scripts will show you any database structure (Schema), but will not show the relationships between the tables (Data Dictionary).
  • The best joins for performance reasons will be on the columns that are indexed. Most table joins will be withuniqueidentifier (GUIDs) like (_ResourceGuid, Guid, ProductGuid, _KeyHash ...) or varchar/nvarchar (strings); so you may wish to filter on the data_type to see these.
  • To look at a text output (Ctrl + T) or a table output (Ctrl + D) use the control key combinations. Then viewing the output from the stored procedure sp_helptext, it is good to change the output to text.
  • The attached files (DatabaseTableRelationByGuid.txt, DatabaseTableRelationByString.txt) are SQL scripts that will show you the possible relations between tables and columns depending on the data that is in you database. These SQL scripts can be slow, due to the use of nested cursors in the script. There are variables in the scripts to filter /narrow you results to a set of tables.

Deploying a HP 6930 with Altiris Deployment Server DS 6.8

A howto was described in following thread


Download the Intel Storage Matrix Softpaq from the HP site and change the included txtoem file.

Change the scsi= line from IaStor=*** to Iaachi=**
You need to know the version of SATA the 6930p needs to reference when booting. On our version we changed it to ICHM9_E/M (paraphrasing). If you have a clean install of XP with all the drivers loaded from scratch, you can find out what file this is.
Once found and changed int he TXTOEM, you need to re-create your PXE boot file, and select the correct NIC and the SATA files. I do this by dumping both the NIC and SATA drivers into one folder and selecting the 'Have Disk' option during NIC selection.
Changing the TXTOEM file is the hardest part of this process, but not impossible.
Keep in mind that while you may be able to boot the machine to WinPE, deploying an image with this drier requires re-sysprepping your base image to account for these new mass storage drivers. If not, the imaged computer WILL blue screen

Wednesday, 3 December 2008

Altiris : Remotely execute an Inventory Task on a client via Deployment Server (DS)

Got this from a thread on http://www.altirigos.com/

Create a VB script according to this specification

set objAltirisAgent = Createobject("Altiris.AeXNSClient")set objSWDAgent = objAltirisAgent.ClientPolicyMgr.ClientAgent("Altiris.SWD")
objSWDAgent.RunAdvertisement "{Guid of the inventory task to run}", 1
objSWDAgent.RunAdvertisement "{Guid of the inventory task to run}", 1



Altiris : Unable to add drivers to WinPE using the Have Disk button in DS 6.9 SP1


Launch BDC WinPE wizard and add a driver using the "Have Disk" button. After adding the driver browse out to the CUSTOM folder. You'll see that a explanatory text file was created, but no driver files were copied.


Run the attached Hotfix Installer (DS_BootWiz_Hotfix_6_9_357.exe) on your Deployment Server to resolve this issue.


Tuesday, 2 December 2008

Altiris AClient vs DAgent on Xp and Deployment Server (DS) 6.9 SP1

Dagent which comes with DS 6.9 SP1 will not replace the AClient if this one is already installed on a workstation. When you upgrade to DS 6.9 SP1 , the already running AClient is upgraded to the latest version (6.9.355).

DAgent has limited support in remote control mode (as described in the release notes) and some disconnects to the DS server are occuring when using the DAgent on an XP machine

Altiris : Shared Guid Diagnostics Guide (aka Duplicate Guid Kit)

Article ID: 3848


A Shared Altiris Agent Guid is a configuration problem that causes mismatched inventory data, and prevents accurate management and event-message storage of managed computers by the Altiris Notification Server. The Altiris Agent Guid is the primary mechanism by which the Altiris Notification Server uniquely identifies each resource record in the NS database. In this situation, we are concerned with computer resource records. There are several potential causes of shared guids. They all originate from circumvention of the normal agent deployment process, or external changes to the agent's configuration. The end result is that two or more managed computers each claim to be the sole owner of the Agent Guid (which is supposed to be globally unique).

Known causes

OS Imaging: By default, the Notification Server will generate a new Guid upon the first request from a brand new Altiris Agent. The Altiris Agent then stores its assigned Guid in the registry for Windows, and on the file-system for the Linux, Unix and Macintosh platforms. Shared Guids can be caused by imaging a workstation that already has an Altiris Agent installed. Each restored copy of the workstation will have the same assigned Guid. This issue exists in all imaging solutions, with the exception of Deployment Server (DS) version 6.5 or better. The best solution is to schedule the Altiris Agent to install immediately after restoring an image (This can be done as a DS job). An alternate solution is to always remember to delete the guid from the workstation prior to imaging (error prone).

Software Packaging: This cause is less likely to occur, but simple software repackaging tools will include the Altiris Agent's registry or file location of the guid as part of the software package. Activity by the Altiris Agent can fool the packaging tool into thinking that the Guid belongs to the package. Deploying the bad software package overwrites the good guid with the one from the capture station. To avoid this problem, don't install the Altiris Agent on the workstation used for snapshoting the original software installation job.


The purpose of this document is to demonstrate how to use the Notification Server’s shared GUID diagnostics kit to successfully identify and remove computers within the Notification Server database. The attached MS Word document contains screenshots for additional clarity (it is now considered out-of-date, and is merely provided for historical reference).


You can install the diagnostics kit by following the steps below. This utility contains several collections, a report, a package to remove the shared guids, and platform specific tasks. These items are all created in a Shared Guid Diagnostics v6.04 folder that is created by the import.

Note: Altiris NS Agent version 1508 or later is required for this to work.

  1. Download the xml file attached to this article and save it to a location on the Notification Server
  2. Find a location to install this utility. For this example we will create a folder called “Diagnostics” within the Tasks folder.
  3. Highlight the folder that you created. Right-click and choose Import.
  4. You will be prompted to choose the file to import. Choose the Shared Guid Diagnostics v6.05.xml file.
  5. Once the file has been imported into the Notification Server database, you should see the following structure:
  6. Enable each applicable Reset Guid Task. It's only neccessary to enable the task for platforms that exist in your environment.

Possible Duplicate Guids

  • These collections will query the Notification Server database for all computers that have reported a change in their GUID in the past seven days. Computers in this collection are used by the associated task to reset the Guid on the client computers.
    Note: After fixing shared GUIDs in the database, there is a possibility that some computers will still show up here. This collection is checking to see if the computer record has been changed in the last seven days, not if it has been fixed. To retrieve an accurate report, use the GUIDs Shared between 2 or more computers report or view the Machines that have run the Reset Guid Task collection.

Machines that have run the Reset Guid Task.

  • This collection will display any computers that have run a reset guid task, giving you a report of the machines that have completed the fix. Keep in mind that this report can not be 100% accurate due to the problem that is being addressed by the reset guid tasks.

GUIDs Shared between 2 or more computers.

  • Analyzes computers that have been sharing the same GUID, this is recognized when frequent name changes are occuring on a specific NS computer record. Once the duplicate GUID has been cleaned up, you will see the results in this report. This report doesn't distinguish by platform, and will also include un-managed computer records. By design, collections can not include unmanaged computers.

Reset Guid Tasks

  • These packages are responsible for running the appropriate task on the computers that are sharing the guid. On the Windows platform, it will use a built-in utility to strip out the Altiris Agent's guid from the registry. There are multiple places that the guid can be stored, depending upon if the DS Aclient is also present, and or older versions of the Altiris Agent have ever been used.
    • For the Windows platform, the following command is used: AeXAgentUtil.exe /resetguid
    • For Unix, Linux, and Macintosh computers, the file containing the guid is deleted, and the Altiris Agent is restarted as a background process. The agent restart is neccessary to flush the GUID from memory.
  • A new Guid is created by the Notification Server after the Altiris Agent sends the computer name and domain to the Notification Server. For each shared guid, one of the computers will retain ownership of the computer resource record, the remaining computers will be assigned new guids (and thus new NS computer resource records).

By default, when this package in imported, the owner of the folder and items will be null. The administrative role will have access to this utility, but if permissions are to be set, you should set the ownership by doing the following:

  1. Right-click on the main folder
  2. Choose Properties
  3. Choose the Security Tab
  4. Choose the Take Ownership button.

To completely remove the Duplicate Diagnostic utility from your system, you should follow the steps below. Delete the following objects through the NS console (right-click > Delete).
1. Reset Guid tasks (3).
2. Possible Shared Guid collections (3)
3. Machines that have run the Reset Guid task collection
4. Guids shared between 2 or more computers report
5. The Reset Guid Agent Package. (You must first delete each "program" by clicking the delete button on the Programs tab of the package).

Altiris : Adding Dell Latitude E6400 NIC driver to WinPe 2.1

Following drivers can be added to the WinPe 2.1 boot image, via boot disk creator, for proper operation

HP 6930p Nic

How would you call this .... ? interoperatibility ? It works !

Monday, 1 December 2008

How to Add Google Analytics to Your Blogger Blog

Grab Your Google Analytics Code Block

  1. Login to Google Analytics at http://google.com/analytics/. The main Settings page loads.
  2. Click on Add Website Profile. A form displays.
  3. Select Add a Profile for a New Domain.
  4. Enter the URL of your site or blog.
  5. Select your country and time zone. Click Finish.
  6. Analytics provides you with a code block - a swatch of HTML - to add to your site's pages.
  7. Highlight the code block and then copy it by selecting Edit > Copy or Ctrl-C or Command-C.

Add the Google Analytics Code Block to Your Blogger Blog

  1. Login to http://www.blogger.com/. The Dashboard loads.
  2. Under the blog you want to add Analytics tracking to, click on Layout or Template.
  3. Click on Edit HTML. An editing screen for your blog template's HTML displays. Don't freak out. Just scroll to the bottom.
  4. Look for the end of the template. It'll look like:

</div> </div>
<!-- end outer-wrapper -->
(Google Analytics Code Block is going to go here!!!)

  1. Put your cursor right before that </body> tag.
  2. Paste the Google Analytics Code Block by selecting Edit > Paste, Ctrl -V or Command-V.
  3. Click Save Changes.

You have now added the Google Analytics Code Block to Your Blogger Blog.

Check Your Work

  1. To ensure that you have successfully added the Google Analytics Code Block to your Blogger blog, go back to http://google.com/analytics/.
  2. Next to your blog's URL it will say either Receiving Data (you were successful) or Tracking Not Installed (something is amiss).
  3. If it said Tracking Not Installed, click on Check Status. Google then checks your blog for the Analytics Code Block and reports back if it find it or not.
  4. If not, try re-pasting the Code Block in.

Credits for this post go to Andy Wibbels http://andywibbels.com/

Altiris : TFTP is slow on download of boot disks or PE


TFTP takes 25 minutes to download, when it should be taking 2–3 minutes max.


Deployment Solution 6.8, 6.9


TFTP Logging under the PXE Configuration Utility is set to All.


For normal use, TFTP logs should be set to Off or On with Errors. If it is not, then TFTP will log all traffic including packet response times and acknowledgements. This will cause slowdowns on TFTP boot disk downloads and WinPE ISO downloads.

To check this, go to the PXE Configuration Utility under Tools > PXE Configuration. Click on the Data Logs tab and either unselect the PXE MTFTP Logs or move the level to errors. Click Save or OK and check your TFTP traffic.

Compressing the WinPe PXE boot image

The next way to speed up the TFTP download time of your PXE image is to reduce its size. This can be achieved by compressing it -a tip which came from Mike Gibson, an Altiris Consultant, at the UK Altiris Forum meeting last year. The KB article however suffers from a lack in background information which makes it very difficult to troubleshoot in the event that your image compression doesn't work. So, consider that follows as KB22971 on steriods... and my hope is that this extra information will provide you a better starting point that I had. ;-)

The procedure for compressing the ISO image in broad terms is as follows,

  1. Install the Windows Embedded development Tools. This will give us the capability of using SDI technology (System Deployment Image) to convert our WinPE ISO image to the SDI format. This format is a portable XP Embedded file format, and it natively supports NTFS compression. It is this compression feature which we will make use of to bring our WinPE download size down.
  2. Convert the ISO image to an SDI file using the script attached to this article called called MakeSDI.bat. This is a modified version of the one downloadable directly from the Altiris KB.

    Substitute the existing WinPE boot option ISO image with the SDI file on the PXE server, adjusting the boot files accordingly.

  3. Give the PXE server a kick to resync

Sounds easy huh? Hmm... Lets give it a go...

Install the Windows XP SP1 Embedded Tools from Microsoft

  1. Download the web installer here.
  2. Run the Web Install program (XPEDDI.exe) and deselect all the products in theGUI with the exception of the topmost item, the Windows XP Embedded SP1 tools, and click 'Download Now'.

    Click to view.

  3. Once the tools are downloaded, click 'OK' to exit (you may receive a warning that disk 2 of setup cannot be found. I clicked 'OK' here, and everything seemed to work fine!)
  4. On the Windows Embedded setup screen, select Tools Setup to start installing the XP Embedded Studio tools. This suite of tools include the SDI utilities needed to create our compressed WinPE virtual disk image.

    Click to view.

  5. Click through the InstallShield wizard, leaving the defaults as is. The product key you'll find located in the text file C:\Program Files\Windows Embedded\Installer\DISK1\productkey.txt.

Create your WinPE source folder

Copy the contents of your WinPE ISO image to c:\WinPESrc. To remind yourself where the ISO is, open up the PXE Configuration utility and take a look at the WinPE boot options properties. The location of the ISO image is declared in the 'Final Location on PXE Server' text box, and should look similar to..\PXE\Images\MenuOption131.

The WinPE files can be grabbed from this ISO image in several ways,

  • Burn the ISO image to a CD, and then copy the contents to the folder
  • Use a Virtual CD-ROM application like Deamon Tools or Microsoft's XPVirtual CDROM Control Panel Applet to mount the ISO image.
  • Use a vitualisation product like VMWare Player or Workstation to mount the ISO image as a virtual CDROM Drive (yes, its overkill but if you already have VMWare installed and use if for development then this might actually be the fastest way!)
  • Use a disk imaging suite which supports ISO images like WinImage to explore and copy the contents off the ISO image.

Download and Run MakeSDI.bat

Download MakeSDI.bat from this article. Don't use the Altiris KB article download as it has a bug in the defrag commands and mine allows for a slightly bigger SDI file of 102MB rather than 94MB (I found the 94MB default to be a touch too small for my WinPE image).

The purpose of the MakeSDI batch file is to copy our WinPE source files onto a virtual disk represented by our SDI file. The syntax of MakeSDI.bat is as follows,


On my system, the X:\ is unused so I'm going to run this as

MakeSDI.bat C:\WinPESrc C:\WinPE.SDI X:

This script is does not (sadly) completely automate the process of creating your SDI file. There are three stages,

  1. Create the target SDI file, WinPE.SDI

    When the script runs, it will first use the SDI tools to create your SDI image fileC:\WinPE.SDI. This process creates a virtual disk, and sets its size to 103MB.

  2. Load the SDI Image as a virtual disk

    After the SDI file is created, the script pauses. In order to copy files to the SDI virtual disk image, we have to mount the image using the SDI Loader application. This is a manual process, and after pressing any key, the application loads. Click 'Add Disk' to browse to C:\WinPE.SDI. Once selected, click 'Done' to finish.

    Click to view.

  3. Clean, partition and mount the SDI Image

    After loading the SDI image as a virtual disk, we need to execute the following commands in DiskPart when it loads,

    1. list disk

      In order to point DiskPart to the correct disk for our disk operations, we must select the correct disk to operate on. This command reveals the currently attached disks. Our disk is the one listed as being 102MB, and should have the highest index (as it was the most recent disk to be attached to the system).

    2. select disk #

      Where # is the disk index discovered in the previous step. In most cases, the SDI disk will be disk 1, with disk 0 being your actual system harddisk.

    3. clean

      After selecting our SDI disk, we should ensure its completely blank. The clean command ensures the selected disk's partition table is wiped and ready for our next operation.

    4. create partition primary

      This command is quite remarkable in its clarity - this will create a primary partition on the disk. By default it will occupy the entire virtual space (minus a small overhead for the MBR, hence why I create the disk image 1MB more than the partition I want to write to it).

    5. assign letter=X

      This command assigns our newly made partition the drive letter X. At this point you should be able to view it in My Computer as an unformatted RAW filesystem.

  4. Format and File Copy

    Once you've completed the DiskPart, the X:\ drive is formatted with the NTFS filesystem (compression enabled) and the WinPE files are copied across. Viewing the X:\ drive in explorer should show this drive letter now as blue -reflecting the fact its been formatted as a compressed NTFS drive.

  5. Detach Virtual Disk

    After the files are copied across, the Storage Device Image Loader will be called again, this time to allow you to detach the virtual disk. Select your SDI file in the window, and click 'Remove Disk'.

    Notice this file is 102MB - nearly 50MB smaller than the original ISO image.

Replacing the WinPE.iso PXE Image with WinPE.SDI

Now that your virtual disk has been detached, your SDI file is safe to copy over to the PXE server to be used in your WinPE boot option. This process is actually rather tricky as syncing the PXE server with your new image file isn't directly supported by the PXE Configuration Utility interface. This means some manipulation behind the scenes is required.

In order for the following manual changes to make sense, it's wise to spend another minute or two re-iterating what happens when images are built and edited.

  • First, the PXE Server stores the configuration for each PXE boot menu in aMaster folder called ..\PXE\MasterImages\MenuOption###, where ### is a MenuOption number.

  • When images are edited in the PXE Configurator, an equivalent folder with the.tmp extension is created as a temporary working area for the new master.

  • When you've finished your edits and the option is saved in the interface, the temporary MenuOption folder replaces the live version. That is to say, theMenuOption### folder in MasterImages is deleted, and theMenuOption###.tmp folder is renamed to MenuOption###. Once this is complete, this folder is synced down to the PXE Server's live distribution folder under ..\PXE\Images.

With the above in mind, the steps load up our new PXE MenuOption with our SDI file are as follows,

  1. Delete the WinPE ISO Image from the MasterImage\MenuOption### folder

    As we'll not be booting off the WinPE.iso anymore, lets remove it from the Master folder. This will prevent the PXE server sync process being delayed by the copying of a now unused 150MB ISO image each time the Image folder gets synced with the MasterImage folder.

    On my server, the WinPE ISO image was stored under..\PXE\MasterImage\MenuOption131 (as revealed by looking at the properties of the PXE Boot option in the PXE Configuration Utility). So, the ISO I need to delete is in here, within the x86PC subfolder. Double check your particular MenuOption index, and delete the corresponding WinPE.ISO in the MasterImage folder now.

  2. Copy WinPE.SDI to the MasterImage\MenuOption folder

    In the folder you've just deleted the ISO image from, copy over into it the WinPE.SDI file. This is the file we are going to be downloading by TFTP instead of that previous bulky occupant, the ISO image.

  3. Modify Winnt.sif

    Winnt.sif currently expects to boot the WinPE ISO image. We need to modify this now so that it will accept the SDI image instead.

    The default Winnt.sif will look like (remember, in what follows ### is yourMenuOption number),

    BootDevice = "ramdisk(0)"
    BootPath = "\i386\system32\"
    OsLoadOptions = "/noguiboot /fastdetect /minint /rdexportascd /rdpath=MenuOption###\X86PC\winpe.iso /PXE_SERVER:**PXE_NAME** /PXE_IP:**PXE_IP** /PXE_PATH:MenuOption###\X86PC"

    and to make this load the SDI file we need to ammend the OsLoadOptions line as follows,

    OsLoadOptions = "/noguiboot /fastdetect /minint /rdimageoffset=36352 /rdpath=MenuOption###\X86PC\winpe.sdi /PXE_SERVER:**PXE_NAME** /PXE_IP:**PXE_IP** /PXE_PATH:MenuOption###\X86PC"

  4. Resync the PXE Server

    This is where it gets tricky, as the syncing the master folder requires us to do a little fudging.

    1. Open up the PXE Configuration Utility

    2. Select the WinPE option, and click 'Edit'.

    3. In the Edit Shared Menu Option window, select the Image Creation Method of User Supplied, and click 'Manual Boot Image'

    4. In the PXE Boot Files box that pops up, browse to any small folder on your C:\ Drive which has some .exe files (I typically choose my DOS files folder) and click OK. This step gears puts the PXE configurator into the stage where it creates the .tmp Master folder. Don't worry about the fact you've just put some random small files in here -the in the next step we will delete them!

    5. Delete the ..\PXE\MasterImages\MenuOption###.tmp folder which was created by the last step. We'll be fooling the PXE Configuration Utility into using our own .tmp folder in the next step.

    6. Rename the ..\PXE\MasterImages\MenuOption### folder to..\PXE\MasterImages\MenuOption###.tmp folder. Remember, the .tmpfolder is a staging area for the PXE Configurator, and this now contains our SDI WinPE build

    7. Close the Edit Shared Menu Option window by clicking 'OK'. Our .tmpmaster folder is now moved to the last staging point in the PXE Server as a .wrk folder

    8. In the PXE Configuration Utility, click 'OK' and when prompted save your work. This process moves the .wrkfolder to the master folder, and resyncs with the files in the ..\PXE\Images\MenuOption### folder

And that's it - your PXE server should be loaded up with a nice new trip WinPE Image. Try downloading now, and you should see a further drop in the WinPE TFTP download time, of about one third.

Making your TFTP downloads, necessary for WinPE, faster

To increase the TFTP server block size do the following,

  1. Open up the PXE configuration utility
  2. Select the Multicast tab
  3. In the Packet Size text box, change the value from 768 to 1456

    Click to view.

  4. Click 'Save' to push these settings to the TFTP server
  5. Click 'OK' to exit the PXE configuration Utility

Try imaging with PXE now -your TFTP transfer time of the PXE image should now betwice as fast! Not bad for a minutes work at the console.

How To Add VMware Flexible NIC Driver For WinPE 2.1 x86/x64 Automation

By default, WinPE 2.1 x86/x64 supports the VMware NIC model e1000. When
possible, use this NIC model with your virtual machines. However, a
virtual machine created for Windows 2003 x86 Standard Edition can only
use the VMware Flexible NIC which is not supported by default.
To add VMware Flexible NIC support into the WinPE 2.1 x86/x64 automation
1.       On the Deployment Server, copy the VMware Tool ISO file from a
VMware ESX Server at /vmimages/tools-isoimages/windows.iso or create a
physical CD-ROM.
2.       Mount or extract the VMware Tool for ESX Server ISO/CD-ROM.
3.       Run the PXE Configuration utility.
4.       Select WinPE Managed boot menu option and click Edit.
5.       Click Edit Boot Image. The Altiris Boot Disk Creator will run.
6.       At Step 9, click Edit.
7.       At Step 1, click Next.
8.       At Step 2, click Have Disk.
9.       Click Browse and browse to the VMware Tool for ESX Server
ISO/CD-ROM contents and its \Program Files\VMware\VMware
Tools\Drivers\vmxnet\win2k\32bit directory.
10.      Select the vmware-nic.inf file and click Open. If prompted that
driver is an unsupported class type, click Yes and click Ok.
11.      Repeat step 7 through 9 to select the x64 driver, vmxnet.inf,
from the VMware Tool for ESX Server ISO/CD-ROM contents and its \Program
Files\VMware\VMware Tools\Drivers\vmxnet\win2k\64bit directory.
12.      Continue with the Boot Disk Creator wizard to generate the
WinPE images.
13.      After the wizard completes, click Save.
12.      After the save completes, click OK. It will take several
minutes for the PXE server to replicate the PXE images.

Using WinPE 2.1 with VMWare virtual machines

You must use Intel E1000 network card emulation instead of AMD pcnet network card emulation. See http://juice.altiris.com/tip/2919/tweaking-vmware-work-winpe-2x-and-microsoft-vista for instructions.
Excerpts from the link:

The following works for VMware WorkStation 5.5 and 6.0 and VMware Server 1.0+. By make the following alterations, WinPE 2.x will work seamlessly with network drivers.

  1. Make sure VMware is not running. Stop any virtual machines running and close VMware.
  2. Browse to the Virtual machine files and open the .vmx file with your favorite text editor.
  3. Add the following to the <Path to VM> .vmx file:
    ethernet0.virtualDev = "e1000"

    This is right after the ethernet0.present = "TRUE".

  4. Save the changes.
  5. Start your virtual machine.

Virtual machines with installed operating systems such as Microsoft Windows Vista or Microsoft Windows XP might have an issue with the drivers after this change. Change the network drivers and point to c:\windows\system32 for the drivers. Or download the latest e1000(Intel) driver.

Client Agent Version Report Discrepancy

Article ID: 31475


Client Agent Version Report displays different client counts on the Level 0 and Level 1 sections of the report


Level 0 SQL query uses vItem view and Level 1 SQL query uses vComputer view.  vComputer filters out retired assets.


Change the Level 0 SQL query to query the vComputer view.  Replace all instances of vItem in the level 0 query with vComputer.

Tuesday, 23 September 2008

Speed up your deployment of Altiris NS Agents

In order to speed up the roll-out of NS Agents I use following method and vbs script

  • First of all create two collections : one with all major agents ( == the agents you want to install ) installed and one with not all major agents installed
  • Assign each of these collections to an Agent Configuration where the collection with not all major agents will request a config every 5 minutes and the other one with all major agents your default config request time
  • Create for every agent that you want to install a collection which gives you the resources without this agent installed
  • Create a VB script ( requires Altiris ADSK to work ) that will run every 5 minutes ( done with MS scheduling ) which will force a collection update of the previous defined collections


' Setup management objects


set collectionManagement = CreateObject("Altiris.ASDK.NS.CollectionManagement")

collectionManagement.TargetServer = "localhost"


' UpdateCollections


Rem Name: Pc's with all Major Agents installed ( SWD, Metering, Patch, CC, Aclient )

collectionManagement.UpdateCollections("{guid of your collection}")

Rem Name: Pc's with Not all Major Agents installed ( SWD, Metering, Patch, CC, Aclient )

collectionManagement.UpdateCollections("{guid of your collection}")

Rem Name: All Windows Computers without Software Update Agent

collectionManagement.UpdateCollections("{guid of your collection}")

Rem Name: Windows Computers with no Software Delivery Solution Agent

collectionManagement.UpdateCollections("{guid of your collection}")

Rem Name: All Windows Computers without Software Update Agent

collectionManagement.UpdateCollections("{guid of your collection}")

Rem Name: All Windows NT/2000/XP/2003/Vista/2008 Computers with no Altiris Agent installed

collectionManagement.UpdateCollections("{guid of your collection}")


Get your stopwatch ready and measure how fast your machines are equipped with all the right agents ...

If you find this post helpfull please leave a comment and don't forget to click on an AD ;-)



Tuesday, 12 August 2008

Need a little help managing Software License Compliance Suite


We have the CMS Level 1 and Software License Compliance Suite. The purpose of the SLC Suite was to enter software license purchase information into the NS dbase and have that license information check against the software information collected in the Inventory Solution. How do I configure the Software License Compliance Suite to simply allow me to enter software purchase info (software name, date purchased, quantity, etc.) and view a report that shows me my total number of purchased software licenses versus my total number of installed licenses for one or more software applications?

The Asset Control and Contract Management Solution Product Guide is CRAZY! What I need is someone’s Best Practices guide that lays out procedures for initial configuration, procedures for inputing new software purchase info, and relevant reports showing compliance status.

The following is the standard way in which I work with software contracts:

  1. Browse to the Resouces tab > Resources > Contact Types Software Licensing > Software Purchase and create a new software purchase. This is where you can enter the name, product description, quantity and license count.
  2. Once you have completed this, in the same tree view, browse to Software Licensing > Win32 License and create a new software (Win32) license.
    1. To add the software purchase created earlier, browse to the Software Purchases tab and add a rule to have it automatically add all software purchases created with the similar naming convention, or manually add the purchase under "Other Software Purchases."
    2. To match the discovered software (Inventory Solution) to the contract, browse to the Software Installs tab and under "Software License Search Rules" click "Add List." This wizard allows you to search and select the discovered software and attach the rule to the license.
    3. After you have applied all the changes, you can now browse back to the Summary tab (only available after you have created the license and applied changes) to view Installed vs. Purchased.

Adding Software License Types


If you would like to track other types of software licenses other than "Concurrent" or "Per Installed Node", you can add your own. For example "Per Processor" or "Enterprise".

After upgrading to Asset 6.5 from a previous version, the "Single" ownership style is missing

Article ID: 39506

After upgrading to Asset 6.5, the "Single" ownership style is missing from the Ownership Settings page under Configuration > Solutions Settings > CMDB Solution.


This can be caused if the Ownership Style in the previous version of Asset was set to either of the following:

  • Allow
  • Allow After Warning

Both of the above settings allow an Asset to be associated to multiple users. By default, the ownership style in Asset 6.1 and 6.2 is Allow After Warning. This setting is preserved during an upgrade and corresponds to the Multiple with Warning style in CMDB Solution 6.5, which is installed during an upgrade to Asset 6.

CMDB Solution 6.5 does not allow changing from any multiple ownership style back to single.


This behavior is working as designed.

As a workaround before the upgrade is started, set the ownership style to Single. In Asset 6.1 or 6.2:

  1. Open the Notification Server Console.
  2. Go to Configuration > Solutions Settings > Assets and Inventory > Asset Control > Asset Global Settings.
  3. Pick Single from the drop-down next to Allow Assets to have multiple owners.
  4. Click Apply.

Saturday, 17 May 2008

Deployment Server / Active Directory Synchronization

This guide will help you set up Deployment Server Computer Groups to automatically synchronize to your Active Directory Organizational Units.

First, you will need to verify that all the appropriate credentials are found in your Domain Accounts List. Go to Tools > Options > Domain Accounts. Click the Add button and fill out the information of the Domain Account for each of your Domains. This account should have permissions to query Active Directory to determine Organizational Unit membership. It is also the account used for joining computers to the Domain, so it should have permissions to do a Domain Join.

Click to view.

Second, you will need to have either the AClient or DAgent (for Vista) installed on all of your computers. AClient reports Organizational Unit membership to Deployment Server. If you are importing computers from a .csv or .xls file, make sure to include domain and Organizational Unit information in the import file.

Third, run the following SQL Query against your Deployment Server database.

  1. Copy everything between "--------Start Here--------" and "--------End Here--------"
    --------Start Here--------
    IF EXISTS (SELECT * FROM sysobjects WHERE name='ou2group' AND xtype='TR')
    DROP TRIGGER ou2group
    IF (UPDATE(msnet_domain_ou) OR UPDATE(msnet_dns_domain))
    DECLARE @Done bit
    DECLARE @Left int
    DECLARE @Right int
    DECLARE @GroupName varchar(64)
    DECLARE @DomainOu varchar(256)
    DECLARE @ParentID int
    DECLARE @GroupID int

    SELECT @Done = 0, @Left = 0, @Right = 0
    SELECT @GroupName = msnet_dns_domain, @DomainOU = msnet_domain_ou FROM INSERTED
    SELECT @ParentID = group_id FROM computer_group WHERE parent_id IS NULL AND name = @GroupName

    IF @ParentID IS NULL
    EXEC ins_group @GroupName, @ParentID
    SELECT @ParentID = group_id FROM computer_group WHERE parent_id IS NULL AND name = @GroupName

    WHILE @Done = 0
    SET @Left = @Right + 1
    SET @Right = CHARINDEX('/', @DomainOU, @Left)
    IF @Right = 0
    SET @Right = LEN(@DomainOU) + 1
    SET @Done = 1
    SET @GroupName = SUBSTRING(@DomainOU, @Left, @Right - @Left)
    SET @GroupID = NULL
    SELECT @GroupID = group_id FROM computer_group WHERE parent_id = @ParentID AND name = @GroupName
    IF @GroupID IS NULL
    EXEC ins_group @GroupName, @ParentID
    SELECT @ParentID = group_id FROM computer_group WHERE parent_id = @ParentID AND name = @GroupName
    SET @ParentID = @GroupID
    SELECT @GroupID = group_id FROM INSERTED
    IF((SELECT COUNT(1) FROM computer WHERE group_id = @GroupID) < 2)
    DELETE FROM computer_group WHERE group_id = @GroupID
    UPDATE computer SET group_id = @ParentID WHERE computer_id = (SELECT computer_id FROM INSERTED)
    --------End Here--------

  2. Open SQL Query Analyzer

    1. For SQL 2000, open Start > All Programs > Microsoft SQL Server>Query Analyzer

    2. For SQL 2005, open Start > All Programs > Microsoft SQL Server 2005>SQL Server Management Studio and click on the "New Query" button

  3. In the Database Drop-down, select your Deployment Server Database (default is eXpress)

  4. Paste the SQL Query that you copied in step 1 into the Query Window

  5. Press the F5 key to execute the query

  6. Check the status message to verify that the query has executed completely

You have just added a SQL Trigger that will be run every time a computer record is updated. When it is run, it will add the computer to a Computer Group that matches its Active Directory Organizational Unit membership. You might want to force your computers to update so that the membership is updated immediately. To force an update, open the Deployment Server Console and select View > Reset Client Connections. When the computers connect back to Deployment Server, you will see that they are automatically added to a Computer Group structure that matches your Active Directory Organizational Unit.

The SQL Trigger

I will now explain, step-by-step, what the SQL Trigger does.

  1. We declare all of the variables we will use. Here is a brief description of each.

    DECLARE @Done bit

    A true/false value that will be set to 1 (true) when all groups for the computer's Organizational Unit have been created

    DECLARE @Left int

    This is the character position where the current Organizational Unit we are looking at starts

    DECLARE @Right int

    This is the character position where the current Organizational Unit we are looking at ends

    DECLARE @GroupName varchar(64)

    This is the name of the Organizational Unit we are looking at

    DECLARE @DomainOU varchar(256)

    This is the entire Organizational Unit in the format Organizational Unit/Organizational Unit/Organizational Unit/...

    DECLARE @ParentID int

    This is the Computer Group number of the parent group of the computer or the Organizational Unit we are looking at

    DECLARE @GroupID int

    This is the Group number of the Organizational Unit we are looking at

  2. We determine if a Computer Group already exists for the Domain Name. If it does, we remember the group number.
    SELECT @GroupName = msnet_dns_domain, @DomainOU = msnet_domain_ou FROM INSERTED
    SELECT @ParentID = group_id FROM computer_group WHERE parent_id IS NULL AND name = @GroupName

  3. If the Domain Computer Group does not exist, we create one and remember the group number.
    IF @ParentID IS NULL
    EXEC ins_group @GroupName, @ParentID
    SELECT @ParentID = group_id FROM computer_group WHERE parent_id IS NULL AND name = @GroupName

  4. For each Organizational Unit listed in DomainOU, we check to see if a group already exists. If it does, we remember the group number, otherwise we create one and remember the group number.
    WHILE @Done = 0

    1. Find the next Organizational Unit Name and remember it as DomainOU
      SET @Left = @Right + 1
      SET @Right = CHARINDEX('/', @DomainOU, @Left)
      IF @Right = 0
      SET @Right = LEN(@DomainOU) + 1
      SET @Done = 1
      SET @GroupName = SUBSTRING(@DomainOU, @Left, @Right - @Left)

    2. Determine if the Computer Group already exists.
      SET @GroupID = NULL
      SELECT @GroupID = group_id FROM computer_group WHERE parent_id = @ParentID AND name = @GroupName

    3. If the group doesn't already exist, create one and remember the group ID.
      IF @GroupID IS NULL
      EXEC ins_group @GroupName, @ParentID
      SELECT @ParentID = group_id FROM computer_group WHERE parent_id = @ParentID AND name = @GroupName

    4. If the group does already exist, remember the group ID
      SET @ParentID = @GroupID

  5. After we have created the entire Organizational Unit structure in Deployment Server, we check to see if the computer was the last one in the group, if it was, remove the group.
    SELECT @GroupID = group_id FROM INSERTED
    IF((SELECT COUNT(1) FROM computer WHERE group_id = @GroupID) < 2)
    DELETE FROM computer_group WHERE group_id = @GroupID

  6. Last, it adds the computer to the correct Organizational Unit Group in Deployment Server.
    UPDATE computer SET group_id = @ParentID WHERE computer_id = (SELECT computer_id FROM INSERTED)

Thursday, 17 April 2008

Controlling automated Altiris Agent rollouts

Article ID: 25786

In large environments, it is often advantageous to be able to control how many resources will be targeted during the automated push install of the Altiris Agent. Additionally, old computer registrations, laptops that are off the network and other unavailable resources can add unnecessary load to this process. What is the best way to deal with these issues?


In order to provide for these functions, a custom collection must be created for the Push install to utilize. This collection should be built up using the following SQL statements (not all will be applicable to everyone).

#SELECT TOP x limits the total size of the collection
SELECT TOP x Guid FROM vResource  
#Unmanaged computers
WHERE IsManaged=0
AND ResourceTypeGuid LIKE ‘493435F7-3B17-4C4C-B07F-C23E7AB7781F’
#Agent push has not been attempted and failed in last 1 day (note that this can be altered to suit requirements)            
AND Guid NOT IN (SELECT DISTINCT TargetComputerGuid FROM Evt_Push_Agent_Install_Service                     
WHERE DATEDIFF(day,_eventTime, GETDATE()) < 1 AND CopyService LIKE ‘Failed%’)
#Specify Target Operating Systems eg XP
AND Guid IN (SELECT _ResourceGuid FROM Inv_AeX_AC_Identification WHERE [OS Name] LIKE ‘%XP%’)
#Select Target Active Directory Domain eg DOMAIN
AND Guid IN (SELECT _ResourceGuid FROM Inv_AeX_AC_Identification WHERE [Domain] = ‘DOMAIN’)
#Select target subnet eg 192.168
AND Guid IN (SELECT Guid FROM vComputer Where [IP Address] LIKE ‘192.168.%’)

Note: The Operating System, Domain, and Subnet could also be controlled through the use of constant parameters.
Should other criteria be required to control the push installation, these lines could be used as templates for those activities. It is recommended that information that is not held in the Inv_AeX_AC_Identification table not be used for this activity as the information filling these tables may not be available at the time of push.
Using this query as the basis of the automated agent push installation will allow a greater degree of flexibility in:

  • The maximum number of computers to be targeted during a single push task.
  • Temporarily remove non-responsive or stale computers from server activities.
  • Greater granularity of control over exactly what criteria computer resources must meet in order to receive the automated Altiris Agent push installation

Tuesday, 25 March 2008

How to keep computer history after a motherboard was replaced

Article ID: 24859
Deployment Solution 6.1 all buildsDeployment Solution 6.5 all builds
By changing motherboards the MAC address gets changed, and this will create a new entry in the eXpress database with new history. The old history will not be linked to thecomputer.
Right-click on the new computer. Go to Properties > General tab, and find the ID of the computer per example: ID 50002345; write it down. Find the old computer per example: ID 50002332 and write down the ID.
Delete the new computer from the DS console and don’t let it reconnect.
Open SQL Enterprise Manager and go to the eXpress database.
Once in the eXpress database, highlight Tables and find the NICS table in the right-hand side.
Right-click on the NICS table and open table > return all rows.
Find the ID of the old computer (ID 50002332) and then replace the old MAC address of this computer with the new MAC address of the new computer (ID 50002345) in the mac_addr column then delete the new computer ID from the NICS table.
Save the changes and close Enterprise Manager.
Turn the new computer on and double check that the history of the old MAC address is reflected on the computer with the new MAC.

VBscript to remove all traces of computers from DS Database

Article ID: 26082
Running the following VBScript will remove all traces of computers from the DS database:
Option Explicit ‘**** The script displays a list of computer_ids and the associated computer name and ‘ allows the user to enter the computer_id that it to be removed from the express ‘ database. All occurrences of the record are removed from the database ‘ADO Const conADOStateClosed = &H00000000 Const conADOStateOpen = &H00000001 Const adStateClosed = 0 Dim strErr dim cmdArgs ‘**************** Call the Delete Computer function ************************* DeleteComputer ‘Line 18 ‘******************************************************************************** ‘Function to capture error messages ‘******************************************************************************** Function GetErrorString(objErr, strContext) Dim strError strError = "An error has occurred. " If (strContext <> "") Then strError = strError & strContext & ". " If (objErr.description <> "") Then strError = strError & objErr.description Else strError = strError & "Error number " & objErr.number End If GetErrorString = strError objErr.Clear End Function ‘Line 40 ‘*********************************************************************************** ‘Function to insert parameter from command line (computer_id) into the query ‘ ‘********************************************************************************* Sub InsertIdValue(objConn, lComputer_Id) On Error Resume Next ‘wscript.echo "The computer_id value is " & lComputer_id Dim strSQL, strErr ‘wscript.echo "Ready to insert" & lComputer_Id & " into database" strSQL = "INSERT INTO ##DeleteComputer Values(" + CStr(lComputer_Id) + ")" objConn.Execute strSQL If (Err.number <> 0) Then strErr = GetErrorString(Err, "Failed to execute SQL to delete computer " & strComputer_Id) logMessage strErr, 1 End If End Sub ‘Line 62 ‘*************************************************************************************** ‘Function to delete the computer selected ‘ The first part of this is providing the data to make connection to the SQL database ‘******************************************************************************* Function DeleteComputer On Error Resume Next ‘Line 73 Dim objConn, objAdmin Dim strTableName, strSQL, strDBName, strDBMachine, strDBUserPW, strDBUser, strConnection Dim objRecSet, strTabs, strDelete, strTableNumber, strHostType, strDummy, strComputer_Id Dim objRs, objTest, strAllComputers, intCountObjects, intStringLength, objDiskRs, strComputerNumber Dim gstrServer, gstrDatabase, gstrUser, gstrPwd, objWShell, strRegLocation, strUseCmdLine, strIBTxt, strInstruct strHostType = right(wscript.fullname,11) strHostType = lcase(left(strHostType,7)) ‘Line 84 ‘**************Connection to the database**************** Set objConn = CreateObject("ADODB.Connection") objConn.Open strConnection if err.number <> 0 then LogError "Error - doing SQL connection as the current logged on user.", err.number, err.description strDBUser = inputbox("Please enter a SQL user -" & vbCRLF & "(sa will always work if you have the password)" & vbCRLF & "The password will be asked for in the next box.", "SQL logon", "Enter SQL user") strDBUserPw = inputbox("Please enter the SQL user password", "SQL password", "Enter SQL user password") Err.clear strConnection = strConnection & ";UID=" & strDBUser & ";PWD=" & strDBUserPw objConn.Open strConnection If err.number <> 0 then LogError "Error - doing SQL connection with new user and pw.", err.number, err.description strDBMachine = inputbox("Please enter the SQL server machine name", "SQL machine name", "Enter SQL machine name") strDBName = "express" Err.clear strConnection = "DRIVER={SQL Server};SERVER=" & strDBMachine & ";DATABASE=" &strDBName & ";UID=" & strDBUser & ";PWD=" & strDBUserPw ‘Line 103 objConn.Open strConnection If err.number <> 0 then LogError "Error - doing SQL connection with new machine name, db, user and pw.", err.number, err.description LogError left(strConnection, inStrRev(strconnection,"PW") - 1), err.number, err.description Wscript.echo "The connection to SQL was not created." & vbCRLF & vbCRLF & "The script will halt now. Please resolve the SQL connection error." ‘wscript.echo "DBName is " & strDBName wscript.quit ‘Line 111 Else LogError "SQL connection with SQL user name, password, machine and db name.", err.number, err.description End if else LogError "SQL connection with SQL user name and password.", err.number, err.description End If Else LogError "SQL connection as the current logged on user.", err.number, err.description End If objConn.CommandTimeout = 600 ‘Line 119 ‘******************Create a global temp table of ************** strSQL = "if isnull(object_id(’tempdb..##DeleteComputer’), 0)<>0 Delete From ##DeleteComputer " +_ "else CREATE TABLE ##DeleteComputer ([Computer_Id] [int] PRIMARY KEY NOT NULL)" objConn.Execute strSQL If (Err.number <> 0) Then strErr = GetErrorString(Err, "Failed to execute SQL to delete computer_Id " & strComputernumber) logMessage strErr, 1 End If On Error Goto 0 on Error Resume Next ‘Line 136 ‘********************************************************************************************************************* ‘ Display list of computers in Database ‘************************************************************************************* strSQL = "Select computer_id, [Name] from Computer" Set objRs = objConn.Execute(strSql) intCountObjects = 0 strInstruct = "If you do not want to delete any computers, enter 0 in the input box." + vbCrLF + vbCrLF + strInstruct strInstruct = "When the input box appears, enter the number." + vbCrLF + strInstruct strInstruct = "Record the Computer ID of the computer you wish to delete." + vbCrLF + strInstruct strInstruct = "Press to see the next set of 100 computers." + vbCrLF + strInstruct strInstruct = "A list containing the first 100 computers will appear." + vbCrLF + strInstruct wscript.echo strInstruct While Not objRs.EOF ‘Line 154 ‘********************** Display the computers in groups of 100 ******************* While (intCountObjects < strallcomputers =" strAllComputers" intcountobjects =" intCountObjects" intcountobjects =" 0" strallcomputers = " " strcomputernumber =" InputBox" objconn =" Nothing"> 0 Then ‘wscript.echo "Err = " + Err.Description ‘End If ‘************* Call the InsertIdValue function to insert value in the temp table *************** InsertIdValue objConn, strComputerNumber ‘****************** ‘Get table list with computer_id column******************* ‘Line 182 strSQL = "select DISTINCT name as TableName from sysobjects where xtype=’U’ and id in (select distinct id from syscolumns where name = ‘Computer_Id’)" Set objRecSet = objConn.Execute(strSQL) If (Err.number <> 0) Then strErr = GetErrorString(Err, "Failed to execute SQL to delete Computer " & strComputernumber) logMessage strErr, 1 End If strSQL = "" If (objRecSet.State <> adStateClosed) And (Not objRecSet.EOF) Then While (Not objRecSet.EOF) strTableName = objRecSet.Fields.Item(0).value ‘Join temp table with table to delete joint rows strSQL = "delete [" + strTableName + "] from ##DeleteComputer, [" + strTableName + "] where ##DeleteComputer.Computer_Id = [" + strTableName + "].Computer_Id" ‘Line 199 objConn.Execute strSQL If (Err.number <> 0) Then strErr = GetErrorString(Err, "Failed to execute SQL to delete Computer " & strComputernumber) logMessage strErr, 1 End If objRecSet.MoveNext() Wend wscript.echo "Finished Deleting Computer " & strComputernumber wscript.quit End If objRecSet.Close Set objRecSet = Nothing ‘Line 217 End Function ‘Completed - 11/12/2004 by Ken Spinder
You can also download the attached file; just remember to remove the ‘.txt’ at the end of the filename.

How to clean out old computers in Deployment Server database

Article ID: 24561
Here is a Script to delete all old computers manually. Within the Deployment Server 6.5 build > Tools > Options, check the box to clean out old computers by date range.There is a SQL script you can run in Query Analyzer that will clean out computers that have not reported inventory in 35 days. To use this script just open SQL Query Analyzer from the SQL Administrations tools. Select the eXpress Database then copy the following code into the Query Analyzer window and click run.
DELETE from computerWHERE datediff(dd,last_inventory,getdate())>35
Here is a sample Deployment Server job that can be scheduled in DS to run regularly (daily/monthly) that will automate this task. It is a server-side script and must be assigned to a client PC before it can run on the Deployment server. You can schedule it on any computer that will likely be on most of the time; using scheduling have it run once a month.Without modification it assumes SQL is on the same server as DS and that you are using SA with a blank password. It will delete any computer older than 30 days. It is self-explanatory how to change this behavior. Just look at the script (%DAYS%, %SQLSERVER%, %SQLUSER%, and %SQLPASS%).Steps to create this job:
Create a Run script event that runs in Windows. Here is the Script to use for this event:REM This will delete entries that are older than DAYS from the eXpress databaseSET DAYS=30SET SQLSERVER=localhostREM Use the following line for trusted authentication. Note that the script will run by default as LOCAL SYSTEM and may not have rights to the SQL server.REM osql -E -S %SQLSERVER% -d eXpress -Q "DELETE from computer WHERE datediff(dd,last_inventory,getdate())>%DAYS%" >> %WINDIR%\Temp\DS_Delete.log
REM Use the following lines for SQL authentication. You will need to supply an appropriate SQL username and password.SET SQLUSER=saSET SQLPASS=""osql -U %SQLUSER% -P %SQLPASS% -S %SQLSERVER% -d eXpress -Q "DELETE from computer WHERE datediff(dd,last_inventory,getdate())>%DAYS% " >> %WINDIR%\Temp\DS_Delete.log
NOTE: If Inventory is turned off then Last_Inventory will not be an effective or reliable way to target which computers need to be deleted. If Inventory collection is not enabled then the following query will be better to use in the previous scripts and or command lines:
DELETE FROM computer WHERE computer_id IN (select computer_id from sessions where datediff(dd, last_update, getdate()) > 35)

Thursday, 13 March 2008

Excluding/Controlling what Client MAC is reported to the DS Server

Many computers have multiple NICs, which can cause problems in Deployment Solution. For instance, a computer may only have one NIC connected, and Deployment Solution may report on the second NIC with no IP address, thus showing a missing IP address in the console. Clustered computers may have a single assigned MAC given to multiple computers, again causing problems within Deployment Solution if the incorrect MAC is tracked.Computers reporting multiple NICs may also encounter Deployment Server licensing issues when each NIC is assigned a separate license.
DS 5.x and 6.x all versions
Because DS tracks a computer based only on a single NIC/MAC address, sometimes human intervention is necessary to prevent conflicts or incorrect data.
A CustomData.ini file can be created to exclude NICs or MACs so that DS will only track the remaining NIC/MAC option. This file is created by duplicating the Dynamic.ini file, and renaming the duplicate to CustomData.ini. This can either be performed on the client computer directly, or on the server and then sent out with a job to the client computers.First, be sure there is a [Filters] section in this file. Since DS combines the contents of both the Dynamic.ini and CustomData.ini files, the CustomData.ini file does not need to have all the same information as the Dynamic.ini. However, for this exercise, at least the [Filters] section is required.In this section, a line may be modified (or created) with "FilteredAdapterNameList" to include custom/unique types of adapters which should be excluded or ignored by DS (such as dial-up adapters, or WiFi adapters). The line should look something like this: FilteredAdapterNameList=Dial-Up Adapter,VPN,PPP AdapterAlternatively, a "FilteredMACAddresses" line may be used to exclude certain the MAC addresses on adapters that may be otherwise legitimate. This would be the case for duplicate NICs, such as having two identical Intel NICs, where the above option would end up excluding both. This line is used to exclude specific MAC addresses, rather than a type of connection. This line should look something like this: FilteredMACAddresses=CCCCCCCCCCCC,FFFFFF000000,00038A000011Finally, for those who may need it, there is one other way to filter, and that is based on user. By default, we already exclude one user, but you may add others. The FilteredUserNames line looks like this (additional entries, as with the above options, should be seperated by commas): FilteredUsernames=SMSCliSvcAcct&,IWAM_