Multiple Beacon installs across operating divisions each with different domain names, has anyone been successful in writing an adapter that could do corp unit assignment during inventory discovery?
‎Feb 17, 2020 08:13 PM
An approach with FlexNet Manager Suite On-premises to doing this would be to configure a business adapter that retrieves inventory device (aka "computer") record information from the Compliance database, maps the domain details to corporate units, and updates the corporate unit details on the source inventory device records.
With that said, I don't have an example of such an adapter to share sorry. However I do have a SQL script (below) which does a similar thing - it sets locations on records rather than corporate units, but it would be straightforward to change which property is set if you are familiar with working with the database schema.
NB. The fact I'm sharing a SQL script to do this doesn't mean this is the best way to do it. Directly manipulating SQL data like this in the Compliance database is not a great practice (e.g. there is no guarantee that the script will continue to work across different or future FlexNet Manager Suite releases). However I'm sharing this because it is the only sample I have doing a similar thing so hopefully it is of some help.
-- This script will move computer (inventory device) records to a location,
-- based on rules specified in the mapping populated into the
-- #CustomNameDomainToLocationMap table below.
--
-- This script is known to work with FlexNet Manager Suite 2018 R2.
IF OBJECT_ID('tempdb..#CustomNameDomainToLocationMap') IS NULL
BEGIN
-- The #CustomNameDomainToLocationMap table defines domain name and
-- computer name patterns that are mapped to specific locations. In the
-- case where a particular computer matches multiple mappings, the mapping
-- with the smallest priority value (= highest priority) is chosen.
CREATE TABLE #CustomNameDomainToLocationMap(
DomainPattern NVARCHAR(100) COLLATE DATABASE_DEFAULT NOT NULL
, NamePattern NVARCHAR(256) COLLATE DATABASE_DEFAULT NOT NULL
, LocationPath NVARCHAR(500) COLLATE DATABASE_DEFAULT NOT NULL
, Priority INT NOT NULL
)
INSERT #CustomNameDomainToLocationMap VALUES ('china.com', '%', 'Asia Pacific/China', 1)
INSERT #CustomNameDomainToLocationMap VALUES ('india.com', '%', 'Asia Pacific/India', 1)
INSERT #CustomNameDomainToLocationMap VALUES ('mexico.com', '%', 'Americas/Mexico', 1)
INSERT #CustomNameDomainToLocationMap VALUES ('manila.com', '%', 'Asia Pacific/Philippines/Manila', 1)
INSERT #CustomNameDomainToLocationMap VALUES ('%', 'mlb%', 'Asia Pacific/Australia/Melbourne', 2)
END
IF OBJECT_ID('tempdb..#Target') IS NOT NULL
DROP TABLE #Target
CREATE TABLE #Target(
TargetID INT
, TargetTypeID INT
, GroupExID VARCHAR(128) COLLATE DATABASE_DEFAULT
, GroupTypeID INT
)
BEGIN TRANSACTION
; WITH DesiredLocation AS (
SELECT TOP 1 WITH TIES
cc.ComplianceComputerID
, LocationID = ml.GroupExID
, ROW_NUMBER() OVER(PARTITION BY cc.ComplianceComputerID ORDER BY m.Priority) AS Ranking
FROM dbo.ComplianceComputerWithActiveInventory cc
LEFT OUTER JOIN dbo.ComplianceDomain cd ON cd.ComplianceDomainID = cc.ComplianceDomainID
INNER JOIN (
#CustomNameDomainToLocationMap m
INNER JOIN dbo.GroupEx ml ON ml.Path = m.LocationPath AND ml.GroupTypeID = 1 /* location */
) ON cc.ComputerName LIKE m.NamePattern AND ISNULL(cd.QualifiedName, '') LIKE m.DomainPattern
ORDER BY Ranking
)
UPDATE cc
SET LocationID = dl.LocationID
OUTPUT INSERTED.ComplianceComputerID, tt.TargetTypeID, INSERTED.LocationID, 1 /* location */ INTO #Target
FROM DesiredLocation dl
JOIN dbo.ComplianceComputer cc ON cc.ComplianceComputerID = dl.ComplianceComputerID AND ISNULL(cc.LocationID, '') != dl.LocationID
, dbo.TargetType tt
WHERE tt.TargetTypeName = 'ComplianceComputer'
PRINT N'Moved ' + CAST(@@ROWCOUNT AS nvarchar(255)) + N' ComplianceComputer records to a better location'
EXEC dbo.GroupExUpdateGroupMembershipBulk
DROP TABLE #Target
UPDATE a
SET LocationID = cc.LocationID
FROM dbo.Asset a
JOIN dbo.ComplianceComputerWithActiveInventory cc
ON cc.AssetID = a.AssetID
AND cc.LocationID != ISNULL(a.LocationID, '')
PRINT N'Synchronized location from ' + CAST(@@ROWCOUNT AS nvarchar(255)) + N' ComplianceComputer records to linked Asset records'
/*
NB. It is not necessarily to call GroupExUpdateGroupMembershipBulk here to
update group membership details for updated assets, since there is a
built-in "UpdateAssetGroupMembership" trigger that does that automatically.
There is no similar trigger for ComplianceComputer, which is why an explicit
call to GroupExUpdateGroupMembershipBulk is required above.
*/
COMMIT TRANSACTION
‎Apr 24, 2020 09:53 PM
I implemented something like this into an on Prem solution.
To implement this I had the following:
An mapping table where I map the domain and the corporate unit.
Something like:
xxx.yyy domain is xxx corp unit
zzz.yyy domain is zzz corp unit
Using following custom view
SELECT FNMP.dbo.ComplianceComputer.ComplianceDomainID, FNMP.dbo.ComplianceDomain.ComplianceDomainID AS Expr1, FNMP.dbo.ComplianceDomain.QualifiedName, dbo.cu_domain.Domain,
dbo.cu_domain.[Corporate Unit FNMS], FNMP.dbo.ComplianceComputer.ComputerName, FNMP.dbo.ComplianceComputer.AssetID, FNMP.dbo.ComplianceComputer.ComplianceComputerStatusID,
FNMP.dbo.CorporateUnit.GroupCN, FNMP.dbo.ComplianceComputer.BusinessUnitID
FROM dbo.cu_domain INNER JOIN
FNMP.dbo.ComplianceDomain INNER JOIN
FNMP.dbo.ComplianceComputer ON FNMP.dbo.ComplianceDomain.ComplianceDomainID = FNMP.dbo.ComplianceComputer.ComplianceDomainID ON
dbo.cu_domain.Domain = FNMP.dbo.ComplianceDomain.QualifiedName INNER JOIN
FNMP.dbo.CorporateUnit ON FNMP.dbo.ComplianceComputer.BusinessUnitID = FNMP.dbo.CorporateUnit.GroupExID
WHERE (FNMP.dbo.ComplianceComputer.AssetID IS NULL) AND (FNMP.dbo.ComplianceComputer.ComplianceComputerStatusID = 1 OR
FNMP.dbo.ComplianceComputer.ComplianceComputerStatusID = 2) AND (FNMP.dbo.ComplianceComputer.BusinessUnitID IS NULL
Cu_domain is the mapping table that I use, having the 2 column Domain, Corporate Unit FNMS
Using this I filter out the data that have an asset assigned and a corporate unit assigned, remaining inventory are subject of the mapping table
Now after I have this set of data, I write a custom business importer that contain
Corporate unit and Computer items, using only update on corporate unit.
You should also take note that this is working only if you don't have an asset linked with inventory, if you have the asset linked all modification regarding corporate unit and stuff should be taken into your CMDB source.
You should thread this as a work around and is not sure if in future FNMS release this will work.
‎Apr 30, 2020 06:04 AM