There are several ways to seed this facility's inventory - Machines, PCs, Applications, and their properties - into ShopDB. You can combine them: each source writes to the same set of importable CSVs, and a later run fills gaps without wiping data an earlier run captured.
Deploy Collect-ShopDB.ps1 to your existing endpoints in a
way of your choosing (logon script, scheduled task, remote execution,
or a manual run). It runs read-only, extracts each PC and any attached
eDNC/DNC machine, and extrapolates vendor, model, OS, network, and
installed-application details. Every run UPSERTs rows into the shared
CSV store below, so a site builds its inventory one PC at a time.
Export from an existing MES, CMDB, or asset spreadsheet into the same CSV schema and drop the files in the collection location.
Map a device or application export (for example from Microsoft Graph) onto the computers and applications CSVs, then place them alongside the script output.
Download Collect-ShopDB.ps1 and deploy it to your endpoints
(logon script, scheduled task, remote execution, or a manual run). The CSV
Collections Location you save below is baked into the script's
$NetworkStoreRoot variable, so every endpoint publishes into
the same store without editing PowerShell by hand.
Select one or more filled-in CSVs. They are ordered by dependency automatically, so you can pick the whole set at once. Preview first: it writes nothing and reports exactly what each file would create or update, plus any rows that need fixing. Nothing is imported until you press Commit, and the whole set is applied together - if any row has a problem, nothing is written.
An Azure device-group export lists device hostnames plus their Entra deviceId. The device displayName is matched to an existing PC by hostname (case-insensitive): a match updates that PC in place and stores its deviceId, object id, and category; a device with no matching hostname creates a new computer (assettype computer, status In Use). It carries no model, OS, location, or user data - enrich those later with the collector or a Thor import.
A Thor PC-inventory export is a wide, fixed-format dump. This maps the hostname, BIOS manufacturer, model, OS, logged-in user, last-reported and boot times, and location into ShopDB. Each host is matched to an existing PC by hostname (case-insensitive): a match updates that PC in place; a host with no matching hostname creates a new computer. Network details (MAC, switch, VLAN) and the machine relationship are not imported in this pass.
A WINC (Maximo-style) asset export adopts existing machines: it never creates an asset, only updates a machine that already exists, matched on its workstation number. It sets the machine's name, location, and business unit. Preview first - it writes nothing and reports what would change, which business units it would create (you must confirm), and any values it cannot resolve (which block the import). Every commit is journalled, so it can be undone from the list below.
Selected: {{ wincFile.name }}
{{ wincError }}
Imported: {{ wincReport.rowcount }} machine(s) updated. Undo it below if needed. {{ wincReport.rowcount }} row(s) in scope, but unresolved values block the import - nothing was written. Resolve them and preview again. Looks good: {{ wincReport.rowcount }} machine(s) would be updated. Review below, then Commit Import.
| In scope (existing machines matched) | {{ wincReport.summary.in_scope }} |
| Skipped (no existing machine) | {{ wincReport.summary.skipped_no_existing_machine }} |
| Ambiguous (skipped, not guessed) | {{ wincReport.summary.ambiguous_match }} |
These business units are referenced by the export but do not exist yet. Confirm they are correct - you can edit them later in Settings. Nothing is created until you acknowledge and commit.
These export values have no mapping yet, so the import will not touch the affected rows. An administrator must add an alias for each before this import can run.
Each committed WINC import can be undone. Undo reverses only cells this import set that have not been changed since, and removes only business units this import created.
| When | By | Rows | Status | |
|---|---|---|---|---|
| {{ b.createdat }} | {{ b.createdby || '-' }} | {{ b.rowcount }} | {{ b.status }} | undone |
{{ selectedFiles.length }} file(s) selected: {{ selectedFiles.map(f => f.name).join(', ') }}
{{ importError }}
{{ report.request_error }}
Imported: {{ report.total_created }} created, {{ report.total_updated }} updated. {{ report.problem_count }} problem(s) found - nothing was written. Fix the rows below and preview again. Looks good: {{ report.total_created }} would be created, {{ report.total_updated }} updated. Press Commit Import to apply.
| File | Table | Created | Updated | Reconciled | Warnings | Problems |
|---|---|---|---|---|---|---|
{{ f.filename }} |
{{ f.table }} | {{ f.created }} | {{ f.updated }} | {{ (f.reconciliations || []).length }} | {{ (f.warnings || []).length }} | {{ f.problems.length }} |
These names did not match exactly but were close enough to bind to an existing record. Confirm each is correct; if any is wrong, add the exact name to the matching CSV (or lower/raise the reconciliation threshold in Site settings) and preview again.
{{ r.filename }}
line {{ r.line }}, column
{{ r.column }}:
"{{ r.input }}" matched {{ r.matched }}
({{ r.table }}, {{ Math.round(r.score * 100) }}%)
Each row below imported, but something could not be completed - most often a PC's machine link. Nothing here blocks the import; fix what you can and re-import to complete the links.
{{ w.filename }}
line {{ w.line }}, column
{{ w.column }}:
{{ w.reason }} - {{ w.action }}
{{ p.filename }}
line {{ p.line }}, column
{{ p.column }}: {{ p.message }}
Skipped (not importable): {{ report.skipped.join(', ') }}
These import templates are generated from the live ShopDB schema. Each file has a header row plus a small worked example - commented rows you can uncomment and edit. The examples are internally consistent across every file (the same locations, vendors, and types are referenced), so you can download the full set, keep it as a starter workbook, and fill in your own assets right away. Import them in the order below - a table never references something that has not been loaded yet. Foreign keys accept the referenced row's name or its numeric id, and re-importing a file updates matching rows instead of duplicating them.
Loading...
{{ t.filename }}
{{ templatesError }}
A PC that drives a machine (a CMM PC, a DNC/eDNC host) is linked to that
machine so the two show up connected across ShopDB. You can build that
link two ways. The Asset Collector builds it automatically: the script
reads the four-digit workstation number from the PC it runs on, reports
it, and ShopDB matches that number to a machine's
assetnumber.
Or build it straight from the spreadsheet: put the machine's
assetnumber in the machineassetnumber column on
computers.csv, and the import creates the link for you.
Either way, load your machines first (so their
assetnumber values exist), then the PCs. A machine number
that does not match an existing machine - or one already driven by
another PC - is reported as a warning and skipped, not guessed, so
nothing links to the wrong asset. The PC still imports; fix the number
and re-import to complete the link.