Advertisement
JoriWalker

Untitled

Mar 16th, 2022
41
256 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  <#
  2.     This function is called when the service is started. Once this function returns,
  3.     your service will be set to a Running state.
  4. #>
  5. function OnStart() {
  6.     Start-Transcript C:\Temp\Main.log
  7.     $SNID = (Get-Ciminstance -class win32_bios).SerialNumber
  8.     $MeterFolder = "$Env:ProgramData\PSEM\Metering"
  9.     $QueueFolder = "$Env:ProgramData\PSEM\Metering\Queue"
  10.     try {
  11.         Resolve-Path $QueueFolder -ErrorAction Stop
  12.     }
  13.     catch {
  14.         New-Item -Path $QueueFolder -ItemType Directory -Force
  15.     }
  16.     function Enable-ProcessTrace {
  17.         [CmdLetBinding()]
  18.         param(
  19.             $Interval = 3.
  20.         )
  21.         Start-Transcript C:\Temp\ProcessTrace.log
  22.         $Query = "Select * From __InstanceCreationEvent within $Interval Where TargetInstance ISA 'Win32_Process'"
  23.         $Identifier = "StartProcess"
  24.         $ActionBlock = {
  25.             $e = $event.SourceEventArgs.NewEvent.TargetInstance
  26.             If ($MatchProcess -contains $e.name) {
  27.                 $eventObj = [PSCustomObject]@{
  28.                     Name        = $E.Name
  29.                     Path        = $E.ExecutablePath
  30.                     Username    = (Get-Process -Id $E.ProcessID -IncludeUserName).Username
  31.                     CommandLine = $E.CommandLine
  32.                     snID        = $SNID
  33.                     Timestamp   = Get-Date
  34.                 }
  35.                 $Data = $EventObj | ConvertTo-Json
  36.                 If (([ADSI]"LDAP://RootDSE").dnsHostName -ne $Null) {
  37.                     Try {
  38.                         Resolve-Path $QueueFolder\Queue.json -ErrorAction Stop
  39.                         $MeterObj = Get-Content $QueueFolder\Queue.json -raw -ErrorAction Stop
  40.                     }
  41.                     Catch {
  42.                         Remove-Variable MeterObj
  43.                     }
  44.                     If ($MeterObj) {
  45.                         try {
  46.                             Invoke-RestMethod https://PowershellUniversalServer.com/endmgmt/meter/Post -Method POST -Body $MeterObj -ErrorAction Stop
  47.                             Remove-Item $QueueFolder\Queue.json -Force
  48.                         }
  49.                         catch {
  50.  
  51.                         }
  52.                     }
  53.                     Try {
  54.                         Invoke-RestMethod https://PowershellUniversalServer.com/endmgmt/meter/Post -Method POST -Body $Data -ErrorAction Stop
  55.                     }
  56.                     catch {
  57.                         If ($MeterObj) {
  58.                             $NewObj = New-Object System.Collections.Arraylist
  59.                             $MeterObj = $MeterObj | ConvertFrom-Json
  60.                             $MeterObj | Foreach {
  61.                                 $NewObj.Add($_)
  62.                             }
  63.                             $NewObj.Add($EventObj)
  64.                             $NewObj | ConvertTo-Json | Out-File $QueueFolder\Queue.json
  65.                         }
  66.                         Else {
  67.                             $Data | Out-File $QueueFolder\Queue.json
  68.                         }
  69.                     }
  70.                 }
  71.                 Else {
  72.                     Try {
  73.                         Resolve-Path $QueueFolder\Queue.json -ErrorAction Stop
  74.                         $MeterObj = Get-Content $QueueFolder\Queue.json -raw -ErrorAction Stop
  75.                     }
  76.                     Catch {
  77.                        
  78.                     }
  79.                     If ($MeterObj) {
  80.                         $NewObj = New-Object System.Collections.Arraylist
  81.                         $MeterObj = $MeterObj | ConvertFrom-Json
  82.                         $MeterObj | Foreach {
  83.                             $NewObj.Add($_)
  84.                         }
  85.                         $NewObj.Add($EventObj)
  86.                         $NewObj | ConvertTo-Json | Out-File $QueueFolder\Queue.json
  87.                     }
  88.                     Else {
  89.                         $Data | Out-File $QueueFolder\Queue.json
  90.                     }
  91.                 }
  92.             }
  93.         }            
  94.         Register-WMIEvent -Query $Query -SourceIdentifier $Identifier -Action $ActionBlock            
  95.     }
  96.    
  97.     Function Register-Watcher {
  98.         param ($folder, $file)
  99.         $watcher = New-Object IO.FileSystemWatcher $folder, $file -Property @{
  100.             IncludeSubdirectories = $false
  101.             EnableRaisingEvents   = $true
  102.         }
  103.         Start-Transcript C:\Temp\FileWatcher.log
  104.         $changeAction = [scriptblock]::Create('
  105.            # This is the code which will be executed every time a file change is detected
  106.            $eventObj = [PSCustomObject]@{
  107.                Name        = $Event.SourceEventArgs.Name
  108.                Path        = $Event.SourceEventArgs.FullPath
  109.                Username    = $Event.SourceEventArgs.FullPath.Replace("C:\Users\", "").Replace("\AppData\Local\TechSmith\SnagIt\DataStore\SnagIt900.sdf", "").Replace("\", ""
  110.                CommandLine = ""
  111.                snID        = $SNID
  112.                Timestamp   = $Event.TimeGenerated
  113.            }
  114.            $Data = $EventObj | ConvertTo-Json
  115.            If (([ADSI]"LDAP://RootDSE").dnsHostName -ne $Null) {
  116.                Try {
  117.                    Resolve-Path $QueueFolder\Queue.json -ErrorAction Stop
  118.                    $MeterObj = Get-Content $QueueFolder\Queue.json -raw -ErrorAction Stop
  119.                }
  120.                Catch {
  121.                    Remove-Variable MeterObj
  122.                }
  123.                try {
  124.                    Invoke-RestMethod https://PowershellUniversalServer.com/endmgmt/meter/Post -Method POST -Body $MeterObj -ErrorAction Stop
  125.                    Remove-Item $QueueFolder\Queue.json -Force
  126.                }
  127.                catch {
  128.            
  129.                }
  130.                Try {
  131.                    Invoke-RestMethod https://PowershellUniversalServer.com/endmgmt/meter/Post -Method POST -Body $Data -ErrorAction Stop
  132.                }
  133.                catch {
  134.                    If ($MeterObj) {
  135.                        $NewObj = New-Object System.Collections.Arraylist
  136.                        $MeterObj = $MeterObj | ConvertFrom-Json
  137.                        $MeterObj | Foreach {
  138.                            $NewObj.Add($_)
  139.                        }
  140.                        $NewObj.Add($EventObj)
  141.                        $NewObj | ConvertTo-Json | Out-File $QueueFolder\Queue.json
  142.                    }
  143.                    Else {
  144.                        $Data | Out-File $QueueFolder\Queue.json
  145.                    }
  146.                }
  147.            }
  148.            Else {
  149.                Try {
  150.                    Resolve-Path $QueueFolder\Queue.json -ErrorAction Stop
  151.                    $MeterObj = Get-Content $QueueFolder\Queue.json -raw -ErrorAction Stop
  152.                }
  153.                Catch {
  154.                        
  155.                }
  156.                If ($MeterObj) {
  157.                    $NewObj = New-Object System.Collections.Arraylist
  158.                    $MeterObj = $MeterObj | ConvertFrom-Json
  159.                    $MeterObj | Foreach {
  160.                        $NewObj.Add($_)
  161.                    }
  162.                    $NewObj.Add($EventObj)
  163.                    $NewObj | ConvertTo-Json | Out-File $QueueFolder\Queue.json
  164.                }
  165.                Else {
  166.                    $Data | Out-File $QueueFolder\Queue.json
  167.                }
  168.            }
  169.        ')
  170.    
  171.         Register-ObjectEvent $Watcher -EventName "Changed" -Action $changeAction
  172.     }
  173.    
  174.     try {
  175.         $Metering = Invoke-RestMethod https://PowershellUniversalServer.com/endmgmt/meter -ErrorAction Stop
  176.         $Metering | ConvertTo-Json | Out-File $MeterFolder\SFTMetering.json
  177.     }
  178.     catch {
  179.         $Metering = Get-Content $MeterFolder\SFTMetering.json -raw | ConvertFrom-Json
  180.     }
  181.  
  182.     $MatchProcess = $metering.Process.exe
  183.    
  184.     Enable-ProcessTrace
  185.    
  186.     foreach ($File in $Metering.File) {
  187.         If ($File.path -match "\*") {
  188.             Get-ChildItem -Path $File.path.Substring(0, $File.path.indexof('*')) | foreach {
  189.                 $Path = "$($_.FullName)\$($File.path.Substring($File.path.indexof('*')+1))"
  190.                 If (Test-Path $Path) {
  191.                     Start-Job
  192.                     Register-Watcher -folder $Path -file $File.File
  193.                 }
  194.             }
  195.         }
  196.     }
  197. }
  198.  
  199. <#
  200. This function is called when the service is started. Once this function returns,
  201. your service will be set to a Stopped state and the process will terminate.
  202. #>
  203. function OnStop() {
  204.  
  205. }
  206.  
  207. # Specifies whether this service can be stopped once started
  208. $CanStop = $true
  209.  
  210.  
  211. <#  Below is the JSON returned from Powershell Universal to the $Metering Variable
  212. {
  213.   "Process": [
  214.     {
  215.       "Name": "Bluebeam Revu",
  216.       "EXE": "Revu.exe",
  217.       "Path": "C:\\Program Files\\Bluebeam Software\\Bluebeam Revu\\20\\Revu"
  218.     },
  219.     {
  220.       "Name": "Adobe Acrobat DC",
  221.       "EXE": "Acrobat.exe",
  222.       "Path": "C:\\Program Files (x86)\\Adobe\\Acrobat DC\\Acrobat"
  223.     },
  224.     {
  225.       "Name": "Visio",
  226.       "EXE": "Visio.exe",
  227.       "Path": "C:\\Program Files\\Microsoft Office\\root\\Office16"
  228.     },
  229.     {
  230.       "Name": "Project",
  231.       "EXE": "WINPROJ.exe",
  232.       "Path": "C:\\Program Files\\Microsoft Office\\root\\Office16"
  233.     },
  234.     {
  235.       "Name": "AutoCAD LT 2022",
  236.       "EXE": "acadlt.exe",
  237.       "Path": "C:\\Program Files\\Autodesk\\AutoCAD LT 2022"
  238.     },
  239.     {
  240.       "Name": "AutoCAD 2022",
  241.       "EXE": "acad.exe",
  242.       "Path": "C:\\Program Files\\Autodesk\\AutoCAD 2022"
  243.     }
  244.   ],
  245.   "File": [
  246.     {
  247.       "Name": "Snagit",
  248.       "File": "SnagIt900.sdf",
  249.       "Path": "C:\\Users\\*\\AppData\\Local\\TechSmith\\SnagIt\\DataStore"
  250.     }
  251.   ]
  252. }
  253.  
  254. #>
  255.  
  256.  
Advertisement
RAW Paste Data Copied
Advertisement