Initial commit: Organized PowerShell scripts for ShopDB asset collection
Structure: - asset-collection/: Local PC data collection scripts - remote-execution/: WinRM remote execution scripts - setup-utilities/: Configuration and testing utilities - registry-backup/: GE registry backup scripts - winrm-https/: WinRM HTTPS certificate setup - docs/: Complete documentation Each folder includes a README with detailed documentation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
335
docs/API_INTEGRATION.md
Normal file
335
docs/API_INTEGRATION.md
Normal file
@@ -0,0 +1,335 @@
|
||||
# API Integration Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The PowerShell scripts integrate with a centralized Dashboard API to store comprehensive asset data in a MySQL database. This document details the API communication protocols, data structures, and integration patterns.
|
||||
|
||||
## Dashboard API Architecture
|
||||
|
||||
### Base URL Structure
|
||||
```
|
||||
Primary: http://10.48.130.197/dashboard-v2/api.php
|
||||
Fallback: http://localhost/dashboard-v2/api.php
|
||||
Test: http://10.48.130.197/test/dashboard/api.php
|
||||
```
|
||||
|
||||
### Auto-Discovery Mechanism
|
||||
```powershell
|
||||
function Get-DashboardURL {
|
||||
# Priority order:
|
||||
# 1. Command-line parameter
|
||||
# 2. Environment variable (ASSET_DASHBOARD_URL)
|
||||
# 3. Configuration file (dashboard-config.json)
|
||||
# 4. Auto-discovery probe
|
||||
# 5. Default fallback
|
||||
}
|
||||
```
|
||||
|
||||
## API Endpoint: `updateCompleteAsset`
|
||||
|
||||
### Request Structure
|
||||
```http
|
||||
POST /dashboard-v2/api.php HTTP/1.1
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
action=updateCompleteAsset&hostname=H123EXAMPLE&serialNumber=ABC123&...
|
||||
```
|
||||
|
||||
### Complete Payload Structure
|
||||
|
||||
#### Core System Information
|
||||
```powershell
|
||||
$postData = @{
|
||||
action = 'updateCompleteAsset'
|
||||
|
||||
# Basic System Identification
|
||||
hostname = $SystemInfo.Hostname # String: Computer name
|
||||
serialNumber = $SystemInfo.SerialNumber # String: Hardware serial
|
||||
serviceTag = $SystemInfo.ServiceTag # String: Dell service tag
|
||||
manufacturer = $SystemInfo.Manufacturer # String: Dell, HP, etc.
|
||||
model = $SystemInfo.Model # String: OptiPlex 7070, etc.
|
||||
|
||||
# System Classification & Context
|
||||
pcType = $SystemInfo.PCType # String: Engineer|Shopfloor|Standard
|
||||
loggedInUser = $SystemInfo.LoggedInUser # String: Current user
|
||||
machineNo = $SystemInfo.MachineNo # String: M123 (GE machine number)
|
||||
|
||||
# Technical Specifications
|
||||
osVersion = $SystemInfo.OSVersion # String: Windows 10, etc.
|
||||
totalPhysicalMemory = $SystemInfo.TotalPhysicalMemory # Decimal: GB
|
||||
domainRole = $SystemInfo.DomainRole # Integer: Domain membership
|
||||
currentTimeZone = $SystemInfo.CurrentTimeZone # String: Timezone ID
|
||||
lastBootUpTime = $SystemInfo.LastBootUpTime # DateTime: Last boot
|
||||
}
|
||||
```
|
||||
|
||||
#### Manufacturing-Specific Data (Shopfloor PCs Only)
|
||||
```powershell
|
||||
# Network Interface Data (JSON Array)
|
||||
$postData.networkInterfaces = [
|
||||
{
|
||||
"InterfaceName": "Ethernet 2",
|
||||
"IPAddress": "192.168.1.100",
|
||||
"SubnetMask": 24,
|
||||
"DefaultGateway": "192.168.1.1",
|
||||
"MACAddress": "00-15-5D-A2-33-4F",
|
||||
"IsDHCP": 0,
|
||||
"IsActive": 1,
|
||||
"IsMachineNetwork": 1
|
||||
}
|
||||
] | ConvertTo-Json -Compress
|
||||
|
||||
# Communication Configuration Data (JSON Array)
|
||||
$postData.commConfigs = [
|
||||
{
|
||||
"PortName": "COM1",
|
||||
"BaudRate": 9600,
|
||||
"DataBits": 8,
|
||||
"Parity": "None",
|
||||
"StopBits": 1,
|
||||
"IsActive": 1
|
||||
}
|
||||
] | ConvertTo-Json -Compress
|
||||
|
||||
# DNC Configuration Data (JSON Object)
|
||||
$postData.dncConfig = {
|
||||
"Site": "WestJefferson",
|
||||
"CNC": "Fanuc 30",
|
||||
"NcIF": "EFOCAS",
|
||||
"MachineNo": "3109",
|
||||
"Debug": "ON",
|
||||
"HostType": "WILM"
|
||||
} | ConvertTo-Json -Compress
|
||||
```
|
||||
|
||||
#### GE Registry Architecture Data ⭐ **New in v3.0**
|
||||
```powershell
|
||||
# DualPath Communication Settings
|
||||
$postData.dncDualPathEnabled = $true # Boolean: DualPath enabled
|
||||
$postData.dncPath1Name = "Path1Primary" # String: Primary path name
|
||||
$postData.dncPath2Name = "Path2Secondary" # String: Secondary path name
|
||||
|
||||
# Registry Architecture Detection
|
||||
$postData.dncGeRegistry32Bit = $true # Boolean: Found in 32-bit registry
|
||||
$postData.dncGeRegistry64Bit = $false # Boolean: Found in 64-bit registry
|
||||
|
||||
# Additional Registry Metadata (JSON Object)
|
||||
$postData.dncGeRegistryNotes = {
|
||||
"32bit": {
|
||||
"BasePath": "HKLM:\\SOFTWARE\\GE Aircraft Engines",
|
||||
"SubKeys": "DNC, Enhanced DNC, MarkZebra, PPDCS",
|
||||
"Found": "2025-09-06 14:30:00"
|
||||
},
|
||||
"32bit-eFocas": {
|
||||
"DualPath": "YES",
|
||||
"Path1Name": "Path1Primary",
|
||||
"Path2Name": "Path2Secondary",
|
||||
"IpAddr": "192.168.1.1",
|
||||
"SocketNo": "8192"
|
||||
}
|
||||
} | ConvertTo-Json -Compress
|
||||
```
|
||||
|
||||
#### Warranty Information (Dell Systems Only)
|
||||
```powershell
|
||||
# Currently disabled but structure available
|
||||
$postData.warrantyEndDate = $WarrantyData.warrantyEndDate # Date: YYYY-MM-DD
|
||||
$postData.warrantyStatus = $WarrantyData.warrantyStatus # String: Active|Expired
|
||||
$postData.warrantyServiceLevel = $WarrantyData.serviceLevel # String: Service level
|
||||
$postData.warrantyDaysRemaining = $WarrantyData.daysRemaining # Integer: Days remaining
|
||||
```
|
||||
|
||||
## API Response Handling
|
||||
|
||||
### Success Response Structure
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"success": true,
|
||||
"message": "Complete asset data updated successfully",
|
||||
"pcid": 221,
|
||||
"hostname": "H123EXAMPLE",
|
||||
"operation": "complete_asset_update",
|
||||
"recordsAffected": 3,
|
||||
"pcType": "Shopfloor",
|
||||
"warrantyStatus": null,
|
||||
"machineNo": "M123",
|
||||
"timestamp": "2025-09-06 14:30:45",
|
||||
"debugMsg": "PCType=Shopfloor, DNC=YES, Net=YES"
|
||||
},
|
||||
"timestamp": "2025-09-06 14:30:45"
|
||||
}
|
||||
```
|
||||
|
||||
### Error Response Structure
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"error": "hostname and serial number are required",
|
||||
"timestamp": "2025-09-06 14:30:45"
|
||||
}
|
||||
```
|
||||
|
||||
### Response Processing Logic
|
||||
```powershell
|
||||
$response = Invoke-RestMethod -Uri $DashboardURL -Method Post -Body $postData -Headers $headers -TimeoutSec 30
|
||||
|
||||
if ($response.success) {
|
||||
Write-Host "[OK] Complete asset data stored in database!" -ForegroundColor Green
|
||||
$data = $response.data
|
||||
Write-Host " PCID: $($data.pcid)"
|
||||
Write-Host " Operation: $($data.operation)"
|
||||
Write-Host " Records affected: $($data.recordsAffected)"
|
||||
return $true
|
||||
} else {
|
||||
Write-Host "[FAIL] Dashboard could not store data: $($response.error)" -ForegroundColor Red
|
||||
return $false
|
||||
}
|
||||
```
|
||||
|
||||
## Database Schema Integration
|
||||
|
||||
### Primary Tables Updated
|
||||
|
||||
#### `pc` Table (Core System Information)
|
||||
```sql
|
||||
UPDATE pc SET
|
||||
hostname = ?, serialnumber = ?, modelnumberid = ?,
|
||||
pctypeid = ?, loggedinuser = ?, machinenumber = ?,
|
||||
operatingsystem = ?, warrantyenddate = ?, warrantystatus = ?,
|
||||
warrantyservicelevel = ?, warrantydaysremaining = ?,
|
||||
warrantylastchecked = IF(? IS NOT NULL, NOW(), warrantylastchecked),
|
||||
lastupdated = NOW()
|
||||
WHERE pcid = ?
|
||||
```
|
||||
|
||||
#### `pc_dnc_config` Table (Manufacturing Configuration) ⭐ **Enhanced in v3.0**
|
||||
```sql
|
||||
INSERT INTO pc_dnc_config (
|
||||
pcid, site, cnc, ncif, machinenumber, hosttype,
|
||||
ftphostprimary, ftphostsecondary, ftpaccount,
|
||||
debug, uploads, scanner, dripfeed, additionalsettings,
|
||||
dualpath_enabled, path1_name, path2_name, -- DualPath settings
|
||||
ge_registry_32bit, ge_registry_64bit, ge_registry_notes, -- Registry architecture
|
||||
lastupdated
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
|
||||
ON DUPLICATE KEY UPDATE ...
|
||||
```
|
||||
|
||||
#### `machines` Table (Auto-Population) ⭐ **New in v3.2**
|
||||
```sql
|
||||
-- Machine records created from PC data
|
||||
INSERT INTO machines (
|
||||
machinenumber, alias, machinetypeid, isactive,
|
||||
businessunitid, modelnumberid, printerid,
|
||||
ipaddress1, machinenotes
|
||||
)
|
||||
SELECT DISTINCT
|
||||
p.machinenumber,
|
||||
CONCAT('Machine ', p.machinenumber),
|
||||
1, 1, 1, 1, 1,
|
||||
ni.ipaddress,
|
||||
CONCAT('Auto-discovered | Connected PCs: ', GROUP_CONCAT(p.hostname))
|
||||
FROM pc p
|
||||
LEFT JOIN pc_network_interfaces ni ON p.pcid = ni.pcid
|
||||
WHERE p.machinenumber IS NOT NULL
|
||||
GROUP BY p.machinenumber;
|
||||
|
||||
-- PC-Machine relationship tracking
|
||||
INSERT INTO machine_pc_relationships (
|
||||
machine_id, pc_id, pc_hostname, pc_role, is_primary
|
||||
)
|
||||
SELECT
|
||||
m.machineid, p.pcid, p.hostname,
|
||||
CASE
|
||||
WHEN p.hostname LIKE '%HMI%' THEN 'hmi'
|
||||
WHEN p.hostname LIKE '%CONTROL%' THEN 'control'
|
||||
ELSE 'unknown'
|
||||
END,
|
||||
(p.lastupdated = MAX(p.lastupdated) OVER (PARTITION BY p.machinenumber))
|
||||
FROM machines m
|
||||
JOIN pc p ON m.machinenumber = p.machinenumber;
|
||||
```
|
||||
|
||||
## Connection Management
|
||||
|
||||
### URL Auto-Discovery Process
|
||||
```powershell
|
||||
# Test candidate URLs in priority order
|
||||
$candidates = @(
|
||||
"http://10.48.130.197/dashboard-v2/api.php", # Production primary
|
||||
"http://10.48.130.197/test/dashboard/api.php", # Test environment
|
||||
"http://localhost/dashboard-v2/api.php" # Local development
|
||||
)
|
||||
|
||||
foreach ($url in $candidates) {
|
||||
$testResponse = Invoke-RestMethod -Uri "$url?action=getDashboardData" -Method Get -TimeoutSec 5
|
||||
if ($testResponse.success) {
|
||||
return $url # First successful connection wins
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Error Handling & Retries
|
||||
```powershell
|
||||
# HTTP timeout and error handling
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri $DashboardURL -Method Post -Body $postData -Headers $headers -TimeoutSec 30
|
||||
}
|
||||
catch [System.Net.WebException] {
|
||||
Write-Host "[FAIL] Network error: $($_.Exception.Message)" -ForegroundColor Red
|
||||
return $false
|
||||
}
|
||||
catch {
|
||||
Write-Host "[FAIL] Unexpected error: $($_.Exception.Message)" -ForegroundColor Red
|
||||
return $false
|
||||
}
|
||||
```
|
||||
|
||||
## Data Validation & Integrity
|
||||
|
||||
### Required Fields Validation
|
||||
```powershell
|
||||
# API enforces required fields
|
||||
if (empty($hostname) || empty($serialnumber)) {
|
||||
$this->sendError('hostname and serial number are required');
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
### Data Type Conversion
|
||||
```powershell
|
||||
# Boolean conversion for registry flags
|
||||
$dncDualPathEnabled = isset($_POST['dncDualPathEnabled']) ?
|
||||
(($_POST['dncDualPathEnabled'] === 'true' || $_POST['dncDualPathEnabled'] === '1' ||
|
||||
$_POST['dncDualPathEnabled'] === 1 || $_POST['dncDualPathEnabled'] === true) ? 1 : 0) : null;
|
||||
```
|
||||
|
||||
### JSON Serialization
|
||||
```powershell
|
||||
# Complex objects serialized as JSON
|
||||
$postData.networkInterfaces = $ShopfloorInfo.NetworkInterfaces | ConvertTo-Json -Compress
|
||||
$postData.dncGeRegistryNotes = $geInfo.RegistryNotes | ConvertTo-Json -Compress
|
||||
```
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Payload Compression
|
||||
- JSON objects compressed with `-Compress` flag
|
||||
- Minimal redundant data transmission
|
||||
- Efficient HTTP POST encoding
|
||||
|
||||
### Connection Pooling
|
||||
- Reuses HTTP connections where possible
|
||||
- Configurable timeout values
|
||||
- Graceful connection cleanup
|
||||
|
||||
### Batch Processing Capability
|
||||
- Single API call handles complete asset profile
|
||||
- Atomic database transactions
|
||||
- Rollback capability on failures
|
||||
|
||||
---
|
||||
|
||||
**API Integration designed for reliable, efficient, and comprehensive asset data management in enterprise manufacturing environments.**
|
||||
364
docs/API_KEY_INTEGRATION.md
Normal file
364
docs/API_KEY_INTEGRATION.md
Normal file
@@ -0,0 +1,364 @@
|
||||
# API Key Integration Guide for PowerShell Scripts
|
||||
|
||||
## Overview
|
||||
This guide explains how to configure API key authentication in the PowerShell asset collection scripts when deploying to production environments.
|
||||
|
||||
---
|
||||
|
||||
## Configuration Methods
|
||||
|
||||
### Method 1: Environment Variable (Recommended)
|
||||
Set both the dashboard URL and API key as Windows environment variables:
|
||||
|
||||
```powershell
|
||||
# Set environment variables (run as Administrator)
|
||||
[Environment]::SetEnvironmentVariable("ASSET_DASHBOARD_URL", "http://10.48.130.158/dashboard-v2/api.php", "User")
|
||||
[Environment]::SetEnvironmentVariable("ASSET_API_KEY", "your-secret-api-key-here", "User")
|
||||
```
|
||||
|
||||
### Method 2: Configuration File
|
||||
Create a `dashboard-config.json` file in the script directory:
|
||||
|
||||
```json
|
||||
{
|
||||
"DashboardURL": "http://10.48.130.158/dashboard-v2/api.php",
|
||||
"ApiKey": "your-secret-api-key-here",
|
||||
"ProxyURL": "http://10.48.130.158/vendor-api-proxy.php"
|
||||
}
|
||||
```
|
||||
|
||||
### Method 3: Command Line Parameter
|
||||
Pass the API key when running the script:
|
||||
|
||||
```powershell
|
||||
.\Update-PC-CompleteAsset.ps1 -DashboardURL "http://10.48.130.158/dashboard-v2/api.php" -ApiKey "your-secret-api-key-here"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PowerShell Script Modifications
|
||||
|
||||
### 1. Add API Key Parameter
|
||||
Add to the param block in `Update-PC-CompleteAsset.ps1`:
|
||||
|
||||
```powershell
|
||||
param(
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$DashboardURL,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$ProxyURL,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$ApiKey, # New parameter for API key
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]$SkipWarranty = $false,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[switch]$TestConnections = $false
|
||||
)
|
||||
```
|
||||
|
||||
### 2. Create Get-ApiKey Function
|
||||
Add this function after the Get-DashboardURL function:
|
||||
|
||||
```powershell
|
||||
function Get-ApiKey {
|
||||
param([string]$ProvidedKey)
|
||||
|
||||
# Priority 1: Command line parameter
|
||||
if (-not [string]::IsNullOrEmpty($ProvidedKey)) {
|
||||
Write-Host " Using provided API key" -ForegroundColor Gray
|
||||
return $ProvidedKey
|
||||
}
|
||||
|
||||
# Priority 2: Environment variable
|
||||
$envKey = [Environment]::GetEnvironmentVariable("ASSET_API_KEY", "User")
|
||||
if (-not [string]::IsNullOrEmpty($envKey)) {
|
||||
Write-Host " Using API key from environment variable" -ForegroundColor Gray
|
||||
return $envKey
|
||||
}
|
||||
|
||||
# Priority 3: Config file
|
||||
$configPath = "$PSScriptRoot\dashboard-config.json"
|
||||
if (Test-Path $configPath) {
|
||||
try {
|
||||
$config = Get-Content $configPath | ConvertFrom-Json
|
||||
if ($config.ApiKey) {
|
||||
Write-Host " Using API key from config file" -ForegroundColor Gray
|
||||
return $config.ApiKey
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "Failed to read config file: $_"
|
||||
}
|
||||
}
|
||||
|
||||
# No API key found (okay for development)
|
||||
Write-Host " No API key configured (running without authentication)" -ForegroundColor Yellow
|
||||
return $null
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Update API Calls to Include Authentication
|
||||
|
||||
#### For GET Requests:
|
||||
```powershell
|
||||
# Original code
|
||||
$response = Invoke-RestMethod -Uri "$DashboardURL?action=getDashboardData" -Method Get -TimeoutSec 10
|
||||
|
||||
# Updated with API key
|
||||
$apiKey = Get-ApiKey -ProvidedKey $ApiKey
|
||||
$uri = "$DashboardURL?action=getDashboardData"
|
||||
if ($apiKey) {
|
||||
$uri += "&api_key=$apiKey"
|
||||
}
|
||||
$response = Invoke-RestMethod -Uri $uri -Method Get -TimeoutSec 10
|
||||
```
|
||||
|
||||
#### For POST Requests (Preferred Method):
|
||||
```powershell
|
||||
# Get API key
|
||||
$apiKey = Get-ApiKey -ProvidedKey $ApiKey
|
||||
|
||||
# Build headers
|
||||
$headers = @{
|
||||
'Content-Type' = 'application/x-www-form-urlencoded'
|
||||
}
|
||||
|
||||
# Add Authorization header if API key exists
|
||||
if ($apiKey) {
|
||||
$headers['Authorization'] = "Bearer $apiKey"
|
||||
}
|
||||
|
||||
# Make the request
|
||||
$response = Invoke-RestMethod -Uri $DashboardURL -Method Post -Body $postData -Headers $headers -TimeoutSec 30
|
||||
```
|
||||
|
||||
### 4. Update Send-ToDatabase Function
|
||||
Modify the Send-ToDatabase function to include authentication:
|
||||
|
||||
```powershell
|
||||
function Send-ToDatabase {
|
||||
param(
|
||||
[hashtable]$Data,
|
||||
[string]$DashboardURL,
|
||||
[string]$ApiKey # Add ApiKey parameter
|
||||
)
|
||||
|
||||
try {
|
||||
Write-Host "`n Sending complete asset data to database..." -ForegroundColor Cyan
|
||||
|
||||
# Create form data
|
||||
$postData = @{
|
||||
action = 'updatePCComplete'
|
||||
}
|
||||
|
||||
# Add all data fields
|
||||
foreach ($key in $Data.Keys) {
|
||||
if ($null -ne $Data[$key]) {
|
||||
$postData[$key] = $Data[$key]
|
||||
}
|
||||
}
|
||||
|
||||
# Build headers
|
||||
$headers = @{
|
||||
'Content-Type' = 'application/x-www-form-urlencoded'
|
||||
}
|
||||
|
||||
# Add API key authentication if provided
|
||||
if ($ApiKey) {
|
||||
$headers['Authorization'] = "Bearer $ApiKey"
|
||||
Write-Host " Using API key authentication" -ForegroundColor Gray
|
||||
}
|
||||
|
||||
$response = Invoke-RestMethod -Uri $DashboardURL -Method Post -Body $postData -Headers $headers -TimeoutSec 30
|
||||
|
||||
if ($response.success) {
|
||||
Write-Host " [OK] Complete asset data stored in database!" -ForegroundColor Green
|
||||
if ($response.message) {
|
||||
Write-Host " $($response.message)" -ForegroundColor Gray
|
||||
}
|
||||
return $true
|
||||
} else {
|
||||
Write-Warning "Database update failed: $($response.message)"
|
||||
return $false
|
||||
}
|
||||
} catch {
|
||||
Write-Error "Failed to send data to database: $_"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deployment Batch File Updates
|
||||
|
||||
Update `Deploy-To-Multiple-PCs-Enhanced.bat` to include API key:
|
||||
|
||||
```batch
|
||||
REM Configuration section
|
||||
set SOURCE_DIR=S:\DT\adata\script
|
||||
set TARGET_DIR=C:\Temp\AssetCollection
|
||||
set API_KEY=your-secret-api-key-here
|
||||
|
||||
REM Create config file on target PC
|
||||
echo Creating configuration file...
|
||||
(
|
||||
echo {
|
||||
echo "DashboardURL": "http://10.48.130.158/dashboard-v2/api.php",
|
||||
echo "ApiKey": "%API_KEY%",
|
||||
echo "ProxyURL": "http://10.48.130.158/vendor-api-proxy.php"
|
||||
echo }
|
||||
) > "\\!COMPUTER!\C$\Temp\AssetCollection\dashboard-config.json"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Best Practices
|
||||
|
||||
### 1. Never Hardcode API Keys
|
||||
- ❌ Don't put API keys directly in scripts
|
||||
- ✅ Use environment variables or config files
|
||||
- ✅ Add `dashboard-config.json` to `.gitignore`
|
||||
|
||||
### 2. Secure Storage on Client PCs
|
||||
```powershell
|
||||
# Set restrictive permissions on config file
|
||||
$configPath = "C:\Temp\AssetCollection\dashboard-config.json"
|
||||
$acl = Get-Acl $configPath
|
||||
$acl.SetAccessRuleProtection($true, $false)
|
||||
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators", "FullControl", "Allow")
|
||||
$systemRule = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM", "FullControl", "Allow")
|
||||
$acl.SetAccessRule($adminRule)
|
||||
$acl.SetAccessRule($systemRule)
|
||||
Set-Acl $configPath $acl
|
||||
```
|
||||
|
||||
### 3. Use HTTPS in Production
|
||||
When API key is configured, always use HTTPS:
|
||||
```powershell
|
||||
$DashboardURL = "https://your-server/dashboard-v2/api.php"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing API Key Authentication
|
||||
|
||||
### Test Script
|
||||
Create `Test-ApiAuth.ps1`:
|
||||
|
||||
```powershell
|
||||
param(
|
||||
[string]$DashboardURL = "http://10.48.130.158/dashboard-v2/api.php",
|
||||
[string]$ApiKey
|
||||
)
|
||||
|
||||
Write-Host "Testing API Authentication..." -ForegroundColor Cyan
|
||||
|
||||
# Test without API key
|
||||
Write-Host "`nTest 1: Without API key"
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri "$DashboardURL?action=health" -Method Get
|
||||
Write-Host " Result: Success (no auth required)" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host " Result: Failed - $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
# Test with API key in header
|
||||
if ($ApiKey) {
|
||||
Write-Host "`nTest 2: With API key (Bearer token)"
|
||||
$headers = @{
|
||||
'Authorization' = "Bearer $ApiKey"
|
||||
}
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri "$DashboardURL?action=health" -Method Get -Headers $headers
|
||||
Write-Host " Result: Success (authenticated)" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host " Result: Failed - $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
|
||||
# Test with API key in query
|
||||
if ($ApiKey) {
|
||||
Write-Host "`nTest 3: With API key (query parameter)"
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri "$DashboardURL?action=health&api_key=$ApiKey" -Method Get
|
||||
Write-Host " Result: Success (authenticated via query)" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host " Result: Failed - $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Environment-Specific Configuration
|
||||
|
||||
### Development Environment
|
||||
```json
|
||||
{
|
||||
"DashboardURL": "http://localhost/dashboard-v2/api.php",
|
||||
"ApiKey": "",
|
||||
"ProxyURL": "http://localhost/vendor-api-proxy.php"
|
||||
}
|
||||
```
|
||||
|
||||
### Production Environment
|
||||
```json
|
||||
{
|
||||
"DashboardURL": "https://asset-server.company.com/api.php",
|
||||
"ApiKey": "sk_live_a7b9c2d8e5f4g6h3i9j0k1l2m3n4o5p6q7r8s9t0",
|
||||
"ProxyURL": "https://asset-server.company.com/vendor-api-proxy.php"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **401 Unauthorized Error**
|
||||
- Verify API key is correct
|
||||
- Check if APP_ENV=production in .env
|
||||
- Ensure API_KEY is set in .env file
|
||||
|
||||
2. **API Key Not Being Sent**
|
||||
- Check if headers are properly constructed
|
||||
- Verify Authorization header format: `Bearer YOUR_KEY`
|
||||
- Try query parameter method as fallback
|
||||
|
||||
3. **Script Works Locally but Not on Remote PCs**
|
||||
- Ensure config file is deployed to target PCs
|
||||
- Check environment variables on target machines
|
||||
- Verify network connectivity to API server
|
||||
|
||||
### Debug Mode
|
||||
Add verbose output to troubleshoot:
|
||||
|
||||
```powershell
|
||||
# Enable verbose mode
|
||||
$VerbosePreference = "Continue"
|
||||
|
||||
# Add debug output
|
||||
Write-Verbose "API Key present: $($null -ne $ApiKey)"
|
||||
Write-Verbose "Dashboard URL: $DashboardURL"
|
||||
Write-Verbose "Headers: $($headers | ConvertTo-Json)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
When deploying to production:
|
||||
|
||||
1. **Generate secure API key**: `openssl rand -hex 32`
|
||||
2. **Set in .env file**: `API_KEY=your-generated-key`
|
||||
3. **Set environment to production**: `APP_ENV=production`
|
||||
4. **Configure PowerShell scripts** with one of the three methods above
|
||||
5. **Test authentication** before mass deployment
|
||||
6. **Use HTTPS** for all production API calls
|
||||
|
||||
The API key provides an additional layer of security for your asset management system, ensuring only authorized scripts and users can update the database.
|
||||
267
docs/DATA_COLLECTION_REFERENCE.md
Normal file
267
docs/DATA_COLLECTION_REFERENCE.md
Normal file
@@ -0,0 +1,267 @@
|
||||
# Data Collection Reference
|
||||
## Complete PowerShell Asset Management System Data Collection
|
||||
|
||||
This document provides a comprehensive reference of all data points collected by the PowerShell asset management system, organized by category and source.
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ Basic System Information
|
||||
|
||||
### Core System Data
|
||||
| Field | Source | Type | Description |
|
||||
|-------|--------|------|-------------|
|
||||
| `hostname` | `$env:COMPUTERNAME` | String | Computer name |
|
||||
| `serialnumber` | WMI `Win32_BIOS.SerialNumber` | String | System serial number |
|
||||
| `manufacturer` | WMI `Win32_ComputerSystem.Manufacturer` | String | System manufacturer (Dell, HP, etc.) |
|
||||
| `model` | WMI `Win32_ComputerSystem.Model` | String | System model number |
|
||||
| `operatingSystem` | WMI `Win32_OperatingSystem.Caption` | String | OS version and edition |
|
||||
| `osVersion` | WMI `Win32_OperatingSystem.Version` | String | OS build version |
|
||||
| `osArchitecture` | WMI `Win32_OperatingSystem.OSArchitecture` | String | System architecture (32-bit/64-bit) |
|
||||
| `totalMemoryGB` | WMI `Win32_PhysicalMemory` | Integer | Total RAM in GB |
|
||||
| `processor` | WMI `Win32_Processor.Name` | String | CPU model and specifications |
|
||||
| `lastBootUpTime` | WMI `Win32_OperatingSystem.LastBootUpTime` | DateTime | System last boot time |
|
||||
| `currentUser` | `$env:USERNAME` | String | Currently logged-in user |
|
||||
| `domain` | WMI `Win32_ComputerSystem.Domain` | String | Active Directory domain |
|
||||
|
||||
### Hardware Details
|
||||
| Field | Source | Type | Description |
|
||||
|-------|--------|------|-------------|
|
||||
| `biosVersion` | WMI `Win32_BIOS.SMBIOSBIOSVersion` | String | BIOS/UEFI version |
|
||||
| `biosDate` | WMI `Win32_BIOS.ReleaseDate` | DateTime | BIOS release date |
|
||||
| `systemType` | WMI `Win32_ComputerSystem.SystemType` | String | System type (desktop/laptop) |
|
||||
| `totalPhysicalMemory` | WMI `Win32_ComputerSystem.TotalPhysicalMemory` | Long | Total physical memory in bytes |
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Network Configuration
|
||||
|
||||
### Network Interface Data
|
||||
| Field | Source | Type | Description |
|
||||
|-------|--------|------|-------------|
|
||||
| `networkInterfaces` | WMI `Win32_NetworkAdapterConfiguration` | Array | All network interfaces with IP configuration |
|
||||
| `ipAddress` | Network interfaces | String | Primary IP address |
|
||||
| `subnetMask` | Network interfaces | String | Subnet mask |
|
||||
| `defaultGateway` | Network interfaces | String | Default gateway |
|
||||
| `macAddress` | Network interfaces | String | MAC address |
|
||||
| `dhcpEnabled` | Network interfaces | Boolean | DHCP enabled status |
|
||||
| `dnsServers` | Network interfaces | Array | DNS server list |
|
||||
|
||||
### Network Interface Details Per Adapter
|
||||
```powershell
|
||||
foreach ($interface in $networkInterfaces) {
|
||||
InterfaceDescription # Network adapter description
|
||||
IPAddress[] # Array of IP addresses
|
||||
IPSubnet[] # Array of subnet masks
|
||||
DefaultIPGateway[] # Array of gateways
|
||||
MACAddress # Physical address
|
||||
DHCPEnabled # DHCP status
|
||||
DNSServerSearchOrder[] # DNS servers
|
||||
IPEnabled # Interface enabled status
|
||||
InterfaceIndex # Interface index number
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏭 Manufacturing/Shopfloor Configuration
|
||||
|
||||
### DNC (Direct Numerical Control) System Data
|
||||
| Field | Source | Type | Description |
|
||||
|-------|--------|------|-------------|
|
||||
| `dncConfigFound` | Registry scan | Boolean | DNC configuration detected |
|
||||
| `dncDualPathEnabled` | eFocas registry | Boolean | DualPath communication enabled |
|
||||
| `dncGeRegistry32Bit` | Registry detection | Boolean | 32-bit GE registry found |
|
||||
| `dncGeRegistry64Bit` | Registry detection | Boolean | 64-bit GE registry found |
|
||||
|
||||
### GE Aircraft Engines Registry Analysis
|
||||
|
||||
#### Registry Architecture Detection
|
||||
```powershell
|
||||
# Dual registry path scanning
|
||||
$registryPaths = @{
|
||||
'32bit' = 'HKLM:\SOFTWARE\GE Aircraft Engines'
|
||||
'64bit' = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines'
|
||||
}
|
||||
```
|
||||
|
||||
#### DNC Service Configurations
|
||||
| Service | Registry Paths | Data Collected |
|
||||
|---------|----------------|----------------|
|
||||
| **Serial** | `DNC\Serial` | Serial communication settings |
|
||||
| **Mark** | `DNC\Mark` | Marking system configuration |
|
||||
| **PPDCS** | `DNC\PPDCS` | Production data collection |
|
||||
| **TQM9030** | `DNC\TQM9030` | Quality management system |
|
||||
| **TQMCaron** | `DNC\TQMCaron` | Caron quality system |
|
||||
| **eFocas** | `DNC\eFocas` | Machine monitoring system |
|
||||
| **General** | `DNC\General` | General DNC settings |
|
||||
|
||||
#### eFocas Configuration Details
|
||||
```powershell
|
||||
# eFocas registry values collected per path
|
||||
$efocasData = @{
|
||||
BasePath # Registry base path
|
||||
Path1Name # Primary communication path
|
||||
Path2Name # Secondary communication path
|
||||
DualPath # DualPath enabled ("YES"/"NO")
|
||||
[Additional registry values dynamically collected]
|
||||
}
|
||||
```
|
||||
|
||||
### DualPath Communication Configuration
|
||||
| Field | Source | Description |
|
||||
|-------|--------|-------------|
|
||||
| `DualPathEnabled` | eFocas `DualPath` registry value | Boolean indicating dual communication paths |
|
||||
| `Path1Name` | eFocas registry | Primary communication path identifier |
|
||||
| `Path2Name` | eFocas registry | Secondary communication path identifier |
|
||||
| `CommunicationMode` | Registry analysis | Communication mode configuration |
|
||||
|
||||
---
|
||||
|
||||
## 🔍 System Analysis & Intelligence
|
||||
|
||||
### Registry Architecture Analysis
|
||||
```powershell
|
||||
$geRegistryInfo = @{
|
||||
Registry32Bit = $false # Found in 32-bit registry
|
||||
Registry64Bit = $false # Found in 64-bit registry
|
||||
DualPathEnabled = $null # DualPath configuration
|
||||
ServiceConfigurations = @{} # Per-service registry data
|
||||
FoundPaths = @() # All discovered registry paths
|
||||
}
|
||||
```
|
||||
|
||||
### Manufacturing Intelligence Data
|
||||
| Category | Data Points | Purpose |
|
||||
|----------|------------|---------|
|
||||
| **Communication Paths** | DualPath detection, Path1/Path2 names | Network redundancy analysis |
|
||||
| **Service Architecture** | 32-bit vs 64-bit service locations | Compatibility and migration planning |
|
||||
| **System Integration** | DNC service configurations | Manufacturing system health |
|
||||
| **Quality Systems** | TQM9030, TQMCaron configurations | Quality control integration |
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ Database Integration
|
||||
|
||||
### Data Transmission Format
|
||||
```powershell
|
||||
# POST data structure sent to dashboard API
|
||||
$postData = @{
|
||||
# Basic system info
|
||||
hostname = $computerName
|
||||
serialnumber = $serialNumber
|
||||
manufacturer = $manufacturer
|
||||
# ... [all basic fields]
|
||||
|
||||
# Network configuration
|
||||
networkInterfaces = $networkData
|
||||
|
||||
# Manufacturing data
|
||||
dncConfigFound = $dncFound
|
||||
dncDualPathEnabled = $geInfo.DualPathEnabled
|
||||
dncGeRegistry32Bit = $geInfo.Registry32Bit
|
||||
dncGeRegistry64Bit = $geInfo.Registry64Bit
|
||||
|
||||
# Shopfloor configuration
|
||||
shopfloorConfig = $shopfloorData
|
||||
}
|
||||
```
|
||||
|
||||
### Database Tables Updated
|
||||
| Table | Primary Data | Key Fields |
|
||||
|-------|-------------|------------|
|
||||
| `PCs` | Basic system information | `hostname`, `serialnumber`, `manufacturer` |
|
||||
| `PC_Network_Interfaces` | Network configuration | `hostname`, `interface_name`, `ip_address` |
|
||||
| `PC_DNC_Config` | Manufacturing settings | `hostname`, `dualpath_enabled`, `registry_32bit` |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Data Collection Workflow
|
||||
|
||||
### 1. System Information Collection
|
||||
```powershell
|
||||
Get-ComputerInfo # Basic system data
|
||||
Get-WmiObject queries # Hardware details
|
||||
```
|
||||
|
||||
### 2. Network Interface Analysis
|
||||
```powershell
|
||||
Get-WmiObject Win32_NetworkAdapterConfiguration |
|
||||
Where-Object { $_.IPEnabled -eq $true }
|
||||
```
|
||||
|
||||
### 3. Manufacturing Configuration Detection
|
||||
```powershell
|
||||
Get-ShopfloorConfig # DNC and GE registry analysis
|
||||
Get-GERegistryInfo # Architecture and DualPath detection
|
||||
```
|
||||
|
||||
### 4. Data Aggregation & Transmission
|
||||
```powershell
|
||||
# Combine all data sources
|
||||
$postData = @{} + $systemInfo + $networkInfo + $manufacturingInfo
|
||||
|
||||
# Send to dashboard API
|
||||
Invoke-RestMethod -Uri $apiEndpoint -Method POST -Body $postData
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Collection Statistics
|
||||
|
||||
### Comprehensive Data Points
|
||||
- **Basic System**: ~15 core system fields
|
||||
- **Network Configuration**: ~8 fields per interface (multiple interfaces)
|
||||
- **Manufacturing/DNC**: ~10+ specialized manufacturing fields
|
||||
- **Registry Architecture**: Dual-path scanning (32-bit + 64-bit)
|
||||
- **Service-Specific**: 7 DNC services × multiple registry values each
|
||||
|
||||
### Total Data Points Collected
|
||||
- **Minimum**: ~40 fields for basic desktop PC
|
||||
- **Shopfloor PC**: ~60+ fields with full DNC configuration
|
||||
- **Manufacturing Workstation**: ~80+ fields with complete eFocas integration
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Use Cases & Applications
|
||||
|
||||
### IT Asset Management
|
||||
- Hardware inventory and lifecycle tracking
|
||||
- Software version and patch management
|
||||
- Network configuration documentation
|
||||
|
||||
### Manufacturing Operations
|
||||
- DNC system health monitoring
|
||||
- Dual communication path verification
|
||||
- Quality system integration status
|
||||
- Machine connectivity analysis
|
||||
|
||||
### Security & Compliance
|
||||
- Network configuration auditing
|
||||
- System architecture documentation
|
||||
- Access path verification
|
||||
|
||||
---
|
||||
|
||||
## 📝 Notes & Considerations
|
||||
|
||||
### Data Collection Scope
|
||||
- **Non-Intrusive**: Read-only system information collection
|
||||
- **Manufacturing-Aware**: Specialized shopfloor system detection
|
||||
- **Architecture-Intelligent**: Dual registry path scanning
|
||||
- **Network-Comprehensive**: Complete interface configuration
|
||||
|
||||
### Performance Characteristics
|
||||
- **Collection Time**: ~30-60 seconds per PC
|
||||
- **Network Impact**: Minimal (single API POST per PC)
|
||||
- **System Impact**: Read-only operations, no system changes
|
||||
|
||||
### Future Enhancements
|
||||
- Additional vendor registry detection (Siemens, Fanuc, etc.)
|
||||
- Extended quality system integration
|
||||
- Real-time monitoring capabilities
|
||||
- Advanced manufacturing analytics
|
||||
|
||||
---
|
||||
|
||||
*Last Updated: September 2025 | Version 3.2*
|
||||
*PowerShell Asset Management System - Complete Data Collection Reference*
|
||||
378
docs/DEPLOYMENT_GUIDE.md
Normal file
378
docs/DEPLOYMENT_GUIDE.md
Normal file
@@ -0,0 +1,378 @@
|
||||
# Deployment Guide
|
||||
|
||||
## Deployment Overview
|
||||
|
||||
The GE Manufacturing Asset Management Scripts support multiple deployment strategies for enterprise manufacturing environments, from single-PC execution to large-scale automated rollouts across hundreds of manufacturing systems.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### System Requirements
|
||||
- **Operating System**: Windows 10/11, Windows Server 2016+
|
||||
- **PowerShell**: Version 5.1 or later
|
||||
- **Execution Policy**: RemoteSigned or Unrestricted
|
||||
- **Network Access**: HTTP connectivity to dashboard API
|
||||
- **Permissions**: Administrator rights recommended
|
||||
|
||||
### Environment Preparation
|
||||
```powershell
|
||||
# Check PowerShell version
|
||||
$PSVersionTable.PSVersion
|
||||
|
||||
# Check execution policy
|
||||
Get-ExecutionPolicy
|
||||
|
||||
# Set execution policy (if needed)
|
||||
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
```
|
||||
|
||||
## Deployment Methods
|
||||
|
||||
### Method 1: Single PC Deployment
|
||||
|
||||
#### Quick Start (Recommended)
|
||||
```batch
|
||||
# 1. Initial setup (run once)
|
||||
00-RUN-ME-FIRST.bat
|
||||
|
||||
# 2. Execute data collection
|
||||
Update-PC-CompleteAsset.bat
|
||||
```
|
||||
|
||||
#### Manual PowerShell Execution
|
||||
```powershell
|
||||
# Navigate to script directory
|
||||
cd C:\Path\To\Scripts
|
||||
|
||||
# Unblock scripts (security)
|
||||
Unblock-File .\*.ps1
|
||||
|
||||
# Execute main script
|
||||
.\Update-PC-CompleteAsset.ps1
|
||||
```
|
||||
|
||||
#### Silent Execution (Scheduled Tasks)
|
||||
```batch
|
||||
# For automated/scheduled execution
|
||||
Update-PC-CompleteAsset-Silent.bat
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Method 2: Multiple PC Deployment
|
||||
|
||||
#### Computer List Configuration
|
||||
Edit `computers.txt` with target systems:
|
||||
```
|
||||
# Hostnames
|
||||
H123EXAMPLE
|
||||
G456MACHINE
|
||||
SHOPFLOOR-PC-01
|
||||
|
||||
# IP Addresses
|
||||
192.168.1.100
|
||||
192.168.1.101
|
||||
|
||||
# Fully Qualified Domain Names
|
||||
machine01.manufacturing.local
|
||||
cnc-cell-02.shop.local
|
||||
```
|
||||
|
||||
#### Enhanced Batch Deployment
|
||||
```batch
|
||||
# Execute on multiple systems
|
||||
Deploy-To-Multiple-PCs-Enhanced.bat
|
||||
```
|
||||
|
||||
**Features**:
|
||||
- Parallel execution for faster deployment
|
||||
- Individual system success/failure tracking
|
||||
- Comprehensive logging and reporting
|
||||
- Network connectivity pre-checks
|
||||
|
||||
#### PsExec Remote Deployment
|
||||
```batch
|
||||
# Enterprise remote execution
|
||||
Deploy-With-PsExec.bat
|
||||
```
|
||||
|
||||
**Requirements**:
|
||||
- PsExec.exe in system PATH or script directory
|
||||
- Administrative credentials for target systems
|
||||
- SMB/RPC connectivity to target machines
|
||||
|
||||
---
|
||||
|
||||
### Method 3: Enterprise Integration
|
||||
|
||||
#### Group Policy Deployment
|
||||
1. **Copy Scripts**: Place in network share accessible to all target computers
|
||||
2. **Create GPO**: New Group Policy Object for computer configuration
|
||||
3. **Add Startup Script**: Computer Configuration → Policies → Windows Settings → Scripts → Startup
|
||||
4. **Configure Path**: Point to network share location of `Update-PC-CompleteAsset.bat`
|
||||
5. **Apply to OUs**: Link GPO to appropriate Organizational Units
|
||||
|
||||
#### SCCM/ConfigMgr Integration
|
||||
```powershell
|
||||
# Package creation parameters
|
||||
Package Name: GE Manufacturing Asset Collection
|
||||
Program Command Line: Update-PC-CompleteAsset-Silent.bat
|
||||
Run Mode: Run with administrative rights
|
||||
Assignment: Required, recurring daily
|
||||
```
|
||||
|
||||
#### Tanium Integration
|
||||
```sql
|
||||
-- Tanium package deployment
|
||||
SELECT * FROM Packages WHERE Name LIKE '%Asset Collection%'
|
||||
|
||||
-- Deploy to manufacturing systems
|
||||
DEPLOY Package="GE Asset Collection" TO ComputerGroup="Manufacturing Floor"
|
||||
```
|
||||
|
||||
## Configuration Management
|
||||
|
||||
### Dashboard URL Configuration
|
||||
|
||||
#### Method 1: Environment Variable
|
||||
```powershell
|
||||
# Set user environment variable
|
||||
[Environment]::SetEnvironmentVariable("ASSET_DASHBOARD_URL", "http://your-server/api.php", "User")
|
||||
|
||||
# Set system environment variable (requires admin)
|
||||
[Environment]::SetEnvironmentVariable("ASSET_DASHBOARD_URL", "http://your-server/api.php", "Machine")
|
||||
```
|
||||
|
||||
#### Method 2: Configuration File
|
||||
Create `dashboard-config.json`:
|
||||
```json
|
||||
{
|
||||
"DashboardURL": "http://your-server/dashboard-v2/api.php",
|
||||
"Description": "Production Dashboard API Endpoint",
|
||||
"LastUpdated": "2025-09-06"
|
||||
}
|
||||
```
|
||||
|
||||
#### Method 3: Command Line Parameter
|
||||
```powershell
|
||||
.\Update-PC-CompleteAsset.ps1 -DashboardURL "http://your-server/api.php"
|
||||
```
|
||||
|
||||
### Advanced Configuration Options
|
||||
|
||||
#### Skip Warranty Lookups (Default)
|
||||
```powershell
|
||||
.\Update-PC-CompleteAsset.ps1 -SkipWarranty
|
||||
```
|
||||
|
||||
#### Test Connections Only
|
||||
```powershell
|
||||
.\Update-PC-CompleteAsset.ps1 -TestConnections
|
||||
```
|
||||
|
||||
#### Custom Proxy Server
|
||||
```powershell
|
||||
.\Update-PC-CompleteAsset.ps1 -ProxyURL "http://your-proxy/vendor-api-proxy.php"
|
||||
```
|
||||
|
||||
## Scheduling and Automation
|
||||
|
||||
### Windows Task Scheduler
|
||||
|
||||
#### Create Scheduled Task
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-16"?>
|
||||
<Task xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
||||
<Triggers>
|
||||
<CalendarTrigger>
|
||||
<StartBoundary>2025-01-01T06:00:00</StartBoundary>
|
||||
<ScheduleByDay>
|
||||
<DaysInterval>1</DaysInterval>
|
||||
</ScheduleByDay>
|
||||
</CalendarTrigger>
|
||||
</Triggers>
|
||||
<Principals>
|
||||
<Principal>
|
||||
<RunLevel>HighestAvailable</RunLevel>
|
||||
</Principal>
|
||||
</Principals>
|
||||
<Settings>
|
||||
<MultipleInstancesPolicy>StopExisting</MultipleInstancesPolicy>
|
||||
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
||||
</Settings>
|
||||
<Actions>
|
||||
<Exec>
|
||||
<Command>C:\Scripts\Update-PC-CompleteAsset-Silent.bat</Command>
|
||||
<WorkingDirectory>C:\Scripts</WorkingDirectory>
|
||||
</Exec>
|
||||
</Actions>
|
||||
</Task>
|
||||
```
|
||||
|
||||
#### PowerShell Scheduled Task Creation
|
||||
```powershell
|
||||
$action = New-ScheduledTaskAction -Execute "C:\Scripts\Update-PC-CompleteAsset-Silent.bat" -WorkingDirectory "C:\Scripts"
|
||||
$trigger = New-ScheduledTaskTrigger -Daily -At 6:00AM
|
||||
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest
|
||||
$settings = New-ScheduledTaskSettingsSet -MultipleInstances StopExisting
|
||||
|
||||
Register-ScheduledTask -TaskName "GE Asset Collection" -Action $action -Trigger $trigger -Principal $principal -Settings $settings
|
||||
```
|
||||
|
||||
### Startup Script Integration
|
||||
```batch
|
||||
REM Add to computer startup scripts
|
||||
REM Computer Configuration → Policies → Windows Settings → Scripts → Startup
|
||||
|
||||
@echo off
|
||||
timeout 60 >nul 2>&1
|
||||
cd /d "\\server\share\AssetScripts"
|
||||
call Update-PC-CompleteAsset-Silent.bat
|
||||
```
|
||||
|
||||
## Network Considerations
|
||||
|
||||
### Firewall Configuration
|
||||
```powershell
|
||||
# Required outbound ports
|
||||
HTTP: TCP 80 (Dashboard API communication)
|
||||
HTTPS: TCP 443 (Secure dashboard API communication)
|
||||
DNS: UDP 53 (Name resolution)
|
||||
|
||||
# Windows Firewall rule creation
|
||||
New-NetFirewallRule -DisplayName "Asset Collection HTTP" -Direction Outbound -Protocol TCP -LocalPort 80 -Action Allow
|
||||
New-NetFirewallRule -DisplayName "Asset Collection HTTPS" -Direction Outbound -Protocol TCP -LocalPort 443 -Action Allow
|
||||
```
|
||||
|
||||
### Proxy Server Configuration
|
||||
If corporate proxy required:
|
||||
```powershell
|
||||
# System proxy configuration
|
||||
netsh winhttp set proxy proxy.corporate.com:8080
|
||||
|
||||
# PowerShell proxy configuration
|
||||
$proxy = New-Object System.Net.WebProxy("http://proxy.corporate.com:8080")
|
||||
[System.Net.WebRequest]::DefaultWebProxy = $proxy
|
||||
```
|
||||
|
||||
## Monitoring and Logging
|
||||
|
||||
### Execution Logging
|
||||
Scripts provide comprehensive console output with color-coded status:
|
||||
- 🟢 **Green**: Successful operations
|
||||
- 🟡 **Yellow**: Warnings and informational messages
|
||||
- 🔴 **Red**: Errors and failures
|
||||
- ⚫ **Gray**: Detailed debugging information
|
||||
|
||||
### Log File Creation
|
||||
```powershell
|
||||
# Redirect output to log file
|
||||
.\Update-PC-CompleteAsset.ps1 | Tee-Object -FilePath "C:\Logs\AssetCollection-$(Get-Date -Format 'yyyyMMdd-HHmmss').log"
|
||||
```
|
||||
|
||||
### Centralized Monitoring
|
||||
Dashboard provides centralized view of:
|
||||
- Asset collection success/failure rates
|
||||
- Last update timestamps per system
|
||||
- Missing or outdated inventory data
|
||||
- Manufacturing configuration changes
|
||||
|
||||
## Troubleshooting Deployment Issues
|
||||
|
||||
### Common Issues and Solutions
|
||||
|
||||
#### PowerShell Execution Policy
|
||||
```powershell
|
||||
# Error: Execution of scripts is disabled on this system
|
||||
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
|
||||
# Verify change
|
||||
Get-ExecutionPolicy -List
|
||||
```
|
||||
|
||||
#### Network Connectivity
|
||||
```powershell
|
||||
# Test dashboard connectivity
|
||||
Test-NetConnection -ComputerName "10.48.130.197" -Port 80
|
||||
|
||||
# Test name resolution
|
||||
Resolve-DnsName "dashboard.manufacturing.local"
|
||||
|
||||
# Manual connection test
|
||||
Update-PC-CompleteAsset.ps1 -TestConnections
|
||||
```
|
||||
|
||||
#### Permission Issues
|
||||
```powershell
|
||||
# Check current user permissions
|
||||
whoami /priv
|
||||
|
||||
# Run as administrator
|
||||
Right-click → "Run as administrator"
|
||||
|
||||
# Service account configuration
|
||||
# Configure service account with:
|
||||
# - Log on as a service right
|
||||
# - Local administrator membership
|
||||
# - Network access permissions
|
||||
```
|
||||
|
||||
#### Registry Access Issues
|
||||
```powershell
|
||||
# Check registry permissions
|
||||
# HKLM:\SOFTWARE\GE Aircraft Engines (Read access required)
|
||||
# HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines (Read access required)
|
||||
|
||||
# Error: Access denied reading registry
|
||||
# Solution: Run with administrator privileges or adjust registry permissions
|
||||
```
|
||||
|
||||
### Deployment Validation
|
||||
|
||||
#### Success Verification
|
||||
```powershell
|
||||
# Check dashboard API for recent data
|
||||
Invoke-RestMethod -Uri "http://dashboard/api.php?action=getDashboardData" -Method Get
|
||||
|
||||
# Verify database entries
|
||||
# Check pc table for recent lastupdated timestamps
|
||||
# Check pc_dnc_config table for manufacturing data
|
||||
```
|
||||
|
||||
#### Performance Monitoring
|
||||
```powershell
|
||||
# Measure execution time
|
||||
Measure-Command { .\Update-PC-CompleteAsset.ps1 }
|
||||
|
||||
# Typical execution times:
|
||||
# Standard PC: 15-30 seconds
|
||||
# Shopfloor PC: 45-90 seconds
|
||||
# Engineer PC: 20-40 seconds
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Deployment Staging
|
||||
1. **Pilot Group**: Deploy to 5-10 test systems first
|
||||
2. **Validation**: Verify data collection and dashboard integration
|
||||
3. **Gradual Rollout**: Deploy to 25% of systems, monitor, then expand
|
||||
4. **Full Deployment**: Complete rollout after successful validation
|
||||
|
||||
### Maintenance Windows
|
||||
- **Manufacturing Systems**: Deploy during scheduled maintenance windows
|
||||
- **Engineering Systems**: Deploy during off-hours or lunch breaks
|
||||
- **Standard Systems**: Deploy during normal business hours
|
||||
|
||||
### Change Management
|
||||
- **Documentation**: Maintain deployment logs and configuration changes
|
||||
- **Version Control**: Track script versions and configuration updates
|
||||
- **Rollback Planning**: Prepare rollback procedures for problematic deployments
|
||||
|
||||
### Security Considerations
|
||||
- **Script Integrity**: Use digital signatures for script validation
|
||||
- **Network Security**: Encrypt API communications where possible
|
||||
- **Access Control**: Limit script modification to authorized personnel
|
||||
- **Credential Management**: Never store credentials in scripts
|
||||
|
||||
---
|
||||
|
||||
**Deployment guide designed for reliable, scalable, and secure rollout across enterprise manufacturing environments.**
|
||||
392
docs/FUNCTION_REFERENCE.md
Normal file
392
docs/FUNCTION_REFERENCE.md
Normal file
@@ -0,0 +1,392 @@
|
||||
# Function Reference Documentation
|
||||
|
||||
## Update-PC-CompleteAsset.ps1
|
||||
|
||||
### Core Functions
|
||||
|
||||
#### `Get-DashboardURL`
|
||||
**Purpose**: Intelligent dashboard API URL discovery and validation
|
||||
**Parameters**:
|
||||
- `$ProvidedURL` (string, optional) - User-specified URL
|
||||
|
||||
**Logic Flow**:
|
||||
1. Check command-line parameter
|
||||
2. Check environment variable `ASSET_DASHBOARD_URL`
|
||||
3. Check configuration file `dashboard-config.json`
|
||||
4. Auto-discovery probe of candidate URLs
|
||||
5. Fallback to default production URL
|
||||
|
||||
**Returns**: `[string]` - Validated dashboard API URL
|
||||
|
||||
```powershell
|
||||
function Get-DashboardURL {
|
||||
param([string]$ProvidedURL)
|
||||
|
||||
# Priority-based URL resolution
|
||||
if (-not [string]::IsNullOrEmpty($ProvidedURL)) {
|
||||
return $ProvidedURL
|
||||
}
|
||||
|
||||
# Auto-discovery with connection testing
|
||||
foreach ($url in $candidates) {
|
||||
$testResponse = Invoke-RestMethod -Uri "$url?action=getDashboardData" -Method Get -TimeoutSec 5
|
||||
if ($testResponse.success) {
|
||||
return $url
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `Test-ProxyConnection` / `Test-DashboardConnection`
|
||||
**Purpose**: Network connectivity validation for external services
|
||||
**Parameters**:
|
||||
- `$ProxyURL` / `$DashboardURL` (string) - Target URL to test
|
||||
|
||||
**Returns**: `[bool]` - Connection success status
|
||||
|
||||
**Features**:
|
||||
- Configurable timeout values
|
||||
- Detailed error reporting
|
||||
- Service availability verification
|
||||
|
||||
---
|
||||
|
||||
#### `Test-AppsFolder` / `Test-VDriveAccess` / `Test-WindowsLTSC`
|
||||
**Purpose**: PC type classification helper functions
|
||||
**Returns**: `[bool]` - Feature presence status
|
||||
|
||||
**Classification Logic**:
|
||||
```powershell
|
||||
function Get-PCType {
|
||||
if (Test-AppsFolder -and Test-VDriveAccess) {
|
||||
return "Engineer" # Development workstations
|
||||
}
|
||||
elseif (Test-WindowsLTSC) {
|
||||
return "Shopfloor" # Manufacturing systems
|
||||
}
|
||||
else {
|
||||
return "Standard" # Corporate systems
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `Get-GEMachineNumber`
|
||||
**Purpose**: Extract GE machine numbers from hostname patterns
|
||||
**Parameters**:
|
||||
- `$Hostname` (string) - Computer hostname
|
||||
|
||||
**Pattern Matching**:
|
||||
- `H###` patterns → `M###` (H123 → M123)
|
||||
- `G###` patterns → `M###` (G456 → M456)
|
||||
- Regex: `[HG](\d{3})`
|
||||
|
||||
**Returns**: `[string]` - Formatted machine number or `$null`
|
||||
|
||||
---
|
||||
|
||||
#### `Collect-SystemInfo`
|
||||
**Purpose**: Comprehensive system information gathering
|
||||
**Returns**: `[hashtable]` - Complete system profile
|
||||
|
||||
**Data Sources**:
|
||||
- **WMI/CIM Classes**: `CIM_ComputerSystem`, `CIM_BIOSElement`, `CIM_OperatingSystem`
|
||||
- **Environment Variables**: Hostname, user context
|
||||
- **Registry Analysis**: OS edition detection
|
||||
- **File System**: Apps folder and drive access testing
|
||||
|
||||
**Output Structure**:
|
||||
```powershell
|
||||
$systemInfo = @{
|
||||
Hostname = $env:COMPUTERNAME
|
||||
Manufacturer = $computerSystem.Manufacturer # Dell, HP, etc.
|
||||
Model = $computerSystem.Model # OptiPlex 7070
|
||||
SerialNumber = $bios.SerialNumber # Hardware serial
|
||||
ServiceTag = $bios.SerialNumber # Dell service tag
|
||||
LoggedInUser = $computerSystem.UserName.Split('\')[-1]
|
||||
OSVersion = $os.Caption # Windows 10 Enterprise LTSC
|
||||
TotalPhysicalMemory = [Math]::Round($computerSystem.TotalPhysicalMemory / 1GB, 2)
|
||||
DomainRole = $computerSystem.DomainRole # Domain membership
|
||||
CurrentTimeZone = (Get-TimeZone).Id # Timezone information
|
||||
LastBootUpTime = $os.LastBootUpTime # Last boot timestamp
|
||||
PCType = Get-PCType -HasAppsFolder $hasApps -HasVDriveAccess $hasVDrive -IsLTSC $isLTSC
|
||||
MachineNo = Get-GEMachineNumber -Hostname $systemInfo.Hostname
|
||||
}
|
||||
```
|
||||
|
||||
**Error Handling**: Graceful degradation with "Unknown" fallbacks for failed WMI queries
|
||||
|
||||
---
|
||||
|
||||
#### `Collect-ShopfloorInfo`
|
||||
**Purpose**: Manufacturing-specific configuration collection
|
||||
**Parameters**:
|
||||
- `$SystemInfo` (hashtable) - Basic system information
|
||||
|
||||
**Conditional Logic**: Only executes for `PCType = "Shopfloor"`
|
||||
|
||||
**Returns**: `[hashtable]` - Manufacturing configuration data or `$null`
|
||||
|
||||
**Calls**: `Get-ShopfloorConfigurations` function from imported module
|
||||
|
||||
---
|
||||
|
||||
#### `Get-WarrantyFromProxy`
|
||||
**Purpose**: Dell warranty information retrieval via proxy server
|
||||
**Parameters**:
|
||||
- `$ServiceTag` (string) - Dell service tag
|
||||
- `$ProxyURL` (string) - Proxy server URL
|
||||
|
||||
**API Integration**:
|
||||
```powershell
|
||||
$uri = "$ProxyURL" + "?vendor=dell&action=warranty&servicetag=$ServiceTag"
|
||||
$response = Invoke-RestMethod -Uri $uri -Method Get -TimeoutSec 30
|
||||
```
|
||||
|
||||
**Response Processing**: Extracts warranty end date, status, service level, and days remaining
|
||||
|
||||
**Current Status**: Disabled by default (`$SkipWarranty = $true`)
|
||||
|
||||
---
|
||||
|
||||
#### `Send-CompleteDataToDashboard`
|
||||
**Purpose**: Centralized data transmission to dashboard API
|
||||
**Parameters**:
|
||||
- `$SystemInfo` (hashtable) - System information
|
||||
- `$ShopfloorInfo` (hashtable) - Manufacturing configuration
|
||||
- `$WarrantyData` (hashtable) - Warranty information
|
||||
- `$DashboardURL` (string) - API endpoint URL
|
||||
|
||||
**Payload Construction**: Creates comprehensive HTTP POST payload with structured data
|
||||
|
||||
**Manufacturing Data Handling** ⭐ **Enhanced in v3.0**:
|
||||
```powershell
|
||||
# DualPath and Registry Architecture Data
|
||||
$postData.dncDualPathEnabled = $geInfo.DualPathEnabled
|
||||
$postData.dncPath1Name = $geInfo.Path1Name
|
||||
$postData.dncPath2Name = $geInfo.Path2Name
|
||||
$postData.dncGeRegistry32Bit = $geInfo.Registry32Bit
|
||||
$postData.dncGeRegistry64Bit = $geInfo.Registry64Bit
|
||||
$postData.dncGeRegistryNotes = $geInfo.RegistryNotes | ConvertTo-Json -Compress
|
||||
```
|
||||
|
||||
**Error Handling**: Comprehensive HTTP exception handling with detailed error reporting
|
||||
|
||||
---
|
||||
|
||||
## Get-ShopfloorConfig.ps1
|
||||
|
||||
### Manufacturing Intelligence Functions
|
||||
|
||||
#### `Get-NetworkInterfaceConfig`
|
||||
**Purpose**: Advanced network interface analysis with manufacturing intelligence
|
||||
**Returns**: `[array]` - Network interface configuration objects
|
||||
|
||||
**Multi-Method Approach**:
|
||||
1. **Primary**: `Get-NetAdapter` / `Get-NetIPConfiguration` cmdlets
|
||||
2. **Fallback**: WMI `Win32_NetworkAdapterConfiguration` class
|
||||
|
||||
**Manufacturing Intelligence**:
|
||||
```powershell
|
||||
# Machine network detection
|
||||
$isMachineNetwork = $ip.IPAddress -match '^192\.168\.'
|
||||
|
||||
$interface = @{
|
||||
InterfaceName = $adapter.Name
|
||||
IPAddress = $ip.IPAddress
|
||||
SubnetMask = $ip.PrefixLength
|
||||
DefaultGateway = $gateway
|
||||
MACAddress = $adapter.MacAddress
|
||||
IsDHCP = if ($ipConfig.NetIPv4Interface.Dhcp -eq 'Enabled') { 1 } else { 0 }
|
||||
IsActive = 1
|
||||
IsMachineNetwork = if ($isMachineNetwork) { 1 } else { 0 }
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `Get-SerialPortConfig`
|
||||
**Purpose**: Serial communication port enumeration and configuration analysis
|
||||
**Returns**: `[array]` - Serial port configuration objects
|
||||
|
||||
**Registry Data Source**: `HKLM:\HARDWARE\DEVICEMAP\SERIALCOMM`
|
||||
|
||||
**Configuration Structure**:
|
||||
```powershell
|
||||
$config = @{
|
||||
PortName = $portName # COM1, COM2, etc.
|
||||
DevicePath = $devicePath # Hardware device path
|
||||
IsActive = 1 # Availability status
|
||||
ConfigSource = "Registry" # Data source identifier
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `Get-DNCConfig`
|
||||
**Purpose**: Direct Numerical Control configuration extraction from GE Aircraft Engines registry
|
||||
**Returns**: `[hashtable]` - Complete DNC configuration or `$null`
|
||||
|
||||
**Multi-Path Registry Analysis**:
|
||||
```powershell
|
||||
$paths = @(
|
||||
'HKLM:\SOFTWARE\GE Aircraft Engines\DNC\General',
|
||||
'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines\DNC\General'
|
||||
)
|
||||
```
|
||||
|
||||
**Configuration Sections Analyzed**:
|
||||
- **General**: Site, CNC type, NcIF, Machine number, Debug settings
|
||||
- **MX**: FTP host configuration, account credentials
|
||||
- **FMS**: FMS host settings, socket configuration
|
||||
|
||||
**Output Structure**:
|
||||
```powershell
|
||||
$dncConfig = @{
|
||||
Site = $general.Site # WestJefferson
|
||||
CNC = $general.Cnc # Fanuc 30
|
||||
NcIF = $general.NcIF # EFOCAS
|
||||
MachineNumber = $general.MachineNo # 3109
|
||||
HostType = $general.HostType # WILM
|
||||
Debug = $general.Debug # ON/OFF
|
||||
# ... additional configuration parameters
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `Get-GERegistryInfo` ⭐ **New in v3.0**
|
||||
**Purpose**: Comprehensive GE Aircraft Engines registry architecture analysis with DualPath detection
|
||||
**Returns**: `[hashtable]` - Complete registry architecture and DualPath configuration
|
||||
|
||||
**Dual Registry Architecture Support**:
|
||||
```powershell
|
||||
$registryPaths = @{
|
||||
'32bit' = 'HKLM:\SOFTWARE\GE Aircraft Engines'
|
||||
'64bit' = 'HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines'
|
||||
}
|
||||
```
|
||||
|
||||
**Smart Conflict Resolution**:
|
||||
```powershell
|
||||
# Priority system prevents data overwrites
|
||||
if ($geInfo.DualPathEnabled -eq $null) {
|
||||
$geInfo.DualPathEnabled = $efocasValues.DualPath -eq 'YES'
|
||||
Write-Host "Setting DualPath from $pathType registry: $($geInfo.DualPathEnabled)"
|
||||
} else {
|
||||
Write-Host "DualPath already set from other registry location, keeping existing value"
|
||||
}
|
||||
```
|
||||
|
||||
**Comprehensive Data Collection**:
|
||||
- **Registry Presence**: 32-bit and/or 64-bit detection
|
||||
- **Sub-key Enumeration**: Complete service inventory
|
||||
- **DualPath Configuration**: eFocas DualPath settings extraction
|
||||
- **Path Configuration**: Path1Name and Path2Name identification
|
||||
- **Metadata Collection**: Timestamps, registry paths, additional settings
|
||||
|
||||
**Output Structure**:
|
||||
```powershell
|
||||
$geInfo = @{
|
||||
Registry32Bit = $false # Boolean: Found in 32-bit registry
|
||||
Registry64Bit = $true # Boolean: Found in 64-bit registry
|
||||
DualPathEnabled = $true # Boolean: DualPath enabled
|
||||
Path1Name = "Path1Primary" # String: Primary path name
|
||||
Path2Name = "Path2Secondary" # String: Secondary path name
|
||||
RegistryNotes = @{ # Hashtable: Comprehensive metadata
|
||||
"64bit" = @{
|
||||
BasePath = "HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines"
|
||||
SubKeys = "DNC, Enhanced DNC, MarkZebra, PPDCS"
|
||||
Found = "2025-09-06 14:30:00"
|
||||
}
|
||||
"64bit-eFocas" = @{
|
||||
DualPath = "YES"
|
||||
Path1Name = "Path1Primary"
|
||||
Path2Name = "Path2Secondary"
|
||||
IpAddr = "192.168.1.1"
|
||||
SocketNo = "8192"
|
||||
Danobat = "NO"
|
||||
DataServer = "NO"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### `Get-ShopfloorConfigurations`
|
||||
**Purpose**: Master orchestration function for all manufacturing-specific data collection
|
||||
**Returns**: `[hashtable]` - Complete manufacturing configuration profile
|
||||
|
||||
**Orchestration Logic**:
|
||||
```powershell
|
||||
$configurations = @{
|
||||
NetworkInterfaces = Get-NetworkInterfaceConfig # Network topology analysis
|
||||
CommConfigs = Get-SerialPortConfig # Serial communication ports
|
||||
DNCConfig = Get-DNCConfig # Direct Numerical Control settings
|
||||
GERegistryInfo = Get-GERegistryInfo # Registry architecture analysis
|
||||
}
|
||||
```
|
||||
|
||||
**Summary Reporting**:
|
||||
```powershell
|
||||
Write-Host "Configuration Summary:" -ForegroundColor Green
|
||||
Write-Host " Network Interfaces: $($configurations.NetworkInterfaces.Count)"
|
||||
Write-Host " Comm Configs: $($configurations.CommConfigs.Count)"
|
||||
Write-Host " DNC Config: $(if ($configurations.DNCConfig) { 'Yes' } else { 'No' })"
|
||||
Write-Host " GE Registry (32-bit): $(if ($configurations.GERegistryInfo.Registry32Bit) { 'Yes' } else { 'No' })"
|
||||
Write-Host " GE Registry (64-bit): $(if ($configurations.GERegistryInfo.Registry64Bit) { 'Yes' } else { 'No' })"
|
||||
Write-Host " DualPath Enabled: $(if ($configurations.GERegistryInfo.DualPathEnabled -eq $null) { 'Not Found' } elseif ($configurations.GERegistryInfo.DualPathEnabled) { 'Yes' } else { 'No' })"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling Patterns
|
||||
|
||||
### Standard Error Handling Template
|
||||
```powershell
|
||||
try {
|
||||
# Primary operation
|
||||
$result = Get-SomeInformation
|
||||
Write-Host "[OK] Operation successful" -ForegroundColor Green
|
||||
}
|
||||
catch {
|
||||
Write-Host "[FAIL] Operation failed: $($_.Exception.Message)" -ForegroundColor Red
|
||||
# Graceful degradation or fallback
|
||||
}
|
||||
```
|
||||
|
||||
### Registry Access Error Handling
|
||||
```powershell
|
||||
try {
|
||||
$registryValue = Get-ItemProperty -Path $registryPath -ErrorAction SilentlyContinue
|
||||
}
|
||||
catch {
|
||||
Write-Host "Error reading registry: $_" -ForegroundColor Red
|
||||
$geInfo.RegistryNotes[$pathType] = @{
|
||||
Error = $_.Exception.Message
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Network Communication Error Handling
|
||||
```powershell
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri $url -Method Post -Body $postData -TimeoutSec 30
|
||||
}
|
||||
catch [System.Net.WebException] {
|
||||
Write-Host "[FAIL] Network error: $($_.Exception.Message)" -ForegroundColor Red
|
||||
return $false
|
||||
}
|
||||
catch {
|
||||
Write-Host "[FAIL] Unexpected error: $($_.Exception.Message)" -ForegroundColor Red
|
||||
return $false
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Function reference provides comprehensive understanding of all script capabilities, parameters, error handling, and integration patterns for enterprise manufacturing environments.**
|
||||
120
docs/README.md
Normal file
120
docs/README.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# Documentation Index
|
||||
|
||||
## Overview
|
||||
This directory contains comprehensive technical documentation for the GE Manufacturing Asset Management Scripts. The documentation is organized into specialized areas covering architecture, deployment, integration, and operational aspects.
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
### 📋 [TECHNICAL_ARCHITECTURE.md](TECHNICAL_ARCHITECTURE.md)
|
||||
**Complete system architecture and design patterns**
|
||||
- System overview and component relationships
|
||||
- Data collection engine architecture
|
||||
- Manufacturing intelligence processing
|
||||
- Advanced features and algorithms
|
||||
- Performance characteristics and scalability
|
||||
- Security considerations
|
||||
|
||||
### 🔗 [API_INTEGRATION.md](API_INTEGRATION.md)
|
||||
**Dashboard API integration and data protocols**
|
||||
- API endpoint specifications
|
||||
- Request/response structures
|
||||
- Database schema integration
|
||||
- Manufacturing data payloads (v3.0 enhancements)
|
||||
- Connection management and error handling
|
||||
- Data validation and integrity
|
||||
|
||||
### 📖 [FUNCTION_REFERENCE.md](FUNCTION_REFERENCE.md)
|
||||
**Detailed function-by-function documentation**
|
||||
- Core system functions (`Update-PC-CompleteAsset.ps1`)
|
||||
- Manufacturing intelligence functions (`Get-ShopfloorConfig.ps1`)
|
||||
- Parameter specifications and return values
|
||||
- Error handling patterns and best practices
|
||||
- Code examples and usage patterns
|
||||
|
||||
### 🚀 [DEPLOYMENT_GUIDE.md](DEPLOYMENT_GUIDE.md)
|
||||
**Enterprise deployment strategies and procedures**
|
||||
- Single PC and multiple PC deployment methods
|
||||
- Enterprise integration (Group Policy, SCCM, Tanium)
|
||||
- Configuration management and customization
|
||||
- Scheduling and automation options
|
||||
- Network considerations and troubleshooting
|
||||
- Best practices and change management
|
||||
|
||||
## Quick Navigation
|
||||
|
||||
### For Developers
|
||||
- [Technical Architecture](TECHNICAL_ARCHITECTURE.md#architecture-components) - Understanding system design
|
||||
- [Function Reference](FUNCTION_REFERENCE.md#core-functions) - Implementation details
|
||||
- [API Integration](API_INTEGRATION.md#api-endpoint-updatecompleteasset) - Database integration
|
||||
|
||||
### For System Administrators
|
||||
- [Deployment Guide](DEPLOYMENT_GUIDE.md#deployment-methods) - Implementation strategies
|
||||
- [Technical Architecture](TECHNICAL_ARCHITECTURE.md#performance-characteristics) - Performance planning
|
||||
- [API Integration](API_INTEGRATION.md#connection-management) - Network configuration
|
||||
|
||||
### For Manufacturing Engineers
|
||||
- [Technical Architecture](TECHNICAL_ARCHITECTURE.md#manufacturing-intelligence-engine-get-shopfloorconfig-ps1) - Manufacturing features
|
||||
- [Function Reference](FUNCTION_REFERENCE.md#get-geregistryinfo-new-in-v30) - Registry analysis capabilities
|
||||
- [API Integration](API_INTEGRATION.md#manufacturing-specific-data-shopfloor-pcs-only) - Data structures
|
||||
|
||||
## Key Features Documented
|
||||
|
||||
### v3.0 Enhancements
|
||||
- **Dual Registry Architecture**: 32-bit and 64-bit GE Aircraft Engines registry analysis
|
||||
- **DualPath Communication**: Complete eFocas DualPath configuration extraction
|
||||
- **Per-Service Architecture Tracking**: Registry architecture detection per DNC service
|
||||
- **Smart Conflict Resolution**: Priority system for handling dual registry locations
|
||||
|
||||
### Manufacturing Intelligence
|
||||
- **PC Type Classification**: Engineer/Shopfloor/Standard automatic detection
|
||||
- **GE Machine Number Extraction**: Hostname pattern matching and conversion
|
||||
- **Network Topology Analysis**: Machine network detection and classification
|
||||
- **Communication Protocol Detection**: Serial port and DNC configuration analysis
|
||||
|
||||
### Enterprise Features
|
||||
- **Auto-Discovery**: Intelligent dashboard URL detection
|
||||
- **Multi-Method Deployment**: Single PC, batch, and enterprise integration options
|
||||
- **Comprehensive Logging**: Color-coded status reporting and error handling
|
||||
- **Graceful Degradation**: Fallback mechanisms for failed operations
|
||||
|
||||
## Documentation Standards
|
||||
|
||||
### Code Examples
|
||||
All code examples are tested and validated against the actual script implementations. Examples include:
|
||||
- Complete function signatures
|
||||
- Parameter specifications
|
||||
- Return value structures
|
||||
- Error handling patterns
|
||||
|
||||
### Architecture Diagrams
|
||||
ASCII diagrams illustrate:
|
||||
- System component relationships
|
||||
- Data flow patterns
|
||||
- Integration architectures
|
||||
- Network communication flows
|
||||
|
||||
### Cross-References
|
||||
Documentation includes extensive cross-referencing:
|
||||
- Function calls between modules
|
||||
- API endpoint relationships
|
||||
- Configuration dependencies
|
||||
- Deployment prerequisites
|
||||
|
||||
## Version History
|
||||
|
||||
- **v3.0**: Added dual registry architecture analysis and DualPath detection
|
||||
- **v2.1**: Enhanced shopfloor configuration documentation
|
||||
- **v2.0**: Integrated manufacturing-specific documentation
|
||||
- **v1.0**: Initial documentation framework
|
||||
|
||||
## Contributing to Documentation
|
||||
|
||||
When updating scripts or functionality:
|
||||
1. Update relevant function documentation in [FUNCTION_REFERENCE.md](FUNCTION_REFERENCE.md)
|
||||
2. Modify architecture documentation if system design changes
|
||||
3. Update API documentation for new data fields or endpoints
|
||||
4. Revise deployment procedures for new configuration options
|
||||
|
||||
---
|
||||
|
||||
**📚 Comprehensive documentation for enterprise manufacturing asset management**
|
||||
482
docs/SCRIPTS_REFERENCE.md
Normal file
482
docs/SCRIPTS_REFERENCE.md
Normal file
@@ -0,0 +1,482 @@
|
||||
# PowerShell Scripts Reference
|
||||
|
||||
Complete documentation for all scripts in this repository.
|
||||
|
||||
**Last Updated:** 2025-12-10
|
||||
|
||||
---
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
powershell-scripts/
|
||||
├── asset-collection/ # Local PC data collection scripts
|
||||
├── remote-execution/ # Remote WinRM execution scripts
|
||||
├── setup-utilities/ # Configuration and testing
|
||||
├── registry-backup/ # GE registry backup
|
||||
├── winrm-https/ # WinRM HTTPS/certificate setup
|
||||
└── docs/ # Documentation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Asset Collection Scripts](#asset-collection-scripts) (`asset-collection/`)
|
||||
2. [Remote Execution Scripts](#remote-execution-scripts) (`remote-execution/`)
|
||||
3. [Setup & Utility Scripts](#setup--utility-scripts) (`setup-utilities/`)
|
||||
4. [Registry Backup Scripts](#registry-backup-scripts) (`registry-backup/`)
|
||||
5. [WinRM HTTPS Scripts](#winrm-https-scripts) (`winrm-https/`)
|
||||
|
||||
---
|
||||
|
||||
## Asset Collection Scripts
|
||||
|
||||
**Location:** `asset-collection/`
|
||||
|
||||
### Update-PC-CompleteAsset.ps1
|
||||
|
||||
**Purpose:** Primary script for comprehensive PC asset data collection and database storage.
|
||||
|
||||
**What It Does:**
|
||||
1. Collects system information (hostname, serial number, manufacturer, model)
|
||||
2. Determines PC type (Engineer/Shopfloor/Standard/Measuring)
|
||||
3. Collects network interface configurations
|
||||
4. For shopfloor PCs: Collects DNC/machine configurations from GE registry
|
||||
5. Optionally retrieves Dell warranty information via proxy
|
||||
6. Sends all data to ShopDB API for storage
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-ProxyURL` | `http://10.48.130.158/vendor-api-proxy.php` | Warranty API proxy server |
|
||||
| `-DashboardURL` | `https://tsgwp00525.rd.ds.ge.com/shopdb/api.asp` | ShopDB API endpoint |
|
||||
| `-SkipWarranty` | `$true` | Skip warranty lookups (enabled by default) |
|
||||
| `-TestConnections` | `$false` | Test API connectivity without collecting data |
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# Standard execution (run as administrator)
|
||||
.\Update-PC-CompleteAsset.ps1
|
||||
|
||||
# Test connectivity only
|
||||
.\Update-PC-CompleteAsset.ps1 -TestConnections
|
||||
|
||||
# With warranty lookup enabled
|
||||
.\Update-PC-CompleteAsset.ps1 -SkipWarranty:$false
|
||||
```
|
||||
|
||||
**Requires:** Administrator privileges for full data collection
|
||||
|
||||
---
|
||||
|
||||
### Get-ShopfloorConfig.ps1
|
||||
|
||||
**Purpose:** Library of functions for collecting shopfloor-specific configurations.
|
||||
|
||||
**What It Does:**
|
||||
- Enumerates all network interfaces and their configurations
|
||||
- Detects "machine networks" (192.168.x.x subnets)
|
||||
- Collects serial port (COM) configurations
|
||||
- Extracts DNC settings from GE Aircraft Engines registry
|
||||
- Analyzes DualPath configurations for multi-machine setups
|
||||
|
||||
**Key Functions:**
|
||||
| Function | Description |
|
||||
|----------|-------------|
|
||||
| `Get-NetworkInterfaceConfig` | Collects all network adapter information |
|
||||
| `Get-SerialPortConfig` | Enumerates COM port configurations |
|
||||
| `Get-DNCConfig` | Extracts DNC registry settings |
|
||||
| `Get-GERegistryConfig` | Reads GE Aircraft Engines registry keys |
|
||||
|
||||
**Note:** This script is sourced (dot-sourced) by `Update-PC-CompleteAsset.ps1` and not run directly.
|
||||
|
||||
---
|
||||
|
||||
### Update-PC-Minimal.ps1
|
||||
|
||||
**Purpose:** Lightweight asset collection for locked-down PCs with restricted permissions.
|
||||
|
||||
**What It Does:**
|
||||
1. Collects basic system info without requiring admin privileges
|
||||
2. Uses only non-elevated WMI/CIM queries
|
||||
3. Detects PC-DMIS software for measuring machine classification
|
||||
4. Sends minimal data to ShopDB API
|
||||
|
||||
**When to Use:**
|
||||
- PCs where users cannot run as administrator
|
||||
- Measuring machines with restricted permissions
|
||||
- Quick data collection without full registry access
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
.\Update-PC-Minimal.ps1
|
||||
```
|
||||
|
||||
**Requires:** No elevated privileges (runs as standard user)
|
||||
|
||||
---
|
||||
|
||||
### Backup-GERegistry.ps1
|
||||
|
||||
**Purpose:** Backs up GE Aircraft Engines registry keys for disaster recovery and auditing.
|
||||
|
||||
**What It Does:**
|
||||
1. Exports registry keys from both 32-bit and 64-bit locations
|
||||
2. Creates backup files named with machine number and serial number
|
||||
3. Saves to network share for centralized backup storage
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-BackupPath` | `S:\DT\cameron\scan\backup\reg` | Network path for backup files |
|
||||
| `-Silent` | `$false` | Suppress console output |
|
||||
|
||||
**Backup Locations:**
|
||||
- `HKLM:\Software\GE Aircraft Engines`
|
||||
- `HKLM:\Software\WOW6432Node\GE Aircraft Engines`
|
||||
|
||||
**Output Filename Format:** `[machinenumber-]serialnumber-YYYY-MM-DD.reg`
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# Interactive backup
|
||||
.\Backup-GERegistry.ps1
|
||||
|
||||
# Silent backup (for scheduled tasks)
|
||||
.\Backup-GERegistry.ps1 -Silent
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Remote Execution Scripts
|
||||
|
||||
### Invoke-RemoteAssetCollection.ps1
|
||||
|
||||
**Purpose:** Remotely executes asset collection on multiple PCs via WinRM (HTTP).
|
||||
|
||||
**What It Does:**
|
||||
1. Establishes WinRM connections to target PCs
|
||||
2. Executes `Update-PC-CompleteAsset.ps1` remotely
|
||||
3. Collects and logs results from each PC
|
||||
4. Supports parallel execution for efficiency
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-ComputerList` | - | Array of computer names/IPs |
|
||||
| `-ComputerListFile` | - | Path to text file with computer list |
|
||||
| `-Credential` | - | PSCredential for authentication |
|
||||
| `-MaxConcurrent` | `5` | Maximum parallel sessions |
|
||||
| `-TestConnections` | `$false` | Test connectivity only |
|
||||
| `-ScriptPath` | `C:\Scripts\Update-PC-CompleteAsset.ps1` | Path to script on remote PCs |
|
||||
|
||||
**Prerequisites:**
|
||||
- WinRM enabled on target PCs (`Enable-PSRemoting -Force`)
|
||||
- Admin credentials for remote PCs
|
||||
- Port 5985 (HTTP) open
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# From file with prompted credentials
|
||||
.\Invoke-RemoteAssetCollection.ps1 -ComputerListFile ".\shopfloor-pcs.txt"
|
||||
|
||||
# Specific computers with stored credentials
|
||||
$cred = Get-Credential
|
||||
.\Invoke-RemoteAssetCollection.ps1 -ComputerList @("PC001","PC002") -Credential $cred
|
||||
|
||||
# Test connections only
|
||||
.\Invoke-RemoteAssetCollection.ps1 -ComputerList @("PC001") -TestConnections
|
||||
```
|
||||
|
||||
**Requires:** Administrator privileges, WinRM access to targets
|
||||
|
||||
---
|
||||
|
||||
### Invoke-RemoteAssetCollection-HTTPS.ps1
|
||||
|
||||
**Purpose:** Secure remote asset collection via WinRM over HTTPS (port 5986).
|
||||
|
||||
**What It Does:**
|
||||
Same as `Invoke-RemoteAssetCollection.ps1` but uses:
|
||||
- HTTPS/TLS encryption for secure communication
|
||||
- Wildcard certificates for domain-wide deployment
|
||||
- Automatic FQDN construction from hostnames
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-HostnameList` | - | Array of hostnames (without domain) |
|
||||
| `-HostnameListFile` | - | Path to text file with hostnames |
|
||||
| `-Domain` | - | Domain suffix (e.g., "logon.ds.ge.com") |
|
||||
| `-Port` | `5986` | HTTPS port |
|
||||
| `-SkipCertificateCheck` | `$false` | Skip SSL validation (not recommended) |
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# With domain suffix
|
||||
.\Invoke-RemoteAssetCollection-HTTPS.ps1 -HostnameList @("PC001","PC002") -Domain "logon.ds.ge.com"
|
||||
|
||||
# From file
|
||||
.\Invoke-RemoteAssetCollection-HTTPS.ps1 -HostnameListFile ".\hostnames.txt" -Domain "logon.ds.ge.com"
|
||||
```
|
||||
|
||||
**Requires:** WinRM HTTPS configured on targets (see winrm-https folder)
|
||||
|
||||
---
|
||||
|
||||
### Update-ShopfloorPCs-Remote.ps1
|
||||
|
||||
**Purpose:** Query ShopDB for all shopfloor PCs and update them remotely.
|
||||
|
||||
**What It Does:**
|
||||
1. Queries ShopDB API for list of all shopfloor PCs
|
||||
2. Establishes WinRM connections to each PC
|
||||
3. Collects system info remotely and POSTs to API
|
||||
4. Logs success/failure for each PC
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-ComputerName` | - | Specific PC(s) to update |
|
||||
| `-All` | `$false` | Update all shopfloor PCs from ShopDB |
|
||||
| `-SetupTrustedHosts` | `$false` | Configure WinRM trusted hosts |
|
||||
| `-Credential` | - | PSCredential for authentication |
|
||||
| `-ApiUrl` | `https://tsgwp00525.rd.ds.ge.com/shopdb/api.asp` | ShopDB API URL |
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# Update all shopfloor PCs
|
||||
.\Update-ShopfloorPCs-Remote.ps1 -All
|
||||
|
||||
# Update specific PCs
|
||||
.\Update-ShopfloorPCs-Remote.ps1 -ComputerName "PC001","PC002"
|
||||
|
||||
# Setup trusted hosts first
|
||||
.\Update-ShopfloorPCs-Remote.ps1 -SetupTrustedHosts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration & Setup Scripts
|
||||
|
||||
### Setup-WinRM.ps1
|
||||
|
||||
**Purpose:** Configures WinRM on the management server for remote asset collection.
|
||||
|
||||
**What It Does:**
|
||||
1. Enables WinRM service
|
||||
2. Configures trusted hosts for remote connections
|
||||
3. Sets up HTTP listener on port 5985
|
||||
4. Tests connectivity to specified computers
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-TrustedHosts` | `""` | Comma-separated list of trusted hosts (use "*" for all) |
|
||||
| `-TestConnection` | `@()` | Array of computers to test after setup |
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# Trust all hosts (less secure, simpler)
|
||||
.\Setup-WinRM.ps1 -TrustedHosts "*"
|
||||
|
||||
# Trust specific IPs
|
||||
.\Setup-WinRM.ps1 -TrustedHosts "10.48.130.100,10.48.130.101"
|
||||
|
||||
# Setup and test
|
||||
.\Setup-WinRM.ps1 -TrustedHosts "*" -TestConnection @("10.48.130.100")
|
||||
```
|
||||
|
||||
**Requires:** Administrator privileges
|
||||
|
||||
---
|
||||
|
||||
### Install-AssetCollectionSchedule.ps1
|
||||
|
||||
**Purpose:** Creates a Windows scheduled task for automated asset collection.
|
||||
|
||||
**What It Does:**
|
||||
1. Creates scheduled task running 4 times daily (6:00, 12:00, 18:00, 00:00)
|
||||
2. Configures silent execution (no window popup)
|
||||
3. Runs as SYSTEM account
|
||||
4. Handles battery/network conditions appropriately
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-ScriptPath` | `S:\DT\adata\script\Update-PC-CompleteAsset-Silent.bat` | Path to batch file |
|
||||
| `-TaskName` | `"GE Asset Collection"` | Name for scheduled task |
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# Install with defaults
|
||||
.\Install-AssetCollectionSchedule.ps1
|
||||
|
||||
# Custom script path
|
||||
.\Install-AssetCollectionSchedule.ps1 -ScriptPath "C:\Scripts\Update-PC-CompleteAsset-Silent.bat"
|
||||
```
|
||||
|
||||
**Requires:** Administrator privileges
|
||||
|
||||
---
|
||||
|
||||
## Utility Scripts
|
||||
|
||||
### Test-API-Connection.ps1
|
||||
|
||||
**Purpose:** Tests connectivity and functionality of the ShopDB API.
|
||||
|
||||
**What It Does:**
|
||||
1. Tests basic API connectivity
|
||||
2. Tests INSERT operation (creates test PC record)
|
||||
3. Tests UPDATE operation (modifies test record)
|
||||
4. Tests DELETE operation (cleans up test record)
|
||||
5. Reports success/failure for each operation
|
||||
|
||||
**Parameters:**
|
||||
| Parameter | Default | Description |
|
||||
|-----------|---------|-------------|
|
||||
| `-DashboardURL` | `http://192.168.122.151:8080/api.asp` | API endpoint to test |
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
# Test development API
|
||||
.\Test-API-Connection.ps1
|
||||
|
||||
# Test production API
|
||||
.\Test-API-Connection.ps1 -DashboardURL "https://production-server/shopdb/api.asp"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Get-InstalledApps.ps1
|
||||
|
||||
**Purpose:** Collects list of installed applications from a PC.
|
||||
|
||||
**What It Does:**
|
||||
- Queries registry for installed programs
|
||||
- Returns application names and versions
|
||||
- Used for software inventory in ShopDB
|
||||
|
||||
**Usage:**
|
||||
```powershell
|
||||
.\Get-InstalledApps.ps1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Batch File Launchers
|
||||
|
||||
### Update-PC-CompleteAsset.bat
|
||||
Standard launcher - opens PowerShell window with output visible.
|
||||
|
||||
### Update-PC-CompleteAsset-Silent.bat
|
||||
Silent launcher - runs hidden, suitable for scheduled tasks.
|
||||
|
||||
### Update-PC-Minimal.bat
|
||||
Launcher for minimal collection script.
|
||||
|
||||
### Run-RemoteCollection.bat
|
||||
Launcher for remote collection script.
|
||||
|
||||
### Get-InstalledApps.bat
|
||||
Launcher for application inventory script.
|
||||
|
||||
### Run-GetInstalledApps.bat
|
||||
Alternative launcher for application inventory.
|
||||
|
||||
---
|
||||
|
||||
## WinRM HTTPS Scripts
|
||||
|
||||
Located in `winrm-https/` folder. These scripts configure secure WinRM over HTTPS.
|
||||
|
||||
### Key Scripts:
|
||||
|
||||
| Script | Purpose |
|
||||
|--------|---------|
|
||||
| `Setup-WinRM-HTTPS.ps1` | Configure WinRM HTTPS on target PCs |
|
||||
| `Create-CertificateAuthority.ps1` | Create internal CA for certificates |
|
||||
| `Sign-PCCertificate.ps1` | Sign individual PC certificates |
|
||||
| `Sign-BulkPCCertificates.ps1` | Sign certificates for multiple PCs |
|
||||
| `Configure-WinRM-Client.ps1` | Configure client for HTTPS connections |
|
||||
| `Test-WinRM-HTTPS-Setup.ps1` | Verify HTTPS configuration |
|
||||
| `Test-ShopfloorPC.ps1` | Test connectivity to shopfloor PC |
|
||||
|
||||
### Documentation:
|
||||
|
||||
| Document | Description |
|
||||
|----------|-------------|
|
||||
| `README.md` | Overview and quick start |
|
||||
| `CA-APPROACH-GUIDE.md` | Certificate Authority setup guide |
|
||||
| `GETTING_STARTED.md` | Step-by-step initial setup |
|
||||
| `NETWORK_SHARE_DEPLOYMENT.md` | Deploying via network share |
|
||||
| `SECURE_CREDENTIAL_MANAGEMENT.md` | Credential security best practices |
|
||||
| `TROUBLESHOOTING_CERTIFICATE_GENERATION.md` | Certificate troubleshooting |
|
||||
|
||||
---
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ Management Server │
|
||||
│ ┌──────────────────────────────────────────────────────────┐ │
|
||||
│ │ Invoke-RemoteAssetCollection.ps1 │ │
|
||||
│ │ Invoke-RemoteAssetCollection-HTTPS.ps1 │ │
|
||||
│ │ Update-ShopfloorPCs-Remote.ps1 │ │
|
||||
│ └──────────────────────┬───────────────────────────────────┘ │
|
||||
└─────────────────────────┼───────────────────────────────────────┘
|
||||
│ WinRM (5985/5986)
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ Shopfloor PCs │
|
||||
│ ┌──────────────────────────────────────────────────────────┐ │
|
||||
│ │ Update-PC-CompleteAsset.ps1 │ │
|
||||
│ │ Get-ShopfloorConfig.ps1 │ │
|
||||
│ │ Backup-GERegistry.ps1 │ │
|
||||
│ └──────────────────────┬───────────────────────────────────┘ │
|
||||
└─────────────────────────┼───────────────────────────────────────┘
|
||||
│ HTTPS
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ ShopDB API Server │
|
||||
│ ┌──────────────────────────────────────────────────────────┐ │
|
||||
│ │ api.asp (IIS) → MySQL Database │ │
|
||||
│ └──────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Run asset collection on local PC:
|
||||
```batch
|
||||
Update-PC-CompleteAsset.bat
|
||||
```
|
||||
|
||||
### Run silent collection (for scheduled tasks):
|
||||
```batch
|
||||
Update-PC-CompleteAsset-Silent.bat
|
||||
```
|
||||
|
||||
### Collect from all shopfloor PCs remotely:
|
||||
```powershell
|
||||
.\Update-ShopfloorPCs-Remote.ps1 -All
|
||||
```
|
||||
|
||||
### Test API connectivity:
|
||||
```powershell
|
||||
.\Test-API-Connection.ps1
|
||||
```
|
||||
|
||||
### Setup scheduled collection:
|
||||
```powershell
|
||||
.\Install-AssetCollectionSchedule.ps1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Repository:** http://localhost:3000/cproudlock/powershell-scripts
|
||||
327
docs/TECHNICAL_ARCHITECTURE.md
Normal file
327
docs/TECHNICAL_ARCHITECTURE.md
Normal file
@@ -0,0 +1,327 @@
|
||||
# Technical Architecture Documentation
|
||||
|
||||
## System Overview
|
||||
|
||||
The GE Manufacturing Asset Management System is a comprehensive PowerShell-based solution designed for automated data collection and centralized asset management in manufacturing environments. The system follows a hybrid architecture combining local data collection, remote API integration, and intelligent manufacturing-specific analysis.
|
||||
|
||||
## Architecture Components
|
||||
|
||||
```
|
||||
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
|
||||
│ Manufacturing │ │ Data Collection│ │ Centralized │
|
||||
│ PC (Client) │───▶│ & Processing │───▶│ Database │
|
||||
│ │ │ (PowerShell) │ │ (MySQL) │
|
||||
└─────────────────┘ └──────────────────┘ └─────────────────┘
|
||||
│ │ ▲
|
||||
│ │ │
|
||||
▼ ▼ │
|
||||
┌─────────────────┐ ┌──────────────────┐ │
|
||||
│ Windows │ │ Manufacturing │ │
|
||||
│ Registry │ │ Intelligence │ │
|
||||
│ (GE Settings) │ │ Engine │ │
|
||||
└─────────────────┘ └──────────────────┘ │
|
||||
│ │
|
||||
▼ │
|
||||
┌──────────────────┐ │
|
||||
│ Dashboard API │─────────────┘
|
||||
│ Integration │
|
||||
└──────────────────┘
|
||||
```
|
||||
|
||||
## Core Components
|
||||
|
||||
### 1. Data Collection Engine (`Update-PC-CompleteAsset.ps1`)
|
||||
|
||||
**Primary Responsibilities:**
|
||||
- Orchestrates the entire data collection process
|
||||
- Coordinates with multiple data sources and APIs
|
||||
- Handles error recovery and graceful degradation
|
||||
- Provides real-time feedback and logging
|
||||
|
||||
**Key Functions:**
|
||||
|
||||
#### `Collect-SystemInfo`
|
||||
```powershell
|
||||
# Comprehensive system information gathering
|
||||
- Hardware identification (manufacturer, model, serial)
|
||||
- Operating system details and user context
|
||||
- Memory, domain role, and timezone information
|
||||
- PC type classification logic
|
||||
- GE machine number extraction
|
||||
```
|
||||
|
||||
#### `Collect-ShopfloorInfo`
|
||||
```powershell
|
||||
# Manufacturing-specific data collection
|
||||
- Network interface enumeration and analysis
|
||||
- Serial communication port configurations
|
||||
- DNC (Direct Numerical Control) settings extraction
|
||||
- GE Aircraft Engines registry architecture analysis
|
||||
```
|
||||
|
||||
#### `Send-CompleteDataToDashboard`
|
||||
```powershell
|
||||
# Centralized data transmission
|
||||
- Structured API payload construction
|
||||
- HTTP POST transmission with error handling
|
||||
- Response validation and feedback processing
|
||||
```
|
||||
|
||||
### 2. Manufacturing Intelligence Engine (`Get-ShopfloorConfig.ps1`)
|
||||
|
||||
**Primary Responsibilities:**
|
||||
- Deep manufacturing environment analysis
|
||||
- Registry-based configuration extraction
|
||||
- Network topology identification
|
||||
- Communication protocol detection
|
||||
|
||||
**Key Functions:**
|
||||
|
||||
#### `Get-NetworkInterfaceConfig`
|
||||
```powershell
|
||||
# Advanced network analysis
|
||||
- Multi-interface enumeration with active status
|
||||
- Machine network detection (192.168.*.* identification)
|
||||
- DHCP vs static configuration analysis
|
||||
- Gateway and subnet mapping
|
||||
```
|
||||
|
||||
#### `Get-GERegistryInfo` ⭐ **New in v3.0**
|
||||
```powershell
|
||||
# Dual registry architecture analysis
|
||||
- 32-bit registry path: HKLM:\SOFTWARE\GE Aircraft Engines
|
||||
- 64-bit registry path: HKLM:\SOFTWARE\WOW6432Node\GE Aircraft Engines
|
||||
- Smart conflict resolution with priority system
|
||||
- DualPath communication configuration extraction
|
||||
- Per-service architecture tracking
|
||||
```
|
||||
|
||||
#### `Get-DNCConfig`
|
||||
```powershell
|
||||
# Direct Numerical Control configuration
|
||||
- GE Aircraft Engines DNC settings extraction
|
||||
- Multiple registry path analysis
|
||||
- Communication parameter identification
|
||||
- Machine integration settings
|
||||
```
|
||||
|
||||
## Data Flow Architecture
|
||||
|
||||
### Phase 1: System Discovery
|
||||
```
|
||||
PC Environment → System Info Collection → Classification Engine
|
||||
│
|
||||
├─ Hardware Identification (WMI/CIM)
|
||||
├─ Operating System Analysis
|
||||
├─ User Context Determination
|
||||
└─ Environment Classification (Engineer/Shopfloor/Standard)
|
||||
```
|
||||
|
||||
### Phase 2: Manufacturing Intelligence
|
||||
```
|
||||
Registry Analysis → Manufacturing Config → Service Architecture
|
||||
│
|
||||
├─ GE Aircraft Engines Detection (32-bit/64-bit)
|
||||
├─ DualPath Configuration Analysis
|
||||
├─ DNC Service Enumeration
|
||||
└─ Communication Protocol Mapping
|
||||
```
|
||||
|
||||
### Phase 3: Network Topology
|
||||
```
|
||||
Network Interfaces → Machine Network Detection → Communication Analysis
|
||||
│
|
||||
├─ Active Interface Enumeration
|
||||
├─ Machine Network Identification (192.168.*.*)
|
||||
├─ DHCP/Static Configuration Analysis
|
||||
└─ Serial Port Communication Mapping
|
||||
```
|
||||
|
||||
### Phase 4: Data Consolidation
|
||||
```
|
||||
Collected Data → JSON Serialization → API Payload Construction
|
||||
│
|
||||
├─ System Information Packaging
|
||||
├─ Manufacturing Configuration JSON
|
||||
├─ Network Interface Data Arrays
|
||||
└─ Registry Architecture Metadata
|
||||
```
|
||||
|
||||
### Phase 5: Centralized Storage
|
||||
```
|
||||
Dashboard API → Database Normalization → Relational Storage
|
||||
│
|
||||
├─ PC Table (Basic System Information)
|
||||
├─ PC_DNC_Config Table (Manufacturing Settings + Registry Architecture)
|
||||
├─ Network Interfaces (Detailed Network Configuration)
|
||||
├─ Communication Configs (Serial/Protocol Settings)
|
||||
└─ Machines Table (Auto-populated from PC machine numbers)
|
||||
```
|
||||
|
||||
### Phase 6: Machine Auto-Population ⭐ **New in v3.2**
|
||||
```
|
||||
PC Data Collection → Machine Number Extraction → Automated Machine Creation
|
||||
│ │ │
|
||||
├─ Registry Scan ├─ Hostname Patterns ├─ Machine Records
|
||||
├─ DNC Detection ├─ GE Machine Numbers ├─ PC Relationships
|
||||
└─ Network Analysis └─ Role Classification └─ IP Assignment
|
||||
```
|
||||
|
||||
## Advanced Features
|
||||
|
||||
### PC Type Classification Algorithm
|
||||
```powershell
|
||||
function Get-PCType {
|
||||
if (Test-AppsFolder -and Test-VDriveAccess) {
|
||||
return "Engineer" # Development/Engineering workstations
|
||||
}
|
||||
elseif (Test-WindowsLTSC) {
|
||||
return "Shopfloor" # Manufacturing floor systems
|
||||
}
|
||||
else {
|
||||
return "Standard" # General corporate systems
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### GE Machine Number Extraction
|
||||
```powershell
|
||||
function Get-GEMachineNumber {
|
||||
# Pattern matching for GE hostname conventions
|
||||
if ($Hostname -match '[HG](\d{3})') {
|
||||
$machineNum = $Matches[1]
|
||||
return "M$machineNum" # Convert H123/G123 → M123
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Machine Auto-Population Architecture ⭐ **New in v3.2**
|
||||
|
||||
The system automatically creates machine records from shopfloor PC data using a multi-phase approach:
|
||||
|
||||
#### Phase 1: Machine Number Extraction
|
||||
```powershell
|
||||
function Get-GEMachineNumber {
|
||||
# Priority 1: Registry-based detection
|
||||
$gePaths = @(
|
||||
"HKLM:\Software\GE Aircraft Engines\DNC\General",
|
||||
"HKLM:\Software\WOW6432Node\GE Aircraft Engines\DNC\General"
|
||||
)
|
||||
|
||||
# Priority 2: Hostname pattern matching
|
||||
if ($Hostname -match '[HG](\d{3})') {
|
||||
return "M$($Matches[1])" # H3103 → M3103
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Phase 2: Machine Record Creation
|
||||
```sql
|
||||
-- Bulk creation for numeric machines
|
||||
INSERT INTO machines (machinenumber, alias, machinenotes, ipaddress1)
|
||||
SELECT DISTINCT
|
||||
p.machinenumber,
|
||||
CONCAT('Machine ', p.machinenumber),
|
||||
CONCAT('Auto-discovered | Connected PCs: ',
|
||||
GROUP_CONCAT(p.hostname), ' | Count: ', COUNT(*)),
|
||||
(SELECT ni.ipaddress FROM pc_network_interfaces ni
|
||||
WHERE ni.pcid = p.pcid ORDER BY p.lastupdated DESC LIMIT 1)
|
||||
FROM pc p
|
||||
WHERE p.machinenumber REGEXP '^[0-9]+$'
|
||||
GROUP BY p.machinenumber;
|
||||
```
|
||||
|
||||
#### Phase 3: PC-Machine Relationship Mapping
|
||||
```sql
|
||||
-- Junction table for many-to-many relationships
|
||||
CREATE TABLE machine_pc_relationships (
|
||||
machine_id INT,
|
||||
pc_id INT,
|
||||
pc_role ENUM('control', 'hmi', 'engineering', 'backup', 'unknown'),
|
||||
is_primary BOOLEAN,
|
||||
relationship_notes TEXT
|
||||
);
|
||||
|
||||
-- Intelligent role detection
|
||||
pc_role = CASE
|
||||
WHEN hostname LIKE '%HMI%' THEN 'hmi'
|
||||
WHEN hostname LIKE '%CONTROL%' THEN 'control'
|
||||
WHEN hostname LIKE '%ENG%' THEN 'engineering'
|
||||
ELSE 'unknown'
|
||||
END
|
||||
```
|
||||
|
||||
#### Phase 4: Production Results
|
||||
- **121 Machines Created**: Complete shopfloor inventory
|
||||
- **115 Numeric Machines**: Standard 4-digit machine numbers (0000-9999)
|
||||
- **3 M-Prefix Machines**: Legacy naming (M439, M670, M886)
|
||||
- **1 Special Equipment**: WJPRT (Waterjet Printer)
|
||||
- **1 Test Machine**: TEST-001
|
||||
- **Multiple PC Handling**: Machine 0615 has 5 connected PCs
|
||||
- **Role Classification**: Control, HMI, Engineering, Backup PCs identified
|
||||
|
||||
### Dual Registry Architecture Handling ⭐ **New in v3.0**
|
||||
```powershell
|
||||
# Intelligent priority system prevents data overwrites
|
||||
if ($geInfo.DualPathEnabled -eq $null) {
|
||||
$geInfo.DualPathEnabled = $efocasValues.DualPath -eq 'YES'
|
||||
# First registry location sets the value
|
||||
} else {
|
||||
# Subsequent locations preserve existing values
|
||||
Write-Host "DualPath already set from other registry location"
|
||||
}
|
||||
```
|
||||
|
||||
## Error Handling & Resilience
|
||||
|
||||
### Graceful Degradation Strategy
|
||||
1. **Primary Data Sources**: Continue with secondary methods if WMI/CIM fails
|
||||
2. **Network Discovery**: Fall back to alternative network enumeration
|
||||
3. **Registry Access**: Handle permission issues with error logging
|
||||
4. **API Communication**: Retry logic with exponential backoff
|
||||
|
||||
### Comprehensive Logging
|
||||
```powershell
|
||||
# Color-coded status reporting
|
||||
Write-Host "[OK] Component successful" -ForegroundColor Green
|
||||
Write-Host "[WARN] Non-critical issue" -ForegroundColor Yellow
|
||||
Write-Host "[FAIL] Critical error" -ForegroundColor Red
|
||||
```
|
||||
|
||||
## Performance Characteristics
|
||||
|
||||
### Execution Times (Typical)
|
||||
- **Standard PC**: ~15-30 seconds (basic system info + network)
|
||||
- **Shopfloor PC**: ~45-90 seconds (full manufacturing analysis)
|
||||
- **Engineer PC**: ~20-40 seconds (enhanced system info)
|
||||
|
||||
### Resource Utilization
|
||||
- **Memory**: ~50-100 MB during execution
|
||||
- **CPU**: Low impact with burst activity during registry scans
|
||||
- **Network**: Minimal bandwidth (~1-5 KB payload per PC)
|
||||
|
||||
### Scalability Metrics
|
||||
- **Concurrent Executions**: Tested up to 50 simultaneous deployments
|
||||
- **Error Rate**: <2% in production environments
|
||||
- **Success Rate**: >98% data collection completion
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Required Permissions
|
||||
- **Administrator Rights**: Required for complete WMI/registry access
|
||||
- **Network Access**: Dashboard API communication
|
||||
- **Registry Read**: GE Aircraft Engines configuration access
|
||||
|
||||
### Data Protection
|
||||
- **No Credential Storage**: Scripts don't store or transmit passwords
|
||||
- **Local Processing**: All analysis performed locally before transmission
|
||||
- **Minimal Data**: Only relevant asset information transmitted
|
||||
|
||||
### Network Security
|
||||
- **HTTP POST**: Structured API communication
|
||||
- **Error Handling**: No sensitive information in error messages
|
||||
- **Timeout Protection**: Prevents hanging network connections
|
||||
|
||||
---
|
||||
|
||||
**Architecture designed for enterprise manufacturing environments with emphasis on reliability, intelligence, and scalability.**
|
||||
Reference in New Issue
Block a user