├── CVE-2021-36934 ├── Detection.ps1 ├── Workaround.bat └── Workaround.ps1 ├── Citrix Remover.ps1 ├── Dell.ps1 ├── DellWarranty ├── DellWarranty.ps1 └── README.md ├── Get-DeviceIdleTIme.ps1 ├── MDE ├── Downlevel.ps1 ├── README.md └── msedge_2021-07-01_11-48-31.png ├── Monitor - WOL Status for BIOS and OS.ps1 ├── PUP ├── BrowserExtension │ ├── ChromeTest.ps1 │ ├── ChromeTest1.ps1 │ ├── EdgeStoreTest.ps1 │ ├── EdgeTest.ps1 │ └── Firefox.ps1 ├── Delete_-_Potentially_Unwanted_Apps.ps1 ├── JSON │ ├── crapware.json │ ├── oem.json │ ├── remoteaccess.json │ ├── rmm.json │ └── security.json └── Monitor_-_Potentially_Unwanted_Apps.ps1 ├── README.md ├── Screenconnect.ps1 ├── Win11 ├── README.md ├── Win11Check.ps1 └── fields.png └── WinUpdateCheck ├── CheckBuild.ps1 ├── CheckBuildSyncro.ps1 └── README.md /CVE-2021-36934/Detection.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | $ErrorActionPreference = "SilentlyContinue"; 3 | if ((get-acl C:\windows\system32\config\sam).Access | 4 | ? IdentityReference -match 'BUILTIN\\Users' | 5 | select -expandproperty filesystemrights | 6 | select-string 'Read') { 7 | write-host "May be vulnerable: Arbitrary Read permissions for SAM file" 8 | Set-Asset-Field -Name "CVE-2021-36934" -Value true 9 | 10 | } 11 | else { write-host "Does not seem to be vulnerable, SAM permissions are fine" } -------------------------------------------------------------------------------- /CVE-2021-36934/Workaround.bat: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | #https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-36934 3 | icacls %windir%\system32\config\*.* /inheritance:e 4 | vssadmin delete shadows /for=c: /all /quiet 5 | cmd.exe /k "wmic.exe /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint 'CVE-2021-36934', 100, 7" 6 | 7 | 8 | $ErrorActionPreference = "SilentlyContinue"; 9 | if ((get-acl C:\windows\system32\config\sam).Access | 10 | ? IdentityReference -match 'BUILTIN\\Users' | 11 | select -expandproperty filesystemrights | 12 | select-string 'Read') { 13 | write-host "May be vulnerable: Arbitrary Read permissions for SAM file" 14 | Set-Asset-Field -Name "CVE-2021-36934" -Value true 15 | 16 | } 17 | else { write-host "Does not seem to be vulnerable, SAM permissions are fine" } -------------------------------------------------------------------------------- /CVE-2021-36934/Workaround.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | $ErrorActionPreference = "SilentlyContinue"; 3 | if ((get-acl C:\windows\system32\config\sam).Access | 4 | ? IdentityReference -match 'BUILTIN\\Users' | 5 | select -expandproperty filesystemrights | 6 | select-string 'Read') { 7 | write-host "May be vulnerable: Arbitrary Read permissions for SAM file" 8 | Set-Asset-Field -Name "CVE-2021-36934" -Value true 9 | #https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-36934 10 | icacls C:\windows\system32\config\*.* /inheritance:e 11 | vssadmin delete shadows /for=c: /all /quiet 12 | Checkpoint-Computer -Description "CVE-2021-36934" -RestorePointType "MODIFY_SETTINGS" 13 | } 14 | else { 15 | write-host "Does not seem to be vulnerable, SAM permissions are fine" 16 | Set-Asset-Field -Name "CVE-2021-36934" -Value false 17 | } 18 | 19 | if ((get-acl C:\windows\system32\config\sam).Access | 20 | ? IdentityReference -match 'BUILTIN\\Users' | 21 | select -expandproperty filesystemrights | 22 | select-string 'Read') { 23 | write-host "May be vulnerable: Arbitrary Read permissions for SAM file" 24 | Set-Asset-Field -Name "CVE-2021-36934" -Value true 25 | } 26 | else { 27 | write-host "Does not seem to be vulnerable, SAM permissions are fine" 28 | Set-Asset-Field -Name "CVE-2021-36934" -Value false 29 | } -------------------------------------------------------------------------------- /Citrix Remover.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule -WarningAction SilentlyContinue 2 | $file = 'CitrixWorkspaceApp21.exe' 3 | $link = "https://downloadplugins.citrix.com/ReceiverUpdates/Prod/Receiver/Win/CitrixWorkspaceApp21.7.0.44.exe" 4 | $tmp = "$env:TEMP\$file" 5 | $client = New-Object System.Net.WebClient 6 | $client.DownloadFile($link, $tmp) 7 | Start-Process -filepath "$tmp" -ArgumentList "/silent /uninstall" -------------------------------------------------------------------------------- /Dell.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | $DownloadLocation = "C:\Temp" 3 | function Get-LatestDellCommand { 4 | $version = Invoke-WebRequest -Uri "https://raw.githubusercontent.com/flcdrg/au-packages/master/dellcommandupdate/dellcommandupdate.nuspec" -UseBasicParsing 5 | $nuspec = [xml]$version.Content 6 | if ($nuspec.package.metadata.version -eq $software.Version ) { 7 | Write-Output "No updates to Dell Command found" 8 | } 9 | } 10 | 11 | function Install-DellCommand { 12 | Test-Choco 13 | $software = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\" | Get-ItemProperty 14 | if ([Environment]::Is64BitOperatingSystem) { 15 | $software += Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" | Get-ItemProperty 16 | } 17 | 18 | #Readme: C:\Program Files (x86)\Dell\CommandUpdate\readme.txt 19 | $readme = $software | Where-Object { $_.DisplayName -like "*Dell Command*" } | select-object -ExpandProperty Readme 20 | $readme = Test-Path $readme 21 | 22 | if (!$readme) { 23 | Write-Host "Install Dell Command" 24 | Start-Process -FilePath "$($SyncroChocoDir)cup.exe" -ArgumentList "dellcommandupdate -y" -Wait -NoNewWindow 25 | $dcu = Test-path "C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe" 26 | if (!$dcu) { 27 | Write-Host "Failed to install Dell Command" 28 | Rmm-Alert -Category 'Syncro' -Body "Dell Command Not Installed" 29 | } 30 | } 31 | else { 32 | Write-Host "Dell Command Installed" 33 | } 34 | } 35 | function Test-Choco { 36 | $SyncroChocoDir = "C:\Program Files\RepairTech\Syncro\kabuto_app_manager\bin\" 37 | Test-Path $SyncroChocoDir 38 | if (!$SyncroChocoDir) { 39 | Rmm-Alert -Category 'Syncro' -Body "Chocolatey Not Installed" 40 | exit 1 41 | } 42 | } 43 | 44 | function Get-DellCommandInstalls { 45 | # Grab the registry uninstall keys to search against (x86 and x64) 46 | $software = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\" | Get-ItemProperty 47 | if ([Environment]::Is64BitOperatingSystem) { 48 | $software += Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" | Get-ItemProperty 49 | } 50 | 51 | $software = $software | Where-Object { $_.DisplayName -like "*Dell Command*" } | Select-Object @{N = "DisplayName"; E = { $_.DisplayName } }, @{N = "UninstallString"; E = { $_.UninstallString } }, @{N = "Version"; E = { $_.DisplayVersion } } 52 | 53 | if ($software.Version -lt '4.3.0') { 54 | Start-Process "msiexec.exe" -ArgumentList "/x {5669AB71-1302-4412-8DA1-CB69CD7B7324} /qn" -Wait 55 | Start-Process "msiexec.exe" -ArgumentList "/x {4CD85DD3-A024-4409-A0F2-F70DE1E4A935} /qn" -Wait 56 | Start-Process "msiexec.exe" -ArgumentList "/x {4CCADC13-F3AE-454F-B724-33F6D4E52022} /qn" -Wait 57 | Start-Process "msiexec.exe" -ArgumentList "/x {9C4C51BE-CFFB-4400-91BE-43E8285AD207} /qn" -Wait 58 | } 59 | else { 60 | Write-Output "Dell Command Installed on the right version or above" 61 | Close-Rmm-Alert -Category "Potentially Unwanted Applications" 62 | Get-LatestDellCommand 63 | } 64 | } 65 | 66 | 67 | Install-DellCommand 68 | 69 | 70 | Write-Output "Starting to look for updates" 71 | start-process "C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe" -ArgumentList "/scan -updateSeverity=critical,recommended -report=$DownloadLocation" -Wait -WindowStyle Hidden 72 | [xml]$XMLReport = get-content "$DownloadLocation\DCUApplicableUpdates.xml" -ErrorAction SilentlyContinue 73 | #We now remove the item, because we don't need it anymore, and sometimes fails to overwrite 74 | remove-item "$DownloadLocation\DCUApplicableUpdates.xml" -Force -ErrorAction SilentlyContinue 75 | 76 | $numofupdates = ($XMLReport.updates.update).count 77 | if ($numofupdates -gt 0) { 78 | $AvailableUpdates = $XMLReport.updates.update 79 | $report = $AvailableUpdates | Select-Object "name", "version", "date", "urgency", "type" | Format-Table -Autosize | Out-String 80 | $report 81 | 82 | 83 | 84 | $currentbiosversion = Get-WmiObject -Class Win32_BIOS | Select-Object -ExpandProperty SMBIOSBIOSVersion 85 | $newestbiosversion = ($XMLReport.updates.update | Where-Object { $_.type -eq "BIOS" }).version 86 | if ($null -eq $newestbiosversion) { 87 | $newestbiosversion = "$currentbiosversion" 88 | } 89 | Write-Output "Current BIOS Version: $currentbiosversion" 90 | Write-Output "Newest BIOS Version: $newestbiosversion" 91 | #Rmm-Alert -Category 'DellFirmware' -Body "$report" 92 | if ($currentbiosversion -eq $newestbiosversion) { 93 | "BIOS version is current" 94 | Close-Rmm-Alert -Category 'DellBios' 95 | } 96 | else { 97 | "BIOS version is out of date" 98 | $DownloadLocation = "C:\Program Files\Dell\CommandUpdate" 99 | start-process "C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe" -ArgumentList "/applyUpdates -autoSuspendBitLocker=enable -reboot=disable -updateType=bios" -Wait 100 | 101 | #Rmm-Alert -Category "Dell BIOS" -Body "BIOS version is out of date and automatic update failed" 102 | } 103 | } -------------------------------------------------------------------------------- /DellWarranty/DellWarranty.ps1: -------------------------------------------------------------------------------- 1 | $DellClientID = "" 2 | $DellClientSecret = "" 3 | $SyncroSubdomain = "" 4 | $SyncroAPIKey = "" 5 | function get-DellWarranty([Parameter(Mandatory = $true)]$SourceDevice) { 6 | $today = Get-Date -Format yyyy-MM-dd 7 | $AuthURI = "https://apigtwb2c.us.dell.com/auth/oauth/v2/token" 8 | if ($Global:TokenAge -lt (get-date).AddMinutes(-55)) { $global:Token = $null } 9 | If ($null -eq $global:Token) { 10 | $OAuth = "$global:DellClientID`:$global:DellClientSecret" 11 | $Bytes = [System.Text.Encoding]::ASCII.GetBytes($OAuth) 12 | $EncodedOAuth = [Convert]::ToBase64String($Bytes) 13 | $headersAuth = @{ "authorization" = "Basic $EncodedOAuth" } 14 | $Authbody = 'grant_type=client_credentials' 15 | $AuthResult = Invoke-RESTMethod -Method Post -Uri $AuthURI -Body $AuthBody -Headers $HeadersAuth 16 | $global:token = $AuthResult.access_token 17 | $Global:TokenAge = (get-date) 18 | } 19 | 20 | $headersReq = @{ "Authorization" = "Bearer $global:Token" } 21 | $ReqBody = @{ servicetags = $SourceDevice } 22 | $WarReq = Invoke-RestMethod -Uri "https://apigtwb2c.us.dell.com/PROD/sbil/eapi/v5/asset-entitlements" -Headers $headersReq -Body $ReqBody -Method Get -ContentType "application/json" 23 | $warlatest = $warreq.entitlements.enddate | sort-object | select-object -last 1 24 | $WarrantyState = if ($warlatest -le $today) { "Expired" } else { "OK" } 25 | if ($warreq.entitlements.serviceleveldescription) { 26 | $WarObj = [PSCustomObject]@{ 27 | 'Warranty Product name' = $warreq.entitlements.serviceleveldescription -join "`n" 28 | 'StartDate' = (($warreq.entitlements.startdate | sort-object -Descending | select-object -last 1) -split 'T')[0] 29 | 'EndDate' = (($warreq.entitlements.enddate | sort-object | select-object -last 1) -split 'T')[0] 30 | 'Warranty Status' = $WarrantyState 31 | } 32 | } 33 | else { 34 | $WarObj = [PSCustomObject]@{ 35 | 'Warranty Product name' = 'Could not get warranty information' 36 | 'StartDate' = $null 37 | 'EndDate' = $null 38 | 'Warranty Status' = 'Could not get warranty information' 39 | } 40 | } 41 | return $WarObj 42 | } 43 | function GetAll-Customers () { 44 | 45 | <# 46 | .SYNOPSIS 47 | This function is used to get all customer records in Syncro. 48 | .DESCRIPTION 49 | The function connects to your Syncro environment and finds all customers 50 | .EXAMPLE 51 | GetAll-Customers -SyncroSubDomain $SyncroSubDomain -SyncroAPIKey $SyncroAPIkey 52 | Retrieves all customers 53 | .NOTES 54 | NAME: GetAll-Customers 55 | #> 56 | 57 | [cmdletbinding()] 58 | 59 | param 60 | ( 61 | [Parameter(Mandatory = $true)] 62 | [string]$SyncroSubdomain, 63 | [string]$SyncroAPIKey, 64 | [string]$page 65 | ) 66 | 67 | 68 | $url = "https://$($SyncroSubdomain).syncromsp.com/api/v1/customers?api_key=$($SyncroAPIKey)&page=$($page)" 69 | $response = Invoke-RestMethod -Uri $url -Method Get -ContentType 'application/json' 70 | $response 71 | 72 | } 73 | 74 | function Get-SyncroAssets () { 75 | 76 | [cmdletbinding()] 77 | 78 | param 79 | ( 80 | [Parameter(Mandatory = $true)] 81 | [string]$SyncroSubdomain, 82 | [string]$SyncroAPIKey, 83 | [string]$page, 84 | [string]$customer_id 85 | ) 86 | 87 | 88 | $uri = "https://$SyncroSubdomain.syncromsp.com/api/v1/customer_assets?api_key=$SyncroAPIKey&customer_id=$customer_id&page=$($page)" 89 | $response = Invoke-RestMethod -Uri $uri 90 | $response = $response.ToString().Replace("AV", "_AV") | ConvertFrom-Json 91 | $response 92 | 93 | } 94 | ###Fnd All Syncro Customers########## 95 | Write-Host "Getting All Customers In Syncro" 96 | 97 | $SyncroCustomers = Do { 98 | (GetAll-Customers -SyncroSubdomain $SyncroSubdomain -SyncroAPIKey $SyncroAPIKey -page $page).customers 99 | $page = $page + 1 100 | }Until ($page -gt $totalPageCount) 101 | Write-Host "Found $($SyncroCustomers.Count) Customers in Syncro" -ForegroundColor Green 102 | 103 | 104 | 105 | 106 | foreach ($customer in $SyncroCustomers) { 107 | $customer_id = $customer.id 108 | $customername = $customer.business_and_full_name 109 | 110 | #connect to syncro and pull all assets for the customer by ID 111 | 112 | Write-Host "Getting All assets for $customername In Syncro" 113 | 114 | $page = 1 115 | $totalPageCount = (Get-SyncroAssets -SyncroSubdomain $SyncroSubdomain -SyncroAPIKey $SyncroAPIKey -customer_id $customer_id -page 1).meta.total_pages 116 | $SyncroAssets = Do { 117 | (Get-SyncroAssets -SyncroSubdomain $SyncroSubdomain -SyncroAPIKey $SyncroAPIKey -page $page -customer_id $customer_id).assets 118 | $page = $page + 1 119 | }Until ($page -gt $totalPageCount) 120 | Write-Host $totalPageCount -BackgroundColor Red 121 | Write-Host "Found $($SyncroAssets.Count) assets in Syncro" -ForegroundColor Green 122 | 123 | foreach ($d in $data.assets) { 124 | if ($d.properties.kabuto_information.general.manufacturer -like "*dell*") { 125 | Write-Host "Found Dell Computer" -ForegroundColor Green 126 | $servicetag = $d.properties.kabuto_information.general.serial_number 127 | $id = $d.id 128 | Write-Host "Computer has serial $servicetag and has Syncro ID $id" 129 | $warranty = get-DellWarranty -SourceDevice $servicetag 130 | $post = @{ 131 | "properties" = 132 | @{ 133 | "Warranty Product Name" = "$($warranty.'Warranty Product name' | Out-string)" 134 | "Warranty Start" = "$($warranty.StartDate | Out-String)" 135 | "Warranty End" = "$($warranty.EndDate |Out-String)" 136 | "Warranty Status" = "$($warranty.'Warranty Status' | Out-String)" 137 | } 138 | } | ConvertTo-Json 139 | 140 | $url = "https://$SyncroSubdomain.syncromsp.com/api/v1/customer_assets/$($id)?api_key=$SyncroAPIKey" 141 | Invoke-WebRequest -uri $url -Method PUT -Body $post -ContentType 'application/json' 142 | } 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /DellWarranty/README.md: -------------------------------------------------------------------------------- 1 | # Dell Warranty 2 | Used part of [cyberdrain's](https://www.cyberdrain.com/automating-with-powershell-automating-warranty-information-reporting/) warranty script to grab Dell assets from Syncro and query the warranty status. Then used the asset API to push that status into Custom Fields. 3 | 4 | ### Use this at your own risk. 5 | 6 | You will need the API Token to have permissions for: 7 | 8 | Customer: 9 | - 10 | - Customers - View Detail 11 | - Customers - List/Search 12 | - Assets - Edit 13 | - Assets - List/Search 14 | - Assets - View Details 15 | 16 | 17 | Need the following custom fields: 18 | - 19 | - Warranty Product Name (Text area) 20 | - Warranty Start (Date Field) 21 | - Warranty End (Date Field) 22 | - Warranty Status (Text Field) 23 | 24 | ## Dell: 25 | 26 | Go to the [Dell TechDirect](https://tdm.dell.com/portal/) website and register if you do not yet have an account. Complete the enrollment. 27 | 28 | After registration, browse to the Dell TechDirect API enrollment page and wait for approval. This is a manual procedure so can take a day or two. 29 | 30 | When the approval has been given, request a new API key and save this in a secure location. -------------------------------------------------------------------------------- /Get-DeviceIdleTIme.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | 3 | # Credit for the PInvoke code to Andy Arismendi 4 | # (see https://stackoverflow.com/questions/15845508/get-idle-time-of-machine) 5 | # Adaptation for Syncro by Bill Bardon 6 | 7 | #NOTE: Add a custom asset field named "Idle time", or choose your own name and modify the last line of this script to match 8 | 9 | Add-Type @' 10 | using System; 11 | using System.Diagnostics; 12 | using System.Runtime.InteropServices; 13 | 14 | namespace PInvoke.Win32 { 15 | 16 | public static class UserInput { 17 | 18 | [DllImport("user32.dll", SetLastError=false)] 19 | private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 20 | 21 | [StructLayout(LayoutKind.Sequential)] 22 | private struct LASTINPUTINFO { 23 | public uint cbSize; 24 | public int dwTime; 25 | } 26 | 27 | public static DateTime LastInput { 28 | get { 29 | DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount); 30 | DateTime lastInput = bootTime.AddMilliseconds(LastInputTicks); 31 | return lastInput; 32 | } 33 | } 34 | 35 | public static TimeSpan IdleTime { 36 | get { 37 | return DateTime.UtcNow.Subtract(LastInput); 38 | } 39 | } 40 | 41 | public static int LastInputTicks { 42 | get { 43 | LASTINPUTINFO lii = new LASTINPUTINFO(); 44 | lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); 45 | GetLastInputInfo(ref lii); 46 | return lii.dwTime; 47 | } 48 | } 49 | } 50 | } 51 | '@ 52 | 53 | $Last = [PInvoke.Win32.UserInput]::LastInput 54 | $Idle = [PInvoke.Win32.UserInput]::IdleTime 55 | $DTnow = [DateTimeOffset]::Now 56 | 57 | $LastStr = $Last.ToLocalTime().ToString("MMM d h:mm tt") 58 | $IdleStr = $Idle.ToString("d\d\ h\h\ m\m") 59 | $DTnowStr = $DTnow.ToString("MMM d h:mm tt") 60 | Write-Host "$DTnowStr, last input was at $LastStr, Idle for $IdleStr" 61 | 62 | Set-Asset-Field -Subdomain $subdomain -Name "Idle time" -Value "Last input was at $LastStr, Idle for $IdleStr" 63 | -------------------------------------------------------------------------------- /MDE/Downlevel.ps1: -------------------------------------------------------------------------------- 1 | $WorkspaceID = "KEY" 2 | $WorkspaceKEY = "KEY" 3 | Start-Process "C:\ProgramData\Syncro\bin\MMASetup-AMD64.exe" -ArgumentList "/Q /T:C:\ProgramData\PMP /C" -wait 4 | Start-Process "C:\ProgramData\PMP\Setup.exe" -ArgumentList "/qn NOAPM=0 ADD_OPINSIGHTS_WORKSPACE=1 OPINSIGHTS_WORKSPACE_AZURE_CLOUD_TYPE=0 OPINSIGHTS_WORKSPACE_ID=$WorkspaceID OPINSIGHTS_WORKSPACE_KEY=$WorkspaceKEY AcceptEndUserLicenseAgreement=1" -wait 5 | Remove-Item "C:\ProgramData\PMP" -recurse -force 6 | -------------------------------------------------------------------------------- /MDE/README.md: -------------------------------------------------------------------------------- 1 | # Downlevel devices 2 | ## Windows Server 2008 R2 SP1, 2012 R2 and 2016 3 | 4 | 5 | Upload the MMASetup-AMD64.exe to Syncro and apply it in the script to the Syncro Bin directory. 6 | 7 | `C:\ProgramData\Syncro\bin\MMASetup-AMD64.exe` 8 | 9 | ![](msedge_2021-07-01_11-48-31.png) 10 | 11 | ### MS Download link for MMASetup-AMD64 12 | https://download.microsoft.com/download/3/c/d/3cd6f5b3-3fbe-43c0-88e0-8256d02db5b7/MMASetup-AMD64.exe 13 | 14 | SHA256 6EF939A9CF03533B371D0B4FF8DC76615E1A12C740ACE9F30D887CEBB9C5DE4D 15 | -------------------------------------------------------------------------------- /MDE/msedge_2021-07-01_11-48-31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysadam/Syncro/9b43f957a1e3899ec7fef17bcfcffdbcc59b2950/MDE/msedge_2021-07-01_11-48-31.png -------------------------------------------------------------------------------- /Monitor - WOL Status for BIOS and OS.ps1: -------------------------------------------------------------------------------- 1 | #Import-Module $env:SyncroModule 2 | 3 | 4 | function Set-WakeEnabled 5 | { 6 | <# 7 | .SYNOPSIS 8 | 9 | Set WoL on nic 10 | 11 | Author: Jan-Henrik Damaschke (@jandamaschke) 12 | License: BSD 3-Clause 13 | Required Dependencies: None 14 | Optional Dependencies: None 15 | 16 | .DESCRIPTION 17 | 18 | Set Wake on Lan (WOL) settings for specific network interface card 19 | 20 | .PARAMETER InterfaceName 21 | 22 | Specifies the name of the interface where WoL setting should be changed 23 | 24 | .PARAMETER WakeEnabled 25 | 26 | Specifies if WoL should be enabled or disabled 27 | 28 | .EXAMPLE 29 | 30 | PS C:\> Set-WakeEnabled -InterfaceName Ethernet -WakeEnabled $true 31 | 32 | .LINK 33 | 34 | http://itinsights.org/ 35 | #> 36 | 37 | [CmdletBinding()] Param( 38 | [Parameter(Mandatory = $True, ParameterSetName="InterfaceName")] 39 | [String] 40 | $InterfaceName, 41 | 42 | [Parameter(Mandatory = $True)] 43 | [String] 44 | $WakeEnabled, 45 | 46 | [Parameter(Mandatory = $True, ParameterSetName="ConnectionID")] 47 | [String] 48 | $NetConnectionID 49 | ) 50 | 51 | If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { 52 | Write-Warning "You do not have Administrator rights to run this script!`nPlease re-run this script as an Administrator!" 53 | Break 54 | } 55 | 56 | $nicsWakeEnabled = Get-CimInstance -ClassName MSPower_DeviceWakeEnable -Namespace root/wmi 57 | $nics = Get-CimInstance -ClassName Win32_NetworkAdapter | Where-Object NetEnabled -eq $true 58 | 59 | if ($InterfaceName){ 60 | $nic = $nics | Where-Object Name -eq $InterfaceName 61 | } 62 | else { 63 | $nic = $nics | Where-Object NetConnectionID -eq $NetConnectionID 64 | } 65 | 66 | $nicWakeEnabled = $nicsWakeEnabled | Where-Object InstanceName -like "*$($nic.PNPDeviceID)*" 67 | 68 | $enabled = $nicWakeEnabled.Enable 69 | 70 | if (!($enabled -and $WakeEnabled)){ 71 | Set-CimInstance $nicWakeEnabled -Property @{Enable=$enabled} 72 | } 73 | } 74 | 75 | $adapter = Get-NetAdapter | Select -ExpandProperty Name 76 | $adapter | foreach-object { 77 | Set-WakeEnabled -InterfaceName $_ -WakeEnabled $true 78 | } 79 | 80 | 81 | $PPNuGet = Get-PackageProvider -ListAvailable | Where-Object { $_.Name -eq "Nuget" } 82 | if (!$PPNuget) { 83 | Write-Host "Installing Nuget provider" -foregroundcolor Green 84 | Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force 85 | } 86 | 87 | $PSGallery = Get-PSRepository -Name PsGallery 88 | if (!$PSGallery) { 89 | Write-Host "Installing PSGallery" -foregroundcolor Green 90 | Set-PSRepository -InstallationPolicy Trusted -Name PSGallery 91 | } 92 | 93 | $PsGetVersion = (get-module PowerShellGet).version 94 | if ($PsGetVersion -lt [version]'2.0') { 95 | Write-Host "Installing latest version of PowerShellGet provider" -foregroundcolor Green 96 | install-module PowerShellGet -MinimumVersion 2.2 -Force 97 | Write-Host "Reloading Modules" -foregroundcolor Green 98 | Remove-Module PowerShellGet -Force 99 | Remove-module PackageManagement -Force 100 | Import-Module PowerShellGet -MinimumVersion 2.2 -Force 101 | Write-Host "Updating PowerShellGet" -foregroundcolor Green 102 | Install-Module -Name PowerShellGet -MinimumVersion 2.2.3 -force 103 | #Rmm-Alert "You must rerun the script to succesfully get the WOL status. PowerShellGet was found out of date." -ForegroundColor red 104 | } 105 | 106 | Write-Host "Checking Manufacturer" -foregroundcolor Green 107 | $Manufacturer = (Get-WmiObject -Class:Win32_ComputerSystem).Manufacturer 108 | 109 | if ($Manufacturer -like "*Dell*") { 110 | Write-Host "Manufacturer is Dell. Installing Module and trying to get WOL state" -foregroundcolor Green 111 | Write-Host "Installing Dell Bios Provider if needed" -foregroundcolor Green 112 | $Mod = Get-Module DellBIOSProvider 113 | if (!$mod) { 114 | Install-Module -Name DellBIOSProvider -Force 115 | } 116 | import-module DellBIOSProvider 117 | try { 118 | $WOLMonitor = get-item -Path "DellSmBios:\PowerManagement\WakeOnLan" -ErrorAction SilentlyContinue 119 | if($WOLMonitor.currentvalue -eq "LanOnly"){ $WOLState = "Healthy"} 120 | } 121 | catch { 122 | write-host "an error occured. Could not get WOL setting." 123 | } 124 | } 125 | 126 | if ($Manufacturer -like "*HP*" -or $Manufacturer -like "*Hewlett*") { 127 | Write-Host "Manufacturer is HP. Installing module and trying to get WOL State." -foregroundcolor Green 128 | Write-Host "Installing HP Provider if needed." -foregroundcolor Green 129 | $Mod = Get-Module HPCMSL 130 | if (!$mod) { 131 | Install-Module -Name HPCMSL -Force -AcceptLicense 132 | } 133 | import-module HPCMSL 134 | try { 135 | $WolTypes = get-hpbiossettingslist | Where-Object { $_.Name -like "*Wake On Lan*" } 136 | $WOLState = ForEach ($WolType in $WolTypes) { 137 | write-host "Setting WOL Type: $($WOLType.Name)" 138 | get-HPBIOSSettingValue -name $($WolType.name) -ErrorAction Stop 139 | } 140 | } 141 | catch { 142 | write-host "an error occured. Could not find WOL state" 143 | } 144 | } 145 | 146 | if ($Manufacturer -like "*Lenovo*") { 147 | Write-Host "Manufacturer is Lenovo. Trying to get via WMI" -foregroundcolor Green 148 | try { 149 | Write-Host "Getting BIOS." -foregroundcolor Green 150 | $currentSetting = (Get-WmiObject -ErrorAction Stop -class "Lenovo_BiosSetting" -namespace "root\wmi") | Where-Object { $_.CurrentSetting -ne "" } 151 | $WOLStatus = $currentSetting.currentsetting | ConvertFrom-Csv -Delimiter "," -Header "Setting", "Status" | Where-Object { $_.setting -eq "Wake on lan" } 152 | $WOLStatus = $WOLStatus.status -split ";" 153 | if ($WOLStatus[0] -eq "Primary") { $WOLState = "Healthy" } 154 | } 155 | catch { 156 | write-host "an error occured. Could not find WOL state" 157 | } 158 | } 159 | 160 | $NicsWithWake = Get-CimInstance -ClassName "MSPower_DeviceWakeEnable" -Namespace "root/wmi" | Where-Object { $_.Enable -eq $False } 161 | if (!$NicsWithWake) { 162 | $NICWOL = "Healthy - All NICs enabled for WOL within the OS." 163 | } 164 | else { 165 | #Rmm-Alert -Category 'WOL (OS)' -Body "Unhealthy - NIC does not have WOL enabled inside of the OS." 166 | Write-Host "Unhealthy - NIC does not have WOL enabled inside of the OS." 167 | } 168 | 169 | if (!$WOLState) { 170 | #Rmm-Alert -Category 'WOL (BIOS)' -Body "Unhealthy - Could not find WOL state" 171 | Write-Host "Unhealthy - Could not find WOL state" 172 | } -------------------------------------------------------------------------------- /PUP/BrowserExtension/ChromeTest.ps1: -------------------------------------------------------------------------------- 1 | $OutputFolder = "C:\Temp\" 2 | $ExtensionId = $null 3 | 4 | 5 | ##: If OutputFolder param wasn't given, output the audit file to the desktop 6 | if (!$OutputFolder -or !(Test-Path -Path $OutputFolder)) { 7 | $auditfolderpath = "$($env:USERPROFILE)\Desktop" 8 | } 9 | else { 10 | $auditfolderpath = $OutputFolder 11 | } 12 | 13 | ##: This is the file we will write the extension list to 14 | $auditfilepath = "$($auditfolderpath)\$($env:USERNAME)-$($env:COMPUTERNAME).txt" 15 | if ( !(Test-Path -Path $auditfilepath) ) { 16 | Write-Output "Creating: [$auditfilepath]" 17 | if (!($WhatIf)) { 18 | Write-Output "" | Out-File -FilePath $auditfilepath 19 | } 20 | } 21 | if (!($WhatIf)) { 22 | Clear-Content $auditfilepath 23 | } 24 | 25 | ##: The extensions folder is in local appdata 26 | $extension_folders = Get-ChildItem -Path "$($env:LOCALAPPDATA)\Google\Chrome\User Data\Default\Extensions" 27 | 28 | ##: Loop through each extension folder 29 | foreach ($extension_folder in $extension_folders ) { 30 | 31 | ##: Get the version specific folder within this extension folder 32 | $version_folders = Get-ChildItem -Path "$($extension_folder.FullName)" 33 | 34 | ##: Loop through the version folders found 35 | foreach ($version_folder in $version_folders) { 36 | ##: The extension folder name is the app id in the Chrome web store 37 | $appid = $extension_folder.BaseName 38 | 39 | ##: First check the manifest for a name 40 | $name = "" 41 | if ( (Test-Path -Path "$($version_folder.FullName)\manifest.json") ) { 42 | try { 43 | $json = Get-Content -Raw -Path "$($version_folder.FullName)\manifest.json" | ConvertFrom-Json 44 | $name = $json.name 45 | } 46 | catch { 47 | #$_ 48 | $name = "" 49 | } 50 | } 51 | 52 | ##: If we find _MSG_ in the manifest it's probably an app 53 | if ( $name -like "*MSG*" ) { 54 | ##: Sometimes the folder is en 55 | if ( Test-Path -Path "$($version_folder.FullName)\_locales\en\messages.json" ) { 56 | try { 57 | $json = Get-Content -Raw -Path "$($version_folder.FullName)\_locales\en\messages.json" | ConvertFrom-Json 58 | $name = $json.appName.message 59 | ##: Try a lot of different ways to get the name 60 | if (!$name) { 61 | $name = $json.extName.message 62 | } 63 | if (!$name) { 64 | $name = $json.extensionName.message 65 | } 66 | if (!$name) { 67 | $name = $json.app_name.message 68 | } 69 | if (!$name) { 70 | $name = $json.application_title.message 71 | } 72 | } 73 | catch { 74 | #$_ 75 | $name = "" 76 | } 77 | } 78 | ##: Sometimes the folder is en_US 79 | if ( Test-Path -Path "$($version_folder.FullName)\_locales\en_US\messages.json" ) { 80 | try { 81 | $json = Get-Content -Raw -Path "$($version_folder.FullName)\_locales\en_US\messages.json" | ConvertFrom-Json 82 | $name = $json.appName.message 83 | ##: Try a lot of different ways to get the name 84 | if (!$name) { 85 | $name = $json.extName.message 86 | } 87 | if (!$name) { 88 | $name = $json.extensionName.message 89 | } 90 | if (!$name) { 91 | $name = $json.app_name.message 92 | } 93 | if (!$name) { 94 | $name = $json.application_title.message 95 | } 96 | } 97 | catch { 98 | #$_ 99 | $name = "" 100 | } 101 | } 102 | } 103 | 104 | ##: If we can't get a name from the extension use the app id instead 105 | if ( !$name ) { 106 | $name = "[$($appid)]" 107 | } 108 | 109 | ##: App id given on command line and this one matched it 110 | if ( $ExtensionId -and ($appid -eq $ExtensionId) ) { 111 | if ( $Remove ) { 112 | Write-Output "Removing item: [$appid] at path: [$($extension_folder.FullName)]" 113 | if (!($WhatIf)) { 114 | ##: Remove the extension folder 115 | if (Test-Path -Path $extension_folder.FullName) { 116 | Remove-Item -Path $extension_folder.FullName -Recurse -Force 117 | } 118 | 119 | ##: Remove the extension registry key 120 | if (Test-Path -Path "HKCU:\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings") { 121 | if ( Get-ItemProperty -Name "$appid" -Path "HKCU:\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings" ) { 122 | Remove-ItemProperty -Name "$appid" -Path "HKCU:\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings" 123 | } 124 | } 125 | } 126 | } 127 | else { 128 | ##: Dump to a file 129 | Write-Output "Appending: [$name ($($version_folder)) - $appid] to audit file: [$auditfilepath]" 130 | if (!($WhatIf)) { 131 | Write-Output "Chrome ---- $name ($($version_folder)) - $appid" | Out-File -Append $auditfilepath 132 | } 133 | ##: Exit with a TRUE value if the given extension id was found 134 | $retval = $true 135 | } 136 | 137 | ##: App id given on command line and this did NOT match it 138 | } 139 | elseif ( $ExtensionId -and ($appid -ne $ExtensionId) ) { 140 | ##: NOP 141 | #Write-Output "Skipping: [$appid] output" 142 | ##: App id not given on command line 143 | } 144 | else { 145 | ##: Dump to audit file 146 | Write-Output "Appending: [$name ($($version_folder)) - $appid] to audit file: [$auditfilepath]" 147 | if (!($WhatIf)) { 148 | Write-Output "Chrome ---- $name ($($version_folder)) - $appid" | Out-File -Append $auditfilepath 149 | } 150 | } 151 | 152 | } 153 | 154 | } 155 | 156 | ##: The extensions folder is in local appdata 157 | $extension_folders = Get-ChildItem -Path "$($env:LOCALAPPDATA)\Microsoft\Edge\User Data\Default\Extensions" 158 | 159 | ##: Loop through each extension folder 160 | foreach ($extension_folder in $extension_folders ) { 161 | 162 | ##: Get the version specific folder within this extension folder 163 | $version_folders = Get-ChildItem -Path "$($extension_folder.FullName)" 164 | 165 | ##: Loop through the version folders found 166 | foreach ($version_folder in $version_folders) { 167 | ##: The extension folder name is the app id in the Chrome web store 168 | $appid = $extension_folder.BaseName 169 | 170 | ##: First check the manifest for a name 171 | $name = "" 172 | if ( (Test-Path -Path "$($version_folder.FullName)\manifest.json") ) { 173 | try { 174 | $json = Get-Content -Raw -Path "$($version_folder.FullName)\manifest.json" | ConvertFrom-Json 175 | $name = $json.name 176 | } 177 | catch { 178 | #$_ 179 | $name = "" 180 | } 181 | } 182 | 183 | ##: If we find _MSG_ in the manifest it's probably an app 184 | if ( $name -like "*MSG*" ) { 185 | ##: Sometimes the folder is en 186 | if ( Test-Path -Path "$($version_folder.FullName)\_locales\en\messages.json" ) { 187 | try { 188 | $json = Get-Content -Raw -Path "$($version_folder.FullName)\_locales\en\messages.json" | ConvertFrom-Json 189 | $name = $json.appName.message 190 | ##: Try a lot of different ways to get the name 191 | if (!$name) { 192 | $name = $json.extName.message 193 | } 194 | if (!$name) { 195 | $name = $json.extensionName.message 196 | } 197 | if (!$name) { 198 | $name = $json.app_name.message 199 | } 200 | if (!$name) { 201 | $name = $json.application_title.message 202 | } 203 | } 204 | catch { 205 | #$_ 206 | $name = "" 207 | } 208 | } 209 | ##: Sometimes the folder is en_US 210 | if ( Test-Path -Path "$($version_folder.FullName)\_locales\en_US\messages.json" ) { 211 | try { 212 | $json = Get-Content -Raw -Path "$($version_folder.FullName)\_locales\en_US\messages.json" | ConvertFrom-Json 213 | $name = $json.appName.message 214 | ##: Try a lot of different ways to get the name 215 | if (!$name) { 216 | $name = $json.extName.message 217 | } 218 | if (!$name) { 219 | $name = $json.extensionName.message 220 | } 221 | if (!$name) { 222 | $name = $json.app_name.message 223 | } 224 | if (!$name) { 225 | $name = $json.application_title.message 226 | } 227 | } 228 | catch { 229 | #$_ 230 | $name = "" 231 | } 232 | } 233 | } 234 | 235 | ##: If we can't get a name from the extension use the app id instead 236 | if ( !$name ) { 237 | $name = "[$($appid)]" 238 | } 239 | 240 | ##: App id given on command line and this one matched it 241 | if ( $ExtensionId -and ($appid -eq $ExtensionId) ) { 242 | if ( $Remove ) { 243 | Write-Output "Removing item: [$appid] at path: [$($extension_folder.FullName)]" 244 | if (!($WhatIf)) { 245 | ##: Remove the extension folder 246 | if (Test-Path -Path $extension_folder.FullName) { 247 | Remove-Item -Path $extension_folder.FullName -Recurse -Force 248 | } 249 | 250 | ##: Remove the extension registry key 251 | if (Test-Path -Path "HKCU:\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings") { 252 | if ( Get-ItemProperty -Name "$appid" -Path "HKCU:\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings" ) { 253 | Remove-ItemProperty -Name "$appid" -Path "HKCU:\SOFTWARE\Google\Chrome\PreferenceMACs\Default\extensions.settings" 254 | } 255 | } 256 | } 257 | } 258 | else { 259 | ##: Dump to a file 260 | Write-Output "Appending: [$name ($($version_folder)) - $appid] to audit file: [$auditfilepath]" 261 | if (!($WhatIf)) { 262 | Write-Output "Microsoft Edge ---- $name ($($version_folder)) - $appid" | Out-File -Append $auditfilepath 263 | } 264 | ##: Exit with a TRUE value if the given extension id was found 265 | $retval = $true 266 | } 267 | 268 | ##: App id given on command line and this did NOT match it 269 | } 270 | elseif ( $ExtensionId -and ($appid -ne $ExtensionId) ) { 271 | ##: NOP 272 | #Write-Output "Skipping: [$appid] output" 273 | ##: App id not given on command line 274 | } 275 | else { 276 | ##: Dump to audit file 277 | Write-Output "Appending: [$name ($($version_folder)) - $appid] to audit file: [$auditfilepath]" 278 | if (!($WhatIf)) { 279 | Write-Output "Microsoft Edge ---- $name ($($version_folder)) - $appid" | Out-File -Append $auditfilepath 280 | } 281 | } 282 | 283 | } 284 | 285 | } -------------------------------------------------------------------------------- /PUP/BrowserExtension/ChromeTest1.ps1: -------------------------------------------------------------------------------- 1 | function Get-ChromeExtension { 2 | <# 3 | .SYNOPSIS 4 | Gets Chrome Extensions from a local or remote computer 5 | .DESCRIPTION 6 | Gets the name, version and description of the installed extensions 7 | Admin rights are required to access other profiles on the local computer or 8 | any profiles on a remote computer. 9 | Internet access is required to lookup the extension ID on the Chrome web store 10 | .PARAMETER Computername 11 | The name of the computer to connect to 12 | The default is the local machine 13 | .PARAMETER Username 14 | The username to query i.e. the userprofile (c:\users\) 15 | If this parameter is omitted, all userprofiles are searched 16 | .EXAMPLE 17 | PS C:\> Get-ChromeExtension 18 | 19 | This command will get the Chrome extensions from all the user profiles on the local computer 20 | .EXAMPLE 21 | PS C:\> Get-ChromeExtension -username Jsmith 22 | 23 | This command will get the Chrome extensions installed under c:\users\jsmith on the local computer 24 | 25 | .EXAMPLE 26 | PS C:\> Get-ChromeExtension -Computername PC1234,PC4567 27 | 28 | This command will get the Chrome extensions from all the user profiles on the two remote computers specified 29 | .NOTES 30 | Version 1.0 31 | #> 32 | [cmdletbinding()] 33 | PARAM( 34 | [parameter(Position = 0)] 35 | [string]$Computername = $ENV:COMPUTERNAME 36 | , 37 | [parameter(Position = 1)] 38 | [string]$Username 39 | ) 40 | BEGIN { 41 | 42 | function Get-ExtensionInfo { 43 | <# 44 | .SYNOPSIS 45 | Get Name and Version of the a Chrome extension 46 | .PARAMETER Folder 47 | A directory object (under %userprofile%\AppData\Local\Google\Chrome\User Data\Default\Extensions) 48 | #> 49 | [cmdletbinding()] 50 | PARAM( 51 | [parameter(Position = 0)] 52 | [IO.DirectoryInfo]$Folder 53 | ) 54 | BEGIN { 55 | 56 | $BuiltInExtensions = @{ 57 | 'nmmhkkegccagdldgiimedpiccmgmieda' = 'Google Wallet' 58 | 'mhjfbmdgcfjbbpaeojofohoefgiehjai' = 'Chrome PDF Viewer' 59 | 'pkedcjkdefgpdelpbcmbmeomcjbeemfm' = 'Chrome Cast' 60 | } 61 | 62 | } 63 | PROCESS { 64 | # Extension folders are under %userprofile%\AppData\Local\Google\Chrome\User Data\Default\Extensions 65 | # Folder names match extension ID e.g. blpcfgokakmgnkcojhhkbfbldkacnbeo 66 | $ExtID = $Folder.Name 67 | 68 | if ($Folder.FullName -match '\\Users\\(?[^\\]+)\\') { 69 | $Username = $Matches['username'] 70 | } 71 | else { 72 | $Username = '' 73 | } 74 | 75 | # There can be more than one version installed. Get the latest one 76 | $LastestExtVersionInstallFolder = Get-ChildItem -Path $Folder.Fullname | Where-Object { $_.Name -match '^[0-9\._-]+$' } | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 -ExpandProperty Name 77 | 78 | # Get the version from the JSON manifest 79 | if (Test-Path -Path "$($Folder.Fullname)\$LastestExtVersionInstallFolder\Manifest.json") { 80 | 81 | $Manifest = Get-Content -Path "$($Folder.Fullname)\$LastestExtVersionInstallFolder\Manifest.json" -Raw | ConvertFrom-Json 82 | if ($Manifest) { 83 | if (-not([string]::IsNullOrEmpty($Manifest.version))) { 84 | $Version = $Manifest.version 85 | } 86 | if (-not([string]::IsNullOrEmpty($Manifest.name))) { 87 | $Title = $Manifest.name 88 | } 89 | } 90 | } 91 | else { 92 | # Just use the folder name as the version 93 | $Version = $LastestExtVersionInstallFolder.Name 94 | } 95 | 96 | if ($BuiltInExtensions.ContainsKey($ExtID)) { 97 | # Built-in extensions do not appear in the Chrome Store 98 | 99 | $Title = $BuiltInExtensions[$ExtID] 100 | $Description = '' 101 | 102 | } 103 | else { 104 | # Lookup the extension in the Store 105 | $url = "https://chrome.google.com/webstore/detail/" + $ExtID + "?hl=en-us" 106 | <# 107 | try { 108 | # You may need to include proxy information 109 | # $WebRequest = Invoke-WebRequest -Uri $url -ErrorAction Stop -Proxy 'http://proxy:port' -ProxyUseDefaultCredentials 110 | 111 | $WebRequest = Invoke-WebRequest -Uri $url -ErrorAction Stop 112 | 113 | if ($WebRequest.StatusCode -eq 200) { 114 | 115 | # Get the HTML Page Title but remove ' - Chrome Web Store' 116 | if (-not([string]::IsNullOrEmpty($WebRequest.ParsedHtml.title))) { 117 | 118 | $ExtTitle = $WebRequest.ParsedHtml.title 119 | if ($ExtTitle -match '\s-\s.*$') { 120 | $Title = $ExtTitle -replace '\s-\s.*$', '' 121 | $extType = 'ChromeStore' 122 | 123 | } 124 | else { 125 | $Title = $ExtTitle 126 | } 127 | } 128 | 129 | # Screen scrape the Description meta-data 130 | $Description = $webRequest.AllElements.InnerHTML | Where-Object { $_ -match '' } | Select-object -First 1 | ForEach-Object { $Matches[1] } 131 | } 132 | } 133 | catch { 134 | Write-Warning "Error during webstore lookup for '$ExtID' - '$_'" 135 | 136 | }#> 137 | } 138 | 139 | [PSCustomObject][Ordered]@{ 140 | Name = $Title 141 | Version = $Version 142 | #Description = $Description 143 | Username = $Username 144 | ID = $ExtID 145 | } 146 | 147 | } 148 | } 149 | 150 | $ExtensionFolderPath = 'AppData\Local\Google\Chrome\User Data\Default\Extensions' 151 | 152 | } 153 | 154 | PROCESS { 155 | # Get profile list from Chromes local state 156 | $statePath = "C:\Users\${env:USERNAME}\AppData\Local\Google\Chrome\User Data\Local State" 157 | $state = Get-Content $statePath 158 | 159 | # Using Serializer instead of ConvertFrom-Json because https://github.com/PowerShell/PowerShell/issues/1755 160 | [void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions') 161 | $jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer 162 | $jsser.MaxJsonLength = $jsser.MaxJsonLength * 10 163 | 164 | $serProfiles = $jsser.DeserializeObject($state).profile.info_cache 165 | 166 | $profiles = @() 167 | $serProfiles.Keys.ForEach{ 168 | $profile = New-Object -TypeName psobject -Property @{ 169 | 'Id' = $_ 170 | } 171 | $profiles += $profile 172 | } 173 | 174 | Foreach ($p in $profiles) { 175 | $ExtensionFolderPath = "AppData\Local\Google\Chrome\User Data\$($p.id)\Extensions" 176 | Foreach ($Computer in $Computername) { 177 | if ($Username) { 178 | # Single userprofile 179 | $Path = Join-path -path "fileSystem::\\$Computer\C$\Users\$Username" -ChildPath $ExtensionFolderPath 180 | $Extensions = Get-ChildItem -Path $Path -Directory -ErrorAction SilentlyContinue 181 | 182 | } 183 | else { 184 | # All user profiles that contain this a Chrome extensions folder 185 | $Path = Join-path -path "fileSystem::\\$Computer\C$\Users\*" -ChildPath $ExtensionFolderPath 186 | $Extensions = @() 187 | Get-Item -Path $Path -ErrorAction SilentlyContinue | ForEach-Object { 188 | 189 | $Extensions += Get-ChildItem -Path $_ -Directory -ErrorAction SilentlyContinue 190 | } 191 | 192 | } 193 | 194 | if (-not($null -eq $Extensions)) { 195 | 196 | Foreach ($Extension in $Extensions) { 197 | 198 | $Output = Get-ExtensionInfo -Folder $Extension 199 | $Output | Add-Member -MemberType NoteProperty -Name 'Computername' -Value $Computer 200 | $Output | Add-Member -MemberType NoteProperty -Name 'Profile' -Value $p.id 201 | $Output 202 | 203 | } 204 | 205 | } 206 | else { 207 | Write-Warning "$Computer : no extensions were found" 208 | 209 | } 210 | 211 | }#foreach 212 | } 213 | } 214 | } 215 | 216 | Get-ChromeExtension | ft -AutoSize -------------------------------------------------------------------------------- /PUP/BrowserExtension/EdgeStoreTest.ps1: -------------------------------------------------------------------------------- 1 | 2 | # Get profile list from Chromes local state 3 | $statePath = "C:\Users\${env:USERNAME}\AppData\Local\Microsoft\Edge\User Data\Local State" 4 | $state = Get-Content $statePath 5 | 6 | # Using Serializer instead of ConvertFrom-Json because https://github.com/PowerShell/PowerShell/issues/1755 7 | [void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions') 8 | $jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer 9 | $jsser.MaxJsonLength = $jsser.MaxJsonLength * 10 10 | 11 | $serProfiles = $jsser.DeserializeObject($state).profile.info_cache 12 | 13 | $profiles = @() 14 | $serProfiles.Keys.ForEach{ 15 | $profile = New-Object -TypeName psobject -Property @{ 16 | 'Id' = $_ 17 | } 18 | $profiles += $profile 19 | } 20 | 21 | $profiles | Select-Object -ExpandProperty id 22 | 23 | -------------------------------------------------------------------------------- /PUP/BrowserExtension/EdgeTest.ps1: -------------------------------------------------------------------------------- 1 | function Get-ChromeExtension { 2 | <# 3 | .SYNOPSIS 4 | Gets Chrome Extensions from a local or remote computer 5 | .DESCRIPTION 6 | Gets the name, version and description of the installed extensions 7 | Admin rights are required to access other profiles on the local computer or 8 | any profiles on a remote computer. 9 | Internet access is required to lookup the extension ID on the Chrome web store 10 | .PARAMETER Computername 11 | The name of the computer to connect to 12 | The default is the local machine 13 | .PARAMETER Username 14 | The username to query i.e. the userprofile (c:\users\) 15 | If this parameter is omitted, all userprofiles are searched 16 | .EXAMPLE 17 | PS C:\> Get-ChromeExtension 18 | 19 | This command will get the Chrome extensions from all the user profiles on the local computer 20 | .EXAMPLE 21 | PS C:\> Get-ChromeExtension -username Jsmith 22 | 23 | This command will get the Chrome extensions installed under c:\users\jsmith on the local computer 24 | 25 | .EXAMPLE 26 | PS C:\> Get-ChromeExtension -Computername PC1234,PC4567 27 | 28 | This command will get the Chrome extensions from all the user profiles on the two remote computers specified 29 | .NOTES 30 | Version 1.0 31 | #> 32 | [cmdletbinding()] 33 | PARAM( 34 | [parameter(Position = 0)] 35 | [string]$Computername = $ENV:COMPUTERNAME 36 | , 37 | [parameter(Position = 1)] 38 | [string]$Username 39 | ) 40 | BEGIN { 41 | 42 | function Get-ExtensionInfo { 43 | <# 44 | .SYNOPSIS 45 | Get Name and Version of the a Chrome extension 46 | .PARAMETER Folder 47 | A directory object (under %userprofile%\AppData\Local\Google\Chrome\User Data\Default\Extensions) 48 | #> 49 | [cmdletbinding()] 50 | PARAM( 51 | [parameter(Position = 0)] 52 | [IO.DirectoryInfo]$Folder 53 | ) 54 | BEGIN { 55 | 56 | $BuiltInExtensions = @{ 57 | 'nmmhkkegccagdldgiimedpiccmgmieda' = 'Google Wallet' 58 | 'mhjfbmdgcfjbbpaeojofohoefgiehjai' = 'Chrome PDF Viewer' 59 | 'pkedcjkdefgpdelpbcmbmeomcjbeemfm' = 'Chrome Cast' 60 | } 61 | 62 | } 63 | PROCESS { 64 | # Extension folders are under %userprofile%\AppData\Local\Google\Chrome\User Data\Default\Extensions 65 | # Folder names match extension ID e.g. blpcfgokakmgnkcojhhkbfbldkacnbeo 66 | $ExtID = $Folder.Name 67 | 68 | if ($Folder.FullName -match '\\Users\\(?[^\\]+)\\') { 69 | $Username = $Matches['username'] 70 | } 71 | else { 72 | $Username = '' 73 | } 74 | 75 | # There can be more than one version installed. Get the latest one 76 | $LastestExtVersionInstallFolder = Get-ChildItem -Path $Folder.Fullname | Where-Object { $_.Name -match '^[0-9\._-]+$' } | Sort-Object -Property CreationTime -Descending | Select-Object -First 1 -ExpandProperty Name 77 | 78 | # Get the version from the JSON manifest 79 | if (Test-Path -Path "$($Folder.Fullname)\$LastestExtVersionInstallFolder\Manifest.json") { 80 | 81 | $Manifest = Get-Content -Path "$($Folder.Fullname)\$LastestExtVersionInstallFolder\Manifest.json" -Raw | ConvertFrom-Json 82 | if ($Manifest) { 83 | if (-not([string]::IsNullOrEmpty($Manifest.version))) { 84 | $Version = $Manifest.version 85 | } 86 | if (-not([string]::IsNullOrEmpty($Manifest.name))) { 87 | $Title = $Manifest.name 88 | } 89 | } 90 | } 91 | else { 92 | # Just use the folder name as the version 93 | $Version = $LastestExtVersionInstallFolder.Name 94 | } 95 | 96 | if ($BuiltInExtensions.ContainsKey($ExtID)) { 97 | # Built-in extensions do not appear in the Chrome Store 98 | 99 | $Title = $BuiltInExtensions[$ExtID] 100 | $Description = '' 101 | 102 | } 103 | else { 104 | # Lookup the extension in the Store 105 | $url = "https://chrome.google.com/webstore/detail/" + $ExtID + "?hl=en-us" 106 | <# 107 | try { 108 | # You may need to include proxy information 109 | # $WebRequest = Invoke-WebRequest -Uri $url -ErrorAction Stop -Proxy 'http://proxy:port' -ProxyUseDefaultCredentials 110 | 111 | $WebRequest = Invoke-WebRequest -Uri $url -ErrorAction Stop 112 | 113 | if ($WebRequest.StatusCode -eq 200) { 114 | 115 | # Get the HTML Page Title but remove ' - Chrome Web Store' 116 | if (-not([string]::IsNullOrEmpty($WebRequest.ParsedHtml.title))) { 117 | 118 | $ExtTitle = $WebRequest.ParsedHtml.title 119 | if ($ExtTitle -match '\s-\s.*$') { 120 | $Title = $ExtTitle -replace '\s-\s.*$', '' 121 | $extType = 'ChromeStore' 122 | 123 | } 124 | else { 125 | $Title = $ExtTitle 126 | } 127 | } 128 | 129 | # Screen scrape the Description meta-data 130 | $Description = $webRequest.AllElements.InnerHTML | Where-Object { $_ -match '' } | Select-object -First 1 | ForEach-Object { $Matches[1] } 131 | } 132 | } 133 | catch { 134 | Write-Warning "Error during webstore lookup for '$ExtID' - '$_'" 135 | 136 | }#> 137 | } 138 | 139 | [PSCustomObject][Ordered]@{ 140 | Name = $Title 141 | Version = $Version 142 | #Description = $Description 143 | Username = $Username 144 | ID = $ExtID 145 | } 146 | 147 | } 148 | } 149 | } 150 | 151 | PROCESS { 152 | # Get profile list from Edge local state 153 | $statePath = "C:\Users\${env:USERNAME}\AppData\Local\Microsoft\Edge\User Data\Local State" 154 | $state = Get-Content $statePath 155 | 156 | # Using Serializer instead of ConvertFrom-Json because https://github.com/PowerShell/PowerShell/issues/1755 157 | [void][System.Reflection.Assembly]::LoadWithPartialName('System.Web.Extensions') 158 | $jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer 159 | $jsser.MaxJsonLength = $jsser.MaxJsonLength * 10 160 | 161 | $serProfiles = $jsser.DeserializeObject($state).profile.info_cache 162 | 163 | $profiles = @() 164 | $serProfiles.Keys.ForEach{ 165 | $profile = New-Object -TypeName psobject -Property @{ 166 | 'Id' = $_ 167 | } 168 | $profiles += $profile 169 | } 170 | 171 | Foreach ($p in $profiles) { 172 | $ExtensionFolderPath = "AppData\Local\Microsoft\Edge\User Data\$($p.id)\Extensions" 173 | Foreach ($Computer in $Computername) { 174 | if ($Username) { 175 | # Single userprofile 176 | $Path = Join-path -path "fileSystem::\\$Computer\C$\Users\$Username" -ChildPath $ExtensionFolderPath 177 | $Extensions = Get-ChildItem -Path $Path -Directory -ErrorAction SilentlyContinue 178 | 179 | } 180 | else { 181 | # All user profiles that contain this a Chrome extensions folder 182 | $Path = Join-path -path "fileSystem::\\$Computer\C$\Users\*" -ChildPath $ExtensionFolderPath 183 | $Extensions = @() 184 | Get-Item -Path $Path -ErrorAction SilentlyContinue | ForEach-Object { 185 | 186 | $Extensions += Get-ChildItem -Path $_ -Directory -ErrorAction SilentlyContinue 187 | } 188 | 189 | } 190 | 191 | if (-not($null -eq $Extensions)) { 192 | 193 | Foreach ($Extension in $Extensions) { 194 | 195 | $Output = Get-ExtensionInfo -Folder $Extension 196 | $Output | Add-Member -MemberType NoteProperty -Name 'Computername' -Value $Computer 197 | $Output | Add-Member -MemberType NoteProperty -Name 'Profile' -Value $p.id 198 | $Output 199 | 200 | } 201 | 202 | } 203 | else { 204 | Write-Warning "$Computer : no extensions were found" 205 | 206 | } 207 | 208 | }#foreach 209 | } 210 | } 211 | } 212 | 213 | Get-ChromeExtension | ft -AutoSize -------------------------------------------------------------------------------- /PUP/BrowserExtension/Firefox.ps1: -------------------------------------------------------------------------------- 1 | # PS script to get FireFox Ext and put in WMI 2 | # Some script code from Ivanti. 3 | # Original idea I saw was from SKissinger for Chrome Ext for SCCM 2012. 4 | 5 | # Default extensions are ignored since they aren't visible to users. 6 | 7 | # Need to run with admin permissions to manipulate WMI. 8 | 9 | 10 | function Convert-UTCtoLocal { 11 | param( 12 | [parameter(Mandatory=$true)] 13 | [String] $UTCTime 14 | ) 15 | 16 | $strCurrentTimeZone = (Get-WmiObject win32_timezone).StandardName 17 | $TZ = [System.TimeZoneInfo]::FindSystemTimeZoneById($strCurrentTimeZone) 18 | $LocalTime = [System.TimeZoneInfo]::ConvertTimeFromUtc($UTCTime, $TZ) 19 | return $LocalTime 20 | } 21 | 22 | $parentdir = "C:\Users\" 23 | $users = Get-ChildItem $parentdir 24 | $ObjCollection = @() 25 | 26 | Foreach($user in $users){ 27 | 28 | # $targetdir = "C:\Users\glord\AppData\Roaming\Mozilla\Firefox\Profiles\" 29 | 30 | # get profile folder 31 | $targetdir = "" 32 | $ffdir = $parentdir + $user.ToString() + "\AppData\Roaming\Mozilla\Firefox\Profiles" 33 | $ejsons = if (test-path $ffdir) {Get-ChildItem -path $ffdir -File -Filter "extensions.json" -Recurse} 34 | foreach ($ejson in $ejsons) { 35 | 36 | 37 | # read preferences file in Default folder 38 | $targetdir = $ejson.directoryname 39 | 40 | # get firefox version - yes it is in the loop. Had to determine profile location. 41 | $lines = $null 42 | if (test-path "$targetdir\compatibility.ini") {$lines=Get-Content "$targetdir\compatibility.ini"} 43 | foreach ($l in $lines) { 44 | if ($l -like "lastVersion*"){ 45 | $ls1 = $l.split("=") 46 | $ls2 = $ls1[1].split("_") 47 | $ffversion = $ls2[0] 48 | } 49 | } 50 | 51 | 52 | 53 | if (test-path "$targetdir\extensions.json") { 54 | $prefs = Get-Content "$targetdir\extensions.json" | ConvertFrom-Json # Read Prefernces JSON file 55 | $prefs = $prefs.addons 56 | 57 | # $prefs = Get-Content "$targetdir\containers.json" | ConvertFrom-Json 58 | # $prefs = Get-Content "$targetdir\addons.json" | ConvertFrom-Json 59 | 60 | 61 | Foreach($pref in $prefs){ 62 | 63 | $obj = New-Object System.Object 64 | #$pref = $($ext) 65 | $Permissions = "" # force permissions variable to string 66 | 67 | # view variable contents for testing 68 | # $pref 69 | # $pref.manifest 70 | 71 | $name = $pref.defaultlocale.name 72 | $version = $pref.version 73 | $description = $pref.defaultlocale.description 74 | $active = $pref.active 75 | $visible = $pref.visible 76 | $appdisabled = $pref.appdisabled 77 | $userdisabled = $pref.userdisabled 78 | $hidden = $pref.hidden 79 | $location = $pref.location 80 | $id = $pref.id 81 | $sourceURI = $pref.sourceURI 82 | 83 | $Ptemp = $pref.userpermissions.permissions 84 | foreach ($pt in $Ptemp) {$Permissions = $Permissions + $pt.tostring() + "._."} # convert array to string to store in WMI. Use ._. entry separator. 85 | 86 | 87 | # install time conversion 88 | $p = [double]$pref.installdate 89 | $p = ($p ) / 1000 #//divide by 1,000 because we are going to add seconds on to the base date 90 | $date = get-date -date "1970-01-01 00:00:00" 91 | $date = $date.AddSeconds($p) 92 | $localtimezn = Convert-UTCtoLocal($date) 93 | #$localtimezn 94 | 95 | 96 | #get name and version from json and add to object 97 | $obj | Add-Member -MemberType NoteProperty -Name Name -Value $name 98 | $obj | Add-Member -MemberType NoteProperty -Name Version -Value $version 99 | $obj | Add-Member -MemberType NoteProperty -Name Description -Value $description 100 | $obj | Add-Member -MemberType NoteProperty -Name Permissions -Value $Permissions 101 | $obj | Add-Member -MemberType NoteProperty -Name ID -Value $id 102 | $obj | Add-Member -MemberType NoteProperty -Name Active -Value $active 103 | $obj | Add-Member -MemberType NoteProperty -Name visible -Value $visible 104 | $obj | Add-Member -MemberType NoteProperty -Name appdisabled -Value $appdisabled 105 | $obj | Add-Member -MemberType NoteProperty -Name userdisabled -Value $userdisabled 106 | $obj | Add-Member -MemberType NoteProperty -Name hidden -Value $hidden 107 | $obj | Add-Member -MemberType NoteProperty -Name location -Value $location 108 | $obj | Add-Member -MemberType NoteProperty -Name sourceURI -Value $sourceURI 109 | 110 | $obj | Add-Member -MemberType NoteProperty -Name DateInstall -Value $localtimezn.ToString() 111 | 112 | $obj | Add-Member -MemberType NoteProperty -Name User -Value $user 113 | $obj | Add-Member -MemberType NoteProperty -Name FireFoxVer -Value $ffversion 114 | $obj | Add-Member -MemberType NoteProperty -Name LastScan -Value $(Get-Date) 115 | 116 | 117 | # ignore default extensions 118 | if($location -ne "app-builtin" -and $location -ne "app-system-defaults"){ 119 | Write-Output @{Name = $obj.Name; Version = $obj.Version; Description = $obj.Description; Permissions = $obj.Permissions; ID = $obj.ID; DateInstall = $obj.DateInstall; active = $obj.active; visible = $obj.visible; appdisabled = $obj.appdisabled; userdisabled = $obj.userdisabled; hidden = $obj.hidden; location = $obj.location; sourceURI = $obj.sourceURI; User = $obj.User; FireFoxVer = $obj.FireFoxVer; LastScan = $obj.LastScan} 120 | 121 | # items for testing or debug. Not saved in WMI class 122 | #$obj 123 | 124 | 125 | $ObjCollection += $obj # used for examining the data later for troubleshooting. 126 | } 127 | } # end foreach extensions 128 | } # end if pref file found 129 | } # end foreach json location 130 | } # end foreach users -------------------------------------------------------------------------------- /PUP/Delete_-_Potentially_Unwanted_Apps.ps1: -------------------------------------------------------------------------------- 1 | #Import-Module $env:SyncroModule -WarningAction SilentlyContinue 2 | 3 | function Get-GitHubFiles { 4 | Param( 5 | [string]$Owner, 6 | [string]$Repository, 7 | [string]$Path, 8 | [string]$DestinationPath 9 | ) 10 | 11 | $baseUri = "https://api.github.com/" 12 | $args = "repos/$Owner/$Repository/contents/$Path" 13 | $wr = Invoke-WebRequest -Uri $($baseuri + $args) 14 | $objects = $wr.Content | ConvertFrom-Json 15 | $files = $objects | where { $_.type -eq "file" } | Select -exp download_url 16 | $directories = $objects | where { $_.type -eq "dir" } 17 | 18 | $directories | ForEach-Object { 19 | DownloadFilesFromRepo -Owner $Owner -Repository $Repository -Path $_.path -DestinationPath $($DestinationPath + $_.name) 20 | } 21 | 22 | 23 | if (-not (Test-Path $DestinationPath)) { 24 | # Destination path does not exist, let's create it 25 | try { 26 | New-Item -Path $DestinationPath -ItemType Directory -ErrorAction Stop 27 | } 28 | catch { 29 | throw "Could not create path '$DestinationPath'!" 30 | } 31 | } 32 | 33 | foreach ($file in $files) { 34 | $fileDestination = Join-Path $DestinationPath (Split-Path $file -Leaf) 35 | try { 36 | Invoke-WebRequest -Uri $file -OutFile $fileDestination -ErrorAction Stop 37 | "Grabbed '$($file)' to '$fileDestination'" 38 | } 39 | catch { 40 | throw "Unable to download '$($file.path)'" 41 | } 42 | } 43 | 44 | } 45 | 46 | function Save-GitHubFiles { 47 | Get-GitHubFiles -Owner AdamNSTA -Repository Syncro -Path "/PUP/JSON/" -DestinationPath "$env:Temp\PUP\" 48 | #Get-ChildItem -Path "C:\GitRepos\Syncro\PUP" -Filter "*.json" | Copy-Item -Destination "C:\Users\Adam\AppData\Local\Temp\PUP" -Verbose -Force 49 | } 50 | 51 | 52 | $tempPath = "$env:Temp\PUP\" 53 | $tempFiles = Get-ChildItem -Path "$tempPath" -Filter "*.json" 54 | $limit = (Get-Date).AddDays(-2) 55 | $over24 = Get-ChildItem -Path "$tempPath" -Filter "*.json" | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } 56 | if ($NULL -eq $tempFiles) { 57 | Write-Host "Caching files" 58 | Save-GitHubFiles 59 | } 60 | elseif ($over24.Count -ne '0') { 61 | $tempFiles | % { Remove-Item $_.FullName -Verbose -Force -Confirm:$false -ErrorAction Stop } 62 | Write-Host "Files cached over 24 hours, redownloading" 63 | Save-GitHubFiles 64 | } 65 | else { 66 | Write-Host "Files already cached" 67 | } 68 | 69 | #grab lists from temporary files and declare variables. 70 | $tempFiles | ForEach-Object { 71 | New-Variable -Name $_.BaseName -Value $(get-content $_.FullName | ConvertFrom-Json) -Force 72 | } 73 | 74 | # Combine our lists, if you create more lists be sure to add them here 75 | $apps = $security + $remoteaccess + $rmm + $crapware + $oem 76 | # Allowlist array, you must use the full name for the matching to work! 77 | $allowlist = @" 78 | [ 79 | "ScreenConnect Client (0c34888a41840915)", 80 | "ScreenConnect Client (60cbdd4413783e37)", 81 | "Splashtop Software Updater", 82 | "Splashtop for RMM", 83 | "Splashtop Streamer", 84 | "Datto Windows Agent", 85 | "Webroot SecureAnywhere", 86 | "Microsoft Search in Bing", 87 | "Dell PointStick Driver", 88 | "Dell Command | Update", 89 | "Dell Touchpad", 90 | "Dell Power Manager Service", 91 | "Lenovo Vantage Service" 92 | ] 93 | "@ | ConvertFrom-Json 94 | #Write-Host -ForegroundColor Yellow "Allowed Apps at Root Level: $allowlist" 95 | #$allowlist += ($orgallowlist -split ",").Trim() 96 | #Write-Output "Allowed Apps at Organization Level: $orgallowlist" 97 | #$allowlist += ($assetallowlist -split ",").Trim() 98 | #Write-Output "Allowed Apps at Asset Level: $assetallowlist" 99 | 100 | # Grab the registry uninstall keys to search against (x86 and x64) 101 | $software = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\" | Get-ItemProperty 102 | if ([Environment]::Is64BitOperatingSystem) { 103 | $software += Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" | Get-ItemProperty 104 | } 105 | 106 | # Clear the output variable so we don't get confused while testing 107 | $output = '' 108 | 109 | # Cycle through each app in the apps array searching for matches and store them 110 | $outputApps = foreach ($app in $apps) { 111 | $software | Where-Object { $_.DisplayName -match "$app" -and $allowlist -notcontains $_.DisplayName } | Select-Object @{N = "DisplayName"; E = { $_.DisplayName } }, @{N = "UninstallString"; E = { $_.UninstallString } }, @{N = "MatchingApp"; E = { $app } } 112 | } 113 | 114 | #$outputApps 115 | 116 | if($outputApps.UninstallString -like "*MsiExec.exe*") { 117 | $outputApps | Where-Object {$_.UninstallString -like "*MsiExec.exe*"} | Foreach-Object { 118 | $name = $_.DisplayName 119 | $string = $_.UninstallString 120 | $string = $string -replace "MsiExec.exe /X"," " 121 | Write-Host "Removing $name" 122 | Start-Process "MsiExec.exe" -ArgumentList "/x $string /q" -Wait 123 | Start-Sleep -Seconds 15 124 | } 125 | } else { 126 | $outputApps | Where-Object {$_.UninstallString -notcontains "*MsiExec.exe*"} | Foreach-Object { 127 | Start-Process "$_.UninstallString" -Wait 128 | } 129 | } 130 | 131 | -------------------------------------------------------------------------------- /PUP/JSON/crapware.json: -------------------------------------------------------------------------------- 1 | [ 2 | "CCleaner" 3 | ] -------------------------------------------------------------------------------- /PUP/JSON/oem.json: -------------------------------------------------------------------------------- 1 | [ 2 | "555", 3 | "AdBlocknWatch", 4 | "AppToU", 5 | "CCCHelp", 6 | "ClipGenie", 7 | "CoolWWW", 8 | "Coupon", 9 | "Cydoor", 10 | "Esuack", 11 | "FashionLife", 12 | "Freenpro25", 13 | "Gamevance", 14 | "MapsGalaxy", 15 | "QuickTime", 16 | "SaferSurf", 17 | "SaveForYou", 18 | "Savings", 19 | "Search", 20 | "Shop_and_Up", 21 | "Shopper", 22 | "SpeedUpMyPC", 23 | "TidyNetwork", 24 | "Toolbar", 25 | "Trial", 26 | "Virtumundo", 27 | "VirusProtectPro", 28 | "WeatherBug", 29 | "WhenUsave", 30 | "Zango", 31 | "iBryte", 32 | "iStart123", 33 | "180Solution", 34 | "24x7Help", 35 | "3vix", 36 | "AVGTuneUp", 37 | "Acer", 38 | "AdobeShockwave", 39 | "Advanced Registry", 40 | "AdvancedFX Engine", 41 | "Akamai", 42 | "Altnet", 43 | "Amazon Browser", 44 | "Any Video Converter", 45 | "AppsHat", 46 | "ArcadeParlor", 47 | "AtuZi", 48 | "Baidu PC Faster", 49 | "Big Fish", 50 | "Bing", 51 | "BlueStack", 52 | "Bonzi Buddy", 53 | "BrowserOptimize", 54 | "BrowserSafeguard", 55 | "Buzzdock", 56 | "CWA Reminder by We-Care.com", 57 | "ClickForSale", 58 | "CloudScout", 59 | "DealPly", 60 | "DealScout for Internet Explorer", 61 | "Dell", 62 | "Discovery Tools", 63 | "Download Updater", 64 | "DriverUpdate", 65 | "Face Theme", 66 | "File Type Assistant", 67 | "Files Opened", 68 | "FilesFrog Update Checker", 69 | "Free Download Manager", 70 | "Free Studio", 71 | "Free YouTube", 72 | "GetSavin", 73 | "HD-Total-", 74 | "HPAssistant", 75 | "HPDocumentation", 76 | "HPGuide", 77 | "HPHelp", 78 | "HPNotifications", 79 | "HPRegistration", 80 | "HPStudy", 81 | "HPSupport", 82 | "HPUpdate", 83 | "IBUpdater", 84 | "IObit", 85 | "IWon", 86 | "Iminent", 87 | "InfoAtoms", 88 | "InstaCodecs", 89 | "IntelMEUninstallLegacy", 90 | "IntelManagement", 91 | "IntelSmart", 92 | "Launch Manager", 93 | "Lenovo", 94 | "LinkSwift", 95 | "Live Updater", 96 | "Live! Cam Avatar", 97 | "MPlayerplus", 98 | "MapsGalaxy", 99 | "McAfee Security Scan", 100 | "Media Buzz", 101 | "Media Gallery", 102 | "Media View", 103 | "Media Watch", 104 | "Mindspark", 105 | "MobileWiFi", 106 | "Mobogenie", 107 | "Move Media", 108 | "My HP", 109 | "My Web Searc", 110 | "MyPC Backup", 111 | "Nero", 112 | "Norton Internet", 113 | "OMG Music Plus", 114 | "OOBE", 115 | "Optimizer", 116 | "Orbit Downloader", 117 | "PMB", 118 | "Pdf995", 119 | "Plus-HD-1.3", 120 | "Price Check by AOL", 121 | "PrivDog", 122 | "ProductivityToolbar for IE", 123 | "QuickShare", 124 | "Qwiklinx", 125 | "RadioRage", 126 | "Raptr", 127 | "RealDownloader", 128 | "RealNetworks", 129 | "RealUpgrade", 130 | "RegClean Pro", 131 | "RegInOut", 132 | "Remote Keyboard", 133 | "Remote Play with Playstation", 134 | "Rich Media View", 135 | "Rock Turner", 136 | "Roxio", 137 | "SLOW-PCfighter", 138 | "SaveOn", 139 | "ScorpionSave", 140 | "SelectionLinks", 141 | "Shop To Win", 142 | "ShopAtHome", 143 | "Shopper", 144 | "Shopping", 145 | "SimilarDeals", 146 | "SmartWebPrinting", 147 | "Smiley Central", 148 | "SocialSafe", 149 | "Software Assist", 150 | "Software Updater", 151 | "Soluto", 152 | "Sonic CinePlayer", 153 | "Sony Music", 154 | "SpeedUpMyPc", 155 | "Speedial", 156 | "Super Optimizer", 157 | "SweetIM for Messenger", 158 | "SweetPacks", 159 | "SySaver", 160 | "The Gator", 161 | "TidyNetwork.com", 162 | "Toolbar", 163 | "TopArcadeHits", 164 | "Toshiba", 165 | "Uninstall Helper", 166 | "UserGuide", 167 | "VAIO", 168 | "VGClient", 169 | "Video Converter", 170 | "Video Player", 171 | "VideoDownloadConverter", 172 | "VideoFileDownload", 173 | "VisualBee", 174 | "Wajam", 175 | "WebConnect", 176 | "Webshots", 177 | "WhenU", 178 | "WildGames", 179 | "WildTangent", 180 | "Windows Internet Guard", 181 | "WiseConvert", 182 | "YahooBrowser", 183 | "YahooSoftware", 184 | "YahooToolbar", 185 | "Yammer", 186 | "Yontoo", 187 | "YouTube Downloader", 188 | "ZD Manager", 189 | "Zip Opener Packages", 190 | "eBay", 191 | "eMachines", 192 | "flash-Enhancer", 193 | "hpStatusAlerts", 194 | "lucky leap" 195 | ] -------------------------------------------------------------------------------- /PUP/JSON/remoteaccess.json: -------------------------------------------------------------------------------- 1 | [ 2 | "aeroadmin", 3 | "alpemix", 4 | "ammyy", 5 | "anydesk", 6 | "asg-remote", 7 | "aspia", 8 | "bomgar", 9 | "\bchrome remote", 10 | "\bcloudberry remote", 11 | "dameware", 12 | "dayon", 13 | "deskroll", 14 | "dualmon", 15 | "dwservice", 16 | "ehorus", 17 | "fixme.it", 18 | "gosupportnow", 19 | "gotoassist", 20 | "gotomypc", 21 | "guacamole", 22 | "impcremote", 23 | "instant housecall", 24 | "instatech", 25 | "isl alwayson", 26 | "isl light", 27 | "join.me", 28 | "jump desktop", 29 | "kaseya", 30 | "lite manager", 31 | "logmein", 32 | "mikogo", 33 | "meshcentral", 34 | "mremoteng", 35 | "nomachine", 36 | "opennx", 37 | "optitune", 38 | "pilixo", 39 | "\bradmin", 40 | "remotetopc", 41 | "\bremotepc", 42 | "\bremote utilities", 43 | "rescueassist", 44 | "screenconnect", 45 | "showmypc", 46 | "simplehelp", 47 | "splashtop", 48 | "supremo", 49 | "take control", 50 | "teamviewer", 51 | "thinfinity", 52 | "ultraviewer", 53 | "vnc", 54 | "wayk now", 55 | "x2go", 56 | "zoho assist" 57 | ] -------------------------------------------------------------------------------- /PUP/JSON/rmm.json: -------------------------------------------------------------------------------- 1 | [ 2 | "kaseya", 3 | "datto", 4 | "solarwinds", 5 | "ninja", 6 | "GFI", 7 | "atera", 8 | "continuum", 9 | "ITSupport247", 10 | "ITSPlatform", 11 | "Pulseway", 12 | "PC Monitor" 13 | ] -------------------------------------------------------------------------------- /PUP/JSON/security.json: -------------------------------------------------------------------------------- 1 | [ 2 | "ahnlab", 3 | "avast", 4 | "avg", 5 | "avira", 6 | "bitdefender", 7 | "checkpoint", 8 | "clamwin", 9 | "comodo", 10 | "dr.web", 11 | "eset ", 12 | "fortinet", 13 | "f-prot", 14 | "f-secure", 15 | "\bg data", 16 | "immunet", 17 | "kaspersky", 18 | "mcafee", 19 | "nano", 20 | "norton", 21 | "panda", 22 | "qihoo 360", 23 | "segurazo", 24 | "sophos", 25 | "symantec", 26 | "trend micro", 27 | "trustport", 28 | "webroot", 29 | "zonealarm" 30 | ] -------------------------------------------------------------------------------- /PUP/Monitor_-_Potentially_Unwanted_Apps.ps1: -------------------------------------------------------------------------------- 1 | #Import-Module $env:SyncroModule -WarningAction SilentlyContinue 2 | 3 | function Get-GitHubFiles { 4 | Param( 5 | [string]$Owner, 6 | [string]$Repository, 7 | [string]$Path, 8 | [string]$DestinationPath 9 | ) 10 | 11 | $baseUri = "https://api.github.com/" 12 | $args = "repos/$Owner/$Repository/contents/$Path" 13 | $wr = Invoke-WebRequest -Uri $($baseuri + $args) 14 | $objects = $wr.Content | ConvertFrom-Json 15 | $files = $objects | where-object { $_.type -eq "file" } | Select-object -exp download_url 16 | $directories = $objects | where-object { $_.type -eq "dir" } 17 | 18 | $directories | ForEach-Object { 19 | DownloadFilesFromRepo -Owner $Owner -Repository $Repository -Path $_.path -DestinationPath $($DestinationPath + $_.name) 20 | } 21 | 22 | 23 | if (-not (Test-Path $DestinationPath)) { 24 | # Destination path does not exist, let's create it 25 | try { 26 | New-Item -Path $DestinationPath -ItemType Directory -ErrorAction Stop 27 | } 28 | catch { 29 | throw "Could not create path '$DestinationPath'!" 30 | } 31 | } 32 | 33 | foreach ($file in $files) { 34 | $fileDestination = Join-Path $DestinationPath (Split-Path $file -Leaf) 35 | try { 36 | Invoke-WebRequest -Uri $file -OutFile $fileDestination -ErrorAction Stop 37 | "Grabbed '$($file)' to '$fileDestination'" 38 | } 39 | catch { 40 | throw "Unable to download '$($file.path)'" 41 | } 42 | } 43 | 44 | } 45 | 46 | function Save-GitHubFiles { 47 | Get-GitHubFiles -Owner AdamNSTA -Repository Syncro -Path "/PUP/JSON/" -DestinationPath "$env:Temp\PUP\" 48 | #Get-ChildItem -Path "C:\GitRepos\Syncro\PUP" -Filter "*.json" | Copy-Item -Destination "$env:localAppData\Temp\PUP" -Verbose -Force 49 | } 50 | 51 | 52 | $tempPath = "$env:Temp\PUP\" 53 | $tempFiles = Get-ChildItem -Path "$tempPath" -Filter "*.json" -ErrorAction SilentlyContinue 54 | $limit = (Get-Date).AddDays(-2) 55 | $over24 = Get-ChildItem -Path "$tempPath" -Filter "*.json" -ErrorAction SilentlyContinue| Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } 56 | if ($NULL -eq $tempFiles) { 57 | Write-Host "Caching files" 58 | Save-GitHubFiles 59 | } 60 | elseif ($over24.Count -ne '0') { 61 | $tempFiles |%{Remove-Item $_.FullName -Verbose -Force -Confirm:$false -ErrorAction SilentlyContinue } 62 | Write-Host "Files cached over 24 hours, redownloading" 63 | Save-GitHubFiles 64 | } 65 | else { 66 | Write-Host "Files already cached" 67 | } 68 | 69 | #grab lists from temporary files and declare variables. 70 | $tempFiles | ForEach-Object { 71 | New-Variable -Name $_.BaseName -Value $(get-content $_.FullName | ConvertFrom-Json) -Force 72 | } 73 | 74 | # Combine our lists, if you create more lists be sure to add them here 75 | $apps = $security + $remoteaccess + $rmm + $crapware + $oem 76 | # Allowlist array, you must use the full name for the matching to work! 77 | $allowlist = @" 78 | [ 79 | "ScreenConnect Client (0c34888a41840915)", 80 | "ScreenConnect Client (60cbdd4413783e37)", 81 | "Splashtop Software Updater", 82 | "Splashtop for RMM", 83 | "Splashtop Streamer", 84 | "Datto Windows Agent", 85 | "Webroot SecureAnywhere", 86 | "Microsoft Search in Bing", 87 | "Dell PointStick Driver", 88 | "Dell Command | Update", 89 | "Dell Touchpad", 90 | "Dell Power Manager Service", 91 | "Lenovo Vantage Service" 92 | ] 93 | "@ | ConvertFrom-Json 94 | Write-Host -ForegroundColor Yellow "Allowed Apps at Root Level: $allowlist" 95 | $allowlist += ($orgallowlist -split ",").Trim() 96 | Write-Output "Allowed Apps at Organization Level: $orgallowlist" 97 | $allowlist += ($assetallowlist -split ",").Trim() 98 | Write-Output "Allowed Apps at Asset Level: $assetallowlist" 99 | 100 | # Grab the registry uninstall keys to search against (x86 and x64) 101 | $software = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\" -ErrorAction SilentlyContinue| Get-ItemProperty 102 | if ([Environment]::Is64BitOperatingSystem) { 103 | $software += Get-ChildItem "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" -ErrorAction SilentlyContinue| Get-ItemProperty 104 | } 105 | 106 | # Clear the output variable so we don't get confused while testing 107 | $output = '' 108 | 109 | # Cycle through each app in the apps array searching for matches and store them 110 | $outputApps = foreach ($app in $apps) { 111 | $software | Where-Object { $_.DisplayName -match "$app" -and $allowlist -notcontains $_.DisplayName } | Select-Object @{N = "DisplayName"; E = { $_.DisplayName } }, @{N = "UninstallString"; E = { $_.UninstallString } }, @{N = "MatchingApp"; E = { $app } } 112 | } 113 | 114 | 115 | if ($outputApps) { 116 | Write-Output "PUP Found:" 117 | $report = ($outputApps | Select-Object -Unique) | Format-List | Out-String 118 | Write-Output "Apps: $report" 119 | #Rmm-Alert -Category 'Potentially Unwanted Applications' -Body "Apps Found: $report" 120 | exit 1 121 | } 122 | else { 123 | Write-Host "No Apps Found." 124 | #Close-Rmm-Alert -Category "Potentially Unwanted Applications" 125 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Syncro scripts. 2 | 3 | ### Each folder usually has a readme to explain what is needed inside SyncroMSP 4 | -------------------------------------------------------------------------------- /Screenconnect.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | 3 | # Replace this with YOUR screenconnect client service name 4 | $serviceName = 'ScreenConnect Client ()' 5 | 6 | # URL for ScreenConnect exe download 7 | # add your url here and the first $c in my enviorment is Company Name or CustomProperty1 8 | $url = "&e=Access&y=Guest&t=&c=$name" 9 | 10 | # Your syncro subdomain 11 | $subdomain = "" 12 | 13 | If (Get-Service $serviceName -ErrorAction SilentlyContinue) { 14 | If ((Get-Service $serviceName).Status -eq 'Running') { 15 | } Else { 16 | Write-Host "$serviceName found, but it is not running for some reason." 17 | write-host "starting $servicename" 18 | start-service $serviceName 19 | } 20 | } Else { 21 | Write-Host "$serviceName not found - need to install" 22 | (new-object System.Net.WebClient).DownloadFile($url,'C:\windows\temp\sc.msi') 23 | msiexec.exe /i c:\windows\temp\sc.msi /quiet 24 | 25 | } 26 | 27 | $Keys = Get-ChildItem HKLM:\System\ControlSet001\Services 28 | $Guid = "Null"; 29 | $Items = $Keys | Foreach-Object {Get-ItemProperty $_.PsPath } 30 | 31 | ForEach ($Item in $Items) 32 | { 33 | if ($item.PSChildName -like "*ScreenConnect Client*") 34 | { 35 | $SubKeyName = $Item.PSChildName 36 | $Guid = (Get-ItemProperty "HKLM:\SYSTEM\ControlSet001\Services\$SubKeyName").ImagePath 37 | } 38 | } 39 | 40 | $GuidParser1 = $Guid -split "&s=" 41 | $GuidParser2 = $GuidParser1[1] -split "&k=" 42 | $Guid = $GuidParser2[0] 43 | Set-Asset-Field -Subdomain $subdomain -Name "ScreenConnect GUID" -Value $Guid 44 | -------------------------------------------------------------------------------- /Win11/README.md: -------------------------------------------------------------------------------- 1 | Make sure you have the following assets fields setup. 2 | 3 | ![](https://github.com/AdamNSTA/Syncro/blob/main/Win11/fields.png) 4 | 5 | Thanks [Cyberdrain](https://www.cyberdrain.com/monitoring-with-powershell-checking-if-your-device-is-compatible-with-windows-11) 6 | 7 | -------------------------------------------------------------------------------- /Win11/Win11Check.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | 3 | $Models = @" 4 | AMD,AMD,3015e 5 | AMD,AMD,3020e 6 | AMD,Athlon™,Gold 3150C 7 | AMD,Athlon™,Gold 3150U 8 | AMD,Athlon™,Silver 3050C 9 | AMD,Athlon™,Silver 3050e 10 | AMD,Athlon™,Silver 3050U 11 | AMD,Athlon™,3000G 12 | AMD,Athlon™,300GE 13 | AMD,Athlon™,300U 14 | AMD,Athlon™,320GE 15 | AMD,Athlon™,Gold 3150G 16 | AMD,Athlon™,Gold 3150GE 17 | AMD,Athlon™,Silver 3050GE 18 | AMD,EPYC™,7232P 19 | AMD,EPYC™,7252 20 | AMD,EPYC™,7262 21 | AMD,EPYC™,7272 22 | AMD,EPYC™,7282 23 | AMD,EPYC™,7302 24 | AMD,EPYC™,7302P 25 | AMD,EPYC™,7352 26 | AMD,EPYC™,7402 27 | AMD,EPYC™,7402P 28 | AMD,EPYC™,7452 29 | AMD,EPYC™,7502 30 | AMD,EPYC™,7502P 31 | AMD,EPYC™,7532 32 | AMD,EPYC™,7542 33 | AMD,EPYC™,7552 34 | AMD,EPYC™,7642 35 | AMD,EPYC™,7662 36 | AMD,EPYC™,7702 37 | AMD,EPYC™,7702P 38 | AMD,EPYC™,7742 39 | AMD,EPYC™,7F32 40 | AMD,EPYC™,7F52 41 | AMD,EPYC™,7F72 42 | AMD,EPYC™,7H12 43 | AMD,EPYC™,72F3 44 | AMD,EPYC™,7313 45 | AMD,EPYC™,7313P 46 | AMD,EPYC™,7343 47 | AMD,EPYC™,73F3 48 | AMD,EPYC™,7413 49 | AMD,EPYC™,7443 50 | AMD,EPYC™,7443P 51 | AMD,EPYC™,7453 52 | AMD,EPYC™,74F3 53 | AMD,EPYC™,7513 54 | AMD,EPYC™,7543 55 | AMD,EPYC™,7543P 56 | AMD,EPYC™,75F3 57 | AMD,EPYC™,7643 58 | AMD,EPYC™,7663 59 | AMD,EPYC™,7713 60 | AMD,EPYC™,7713P 61 | AMD,EPYC™,7763 62 | AMD,Ryzen™ 3,3250C 63 | AMD,Ryzen™ 3,3250U 64 | AMD,Ryzen™ 3,3200G with Radeon™ Vega 8 Graphics 65 | AMD,Ryzen™ 3,3200GE 66 | AMD,Ryzen™ 3,3200U 67 | AMD,Ryzen™ 3,3350U 68 | AMD,Ryzen™ 3,2300X 69 | AMD,Ryzen™ 3,5300U 70 | AMD,Ryzen™ 3,3100 71 | AMD,Ryzen™ 3,3300U 72 | AMD,Ryzen™ 3,4300G 73 | AMD,Ryzen™ 3,4300GE 74 | AMD,Ryzen™ 3,4300U 75 | AMD,Ryzen™ 3,5400U 76 | AMD,Ryzen™ 3 PRO,3200G 77 | AMD,Ryzen™ 3 PRO,3200GE 78 | AMD,Ryzen™ 3 PRO,3300U 79 | AMD,Ryzen™ 3 PRO,4350G 80 | AMD,Ryzen™ 3 PRO,4350GE 81 | AMD,Ryzen™ 3 PRO,4450U 82 | AMD,Ryzen™ 3 PRO,5450U 83 | AMD,Ryzen™ 5,3400G with Radeon™ RX Vega 11 Graphics 84 | AMD,Ryzen™ 5,3400GE 85 | AMD,Ryzen™ 5,3450U 86 | AMD,Ryzen™ 5,3500C 87 | AMD,Ryzen™ 5,3500U 88 | AMD,Ryzen™ 5,3550H 89 | AMD,Ryzen™ 5,3580U Microsoft Surface® Edition 90 | AMD,Ryzen™ 5,2500X 91 | AMD,Ryzen™ 5,2600 92 | AMD,Ryzen™ 5,2600E 93 | AMD,Ryzen™ 5,2600X 94 | AMD,Ryzen™ 5,5500U 95 | AMD,Ryzen™ 5,3500 Processor 96 | AMD,Ryzen™ 5,3600 97 | AMD,Ryzen™ 5,3600X 98 | AMD,Ryzen™ 5,3600XT 99 | AMD,Ryzen™ 5,4600G 100 | AMD,Ryzen™ 5,4500U 101 | AMD,Ryzen™ 5,4600GE 102 | AMD,Ryzen™ 5,4600H 103 | AMD,Ryzen™ 5,4600U 104 | AMD,Ryzen™ 5,5600H 105 | AMD,Ryzen™ 5,5600HS 106 | AMD,Ryzen™ 5,5600U 107 | AMD,Ryzen™ 5,5600X 108 | AMD,Ryzen™ 5 PRO,3400G 109 | AMD,Ryzen™ 5 PRO,3400GE 110 | AMD,Ryzen™ 5 PRO,3500U 111 | AMD,Ryzen™ 5 PRO,2600 112 | AMD,Ryzen™ 5 PRO,3600 113 | AMD,Ryzen™ 5 PRO,4650G 114 | AMD,Ryzen™ 5 PRO,4650GE 115 | AMD,Ryzen™ 5 PRO,4650U 116 | AMD,Ryzen™ 5 PRO,5650U 117 | AMD,Ryzen™ 7,3700C 118 | AMD,Ryzen™ 7,3700U 119 | AMD,Ryzen™ 7,3750H 120 | AMD,Ryzen™ 7,3780U Microsoft Surface® Edition 121 | AMD,Ryzen™ 7,2700 122 | AMD,Ryzen™ 7,2700E Processor 123 | AMD,Ryzen™ 7,2700X 124 | AMD,Ryzen™ 7,5700U 125 | AMD,Ryzen™ 7,3700X 126 | AMD,Ryzen™ 7,3800X 127 | AMD,Ryzen™ 7,3800XT 128 | AMD,Ryzen™ 7,4700G 129 | AMD,Ryzen™ 7,4700GE 130 | AMD,Ryzen™ 7,4700U 131 | AMD,Ryzen™ 7,4800H 132 | AMD,Ryzen™ 7,4800HS 133 | AMD,Ryzen™ 7,4800U 134 | AMD,Ryzen™ 7,5800H 135 | AMD,Ryzen™ 7,5800HS 136 | AMD,Ryzen™ 7,5800U 137 | AMD,Ryzen™ 7,5800 138 | AMD,Ryzen™ 7,5800X 139 | AMD,Ryzen™ 7 PRO,3700U 140 | AMD,Ryzen™ 7 PRO,2700 141 | AMD,Ryzen™ 7 PRO,2700X 142 | AMD,Ryzen™ 7 PRO,4750G 143 | AMD,Ryzen™ 7 PRO,4750GE 144 | AMD,Ryzen™ 7 PRO,4750U 145 | AMD,Ryzen™ 7 PRO,5850U 146 | AMD,Ryzen™ 9,3900 Processor 147 | AMD,Ryzen™ 9,3900X 148 | AMD,Ryzen™ 9,3900XT 149 | AMD,Ryzen™ 9,3950X 150 | AMD,Ryzen™ 9,4900H 151 | AMD,Ryzen™ 9,4900HS 152 | AMD,Ryzen™ 9,5900HS 153 | AMD,Ryzen™ 9,5900HX 154 | AMD,Ryzen™ 9,5980HS 155 | AMD,Ryzen™ 9,5980HX 156 | AMD,Ryzen™ 9,5900 157 | AMD,Ryzen™ 9,5900X 158 | AMD,Ryzen™ 9,5950X 159 | AMD,Ryzen™ 9 PRO,3900 160 | AMD,Ryzen™ Threadripper™,2920X 161 | AMD,Ryzen™ Threadripper™,2950X 162 | AMD,Ryzen™ Threadripper™,2970WX 163 | AMD,Ryzen™ Threadripper™,2990WX 164 | AMD,Ryzen™ Threadripper™,3960X 165 | AMD,Ryzen™ Threadripper™,3970X 166 | AMD,Ryzen™ Threadripper™,3990X 167 | AMD,Ryzen™ Threadripper™ PRO,3945WX 168 | AMD,Ryzen™ Threadripper™ PRO,3955WX 169 | AMD,Ryzen™ Threadripper™ PRO,3975WX 170 | AMD,Ryzen™ Threadripper™ PRO,3995WX 171 | Intel®,Atom®,x6200FE 172 | Intel®,Atom®,x6211E 173 | Intel®,Atom®,x6212RE 174 | Intel®,Atom®,x6413E 175 | Intel®,Atom®,x6414RE 176 | Intel®,Atom®,x6425E 177 | Intel®,Atom®,x6425RE 178 | Intel®,Atom®,x6427FE 179 | Intel®,Celeron®,G4900 180 | Intel®,Celeron®,G4900T 181 | Intel®,Celeron®,G4920 182 | Intel®,Celeron®,G4930 183 | Intel®,Celeron®,G4930E 184 | Intel®,Celeron®,G4930T 185 | Intel®,Celeron®,G4932E 186 | Intel®,Celeron®,G4950 187 | Intel®,Celeron®,J4005 188 | Intel®,Celeron®,J4105 189 | Intel®,Celeron®,J4115 190 | Intel®,Celeron®,N4000 191 | Intel®,Celeron®,N4100 192 | Intel®,Celeron®,3867U 193 | Intel®,Celeron®,4205U 194 | Intel®,Celeron®,4305U 195 | Intel®,Celeron®,4305UE 196 | Intel®,Celeron®,J4025 197 | Intel®,Celeron®,J4125 198 | Intel®,Celeron®,N4020 199 | Intel®,Celeron®,N4120 200 | Intel®,Celeron®,5205U 201 | Intel®,Celeron®,5305U 202 | Intel®,Celeron®,G5900 203 | Intel®,Celeron®,G5900E 204 | Intel®,Celeron®,G5900T 205 | Intel®,Celeron®,G5900TE 206 | Intel®,Celeron®,G5905 207 | Intel®,Celeron®,G5905T 208 | Intel®,Celeron®,G5920 209 | Intel®,Celeron®,G5925 210 | Intel®,Celeron®,J6412 211 | Intel®,Celeron®,J6413 212 | Intel®,Celeron®,N6210 213 | Intel®,Celeron®,N6211 214 | Intel®,Celeron®,N4500 215 | Intel®,Celeron®,N4505 216 | Intel®,Celeron®,N5100 217 | Intel®,Celeron®,N5105 218 | Intel®,Celeron®,6305 219 | Intel®,Celeron®,6305E 220 | Intel®,Core™,i5-10210Y 221 | Intel®,Core™,i5-10310Y 222 | Intel®,Core™,i5-8200Y 223 | Intel®,Core™,i5-8210Y 224 | Intel®,Core™,i5-8310Y 225 | Intel®,Core™,i7-10510Y 226 | Intel®,Core™,i7-8500Y 227 | Intel®,Core™,m3-8100Y 228 | Intel®,Core™,i3-8100 229 | Intel®,Core™,i3-8100B 230 | Intel®,Core™,i3-8100H 231 | Intel®,Core™,i3-8100T 232 | Intel®,Core™,i3-8109U 233 | Intel®,Core™,i3-8140U 234 | Intel®,Core™,i3-8300 235 | Intel®,Core™,i3-8300T 236 | Intel®,Core™,i3-8350K 237 | Intel®,Core™,i5+8400 238 | Intel®,Core™,i5+8500 239 | Intel®,Core™,i5-8257U 240 | Intel®,Core™,i5-8259U 241 | Intel®,Core™,i5-8260U 242 | Intel®,Core™,i5-8269U 243 | Intel®,Core™,i5-8279U 244 | Intel®,Core™,i5-8300H 245 | Intel®,Core™,i5-8400 246 | Intel®,Core™,i5-8400B 247 | Intel®,Core™,i5-8400H 248 | Intel®,Core™,i5-8400T 249 | Intel®,Core™,i5-8500 250 | Intel®,Core™,i5-8500B 251 | Intel®,Core™,i5-8500T 252 | Intel®,Core™,i5-8600 253 | Intel®,Core™,i5-8600K 254 | Intel®,Core™,i5-8600T 255 | Intel®,Core™,i7-8086K 256 | Intel®,Core™,i7-8557U 257 | Intel®,Core™,i7-8559U 258 | Intel®,Core™,i7-8569U 259 | Intel®,Core™,i7-8700 260 | Intel®,Core™,i7-8700B 261 | Intel®,Core™,i7-8700K 262 | Intel®,Core™,i7-8700T 263 | Intel®,Core™,i7-8750H 264 | Intel®,Core™,i7-8850H 265 | Intel®,Core™,i3-8130U 266 | Intel®,Core™,i5-8250U 267 | Intel®,Core™,i5-8350U 268 | Intel®,Core™,i7-8550U 269 | Intel®,Core™,i7-8650U 270 | Intel®,Core™,i3-8145U 271 | Intel®,Core™,i3-8145UE 272 | Intel®,Core™,i5-8265U 273 | Intel®,Core™,i5-8365U 274 | Intel®,Core™,i5-8365UE 275 | Intel®,Core™,i7-8565U 276 | Intel®,Core™,i7-8665U 277 | Intel®,Core™,i7-8665UE 278 | Intel®,Core™,i3-9100 279 | Intel®,Core™,i3-9100E 280 | Intel®,Core™,i3-9100F 281 | Intel®,Core™,i3-9100HL 282 | Intel®,Core™,i3-9100T 283 | Intel®,Core™,i3-9100TE 284 | Intel®,Core™,i3-9300 285 | Intel®,Core™,i3-9300T 286 | Intel®,Core™,i3-9320 287 | Intel®,Core™,i3-9350K 288 | Intel®,Core™,i3-9350KF 289 | Intel®,Core™,i5-9300H 290 | Intel®,Core™,i5-9300HF 291 | Intel®,Core™,i5-9400 292 | Intel®,Core™,i5-9400F 293 | Intel®,Core™,i5-9400H 294 | Intel®,Core™,i5-9400T 295 | Intel®,Core™,i5-9500 296 | Intel®,Core™,i5-9500E 297 | Intel®,Core™,i5-9500F 298 | Intel®,Core™,i5-9500T 299 | Intel®,Core™,i5-9500TE 300 | Intel®,Core™,i5-9600 301 | Intel®,Core™,i5-9600K 302 | Intel®,Core™,i5-9600KF 303 | Intel®,Core™,i5-9600T 304 | Intel®,Core™,i7-9700 305 | Intel®,Core™,i7-9700E 306 | Intel®,Core™,i7-9700F 307 | Intel®,Core™,i7-9700K 308 | Intel®,Core™,i7-9700KF 309 | Intel®,Core™,i7-9700T 310 | Intel®,Core™,i7-9700TE 311 | Intel®,Core™,i7-9750H 312 | Intel®,Core™,i7-9750HF 313 | Intel®,Core™,i7-9850H 314 | Intel®,Core™,i7-9850HE 315 | Intel®,Core™,i7-9850HL 316 | Intel®,Core™,i9-8950HK 317 | Intel®,Core™,i9-9880H 318 | Intel®,Core™,i9-9900 319 | Intel®,Core™,i9-9900K 320 | Intel®,Core™,i9-9900KF 321 | Intel®,Core™,i9-9900KS 322 | Intel®,Core™,i9-9900T 323 | Intel®,Core™,i9-9980HK 324 | Intel®,Core™,i3-10100Y 325 | Intel®,Core™,i3-10110Y 326 | Intel®,Core™,i9-10900X 327 | Intel®,Core™,i9-10920X 328 | Intel®,Core™,i9-10940X 329 | Intel®,Core™,i9-10980XE 330 | Intel®,Core™,i3-10100 331 | Intel®,Core™,i3-10100E 332 | Intel®,Core™,i3-10100F 333 | Intel®,Core™,i3-10100T 334 | Intel®,Core™,i3-10100TE 335 | Intel®,Core™,i3-10105 336 | Intel®,Core™,i3-10105F 337 | Intel®,Core™,i3-10105T 338 | Intel®,Core™,i3-10110U 339 | Intel®,Core™,i3-10300 340 | Intel®,Core™,i3-10300T 341 | Intel®,Core™,i3-10305 342 | Intel®,Core™,i3-10305T 343 | Intel®,Core™,i3-10320 344 | Intel®,Core™,i3-10325 345 | Intel®,Core™,i5-10200H 346 | Intel®,Core™,i5-10210U 347 | Intel®,Core™,i5-10300H 348 | Intel®,Core™,i5-10310U 349 | Intel®,Core™,i5-10400 350 | Intel®,Core™,i5-10400F 351 | Intel®,Core™,i5-10400H 352 | Intel®,Core™,i5-10400T 353 | Intel®,Core™,i5-10500 354 | Intel®,Core™,i5-10500E 355 | Intel®,Core™,i5-10500H 356 | Intel®,Core™,i5-10500T 357 | Intel®,Core™,i5-10500TE 358 | Intel®,Core™,i5-10600 359 | Intel®,Core™,i5-10600K 360 | Intel®,Core™,i5-10600KF 361 | Intel®,Core™,i5-10600T 362 | Intel®,Core™,i7-10510U 363 | Intel®,Core™,i7-10610U 364 | Intel®,Core™,i7-10700 365 | Intel®,Core™,i7-10700E 366 | Intel®,Core™,i7-10700F 367 | Intel®,Core™,i7-10700K 368 | Intel®,Core™,i7-10700KF 369 | Intel®,Core™,i7-10700T 370 | Intel®,Core™,i7-10700TE 371 | Intel®,Core™,i7-10710U 372 | Intel®,Core™,i7-10750H 373 | Intel®,Core™,i7-10810U 374 | Intel®,Core™,i7-10850H 375 | Intel®,Core™,i7-10870H 376 | Intel®,Core™,i7-10875H 377 | Intel®,Core™,i9-10850K 378 | Intel®,Core™,i9-10885H 379 | Intel®,Core™,i9-10900 380 | Intel®,Core™,i9-10900E 381 | Intel®,Core™,i9-10900F 382 | Intel®,Core™,i9-10900K 383 | Intel®,Core™,i9-10900KF 384 | Intel®,Core™,i9-10900T 385 | Intel®,Core™,i9-10900TE 386 | Intel®,Core™,i9-10980HK 387 | Intel®,Core™,i3-1000G1 388 | Intel®,Core™,i3-1000G4 389 | Intel®,Core™,i3-1005G1 390 | Intel®,Core™,i5-1030G4 391 | Intel®,Core™,i5-1030G7 392 | Intel®,Core™,i5-1035G1 393 | Intel®,Core™,i5-1035G4 394 | Intel®,Core™,i5-1035G7 395 | Intel®,Core™,i5-1038NG7 396 | Intel®,Core™,i7-1060G7 397 | Intel®,Core™,i7-1065G7 398 | Intel®,Core™,i7-1068NG7 399 | Intel®,Core™,i3-L13G4 400 | Intel®,Core™,i5-L16G7 401 | Intel®,Core™,i5-11400 402 | Intel®,Core™,i5-11400F 403 | Intel®,Core™,i5-11400T 404 | Intel®,Core™,i5-11500 405 | Intel®,Core™,i5-11500T 406 | Intel®,Core™,i5-11600 407 | Intel®,Core™,i5-11600K 408 | Intel®,Core™,i5-11600KF 409 | Intel®,Core™,i5-11600T 410 | Intel®,Core™,i7-11700 411 | Intel®,Core™,i7-11700F 412 | Intel®,Core™,i7-11700K 413 | Intel®,Core™,i7-11700KF 414 | Intel®,Core™,i7-11700T 415 | Intel®,Core™,i9-11900 416 | Intel®,Core™,i9-11900F 417 | Intel®,Core™,i9-11900K 418 | Intel®,Core™,i9-11900KF 419 | Intel®,Core™,i9-11900T 420 | Intel®,Core™,i3-1110G4 421 | Intel®,Core™,i3-1115G4 422 | Intel®,Core™,i3-1115G4E 423 | Intel®,Core™,i3-1115GRE 424 | Intel®,Core™,i3-1120G4 425 | Intel®,Core™,i3-1125G4 426 | Intel®,Core™,i5-11300H 427 | Intel®,Core™,i5-1130G7 428 | Intel®,Core™,i5-1135G7 429 | Intel®,Core™,i5-1135G7 430 | Intel®,Core™,i5-1140G7 431 | Intel®,Core™,i5-1145G7 432 | Intel®,Core™,i5-1145G7E 433 | Intel®,Core™,i5-1145GRE 434 | Intel®,Core™,i7-11370H 435 | Intel®,Core™,i7-11375H 436 | Intel®,Core™,i7-1160G7 437 | Intel®,Core™,i7-1165G7 438 | Intel®,Core™,i7-1165G7 439 | Intel®,Core™,i7-1180G7 440 | Intel®,Core™,i7-1185G7 441 | Intel®,Core™,i7-1185G7E 442 | Intel®,Core™,i7-1185GRE 443 | Intel®,Pentium®,Gold 4425Y 444 | Intel®,Pentium®,Gold 6500Y 445 | Intel®,Pentium®,Gold G5400 446 | Intel®,Pentium®,Gold G5400T 447 | Intel®,Pentium®,Gold G5420 448 | Intel®,Pentium®,Gold G5420T 449 | Intel®,Pentium®,Gold G5500 450 | Intel®,Pentium®,Gold G5500T 451 | Intel®,Pentium®,Gold G5600 452 | Intel®,Pentium®,Gold G5600T 453 | Intel®,Pentium®,Gold G5620 454 | Intel®,Pentium®,Silver J5005 455 | Intel®,Pentium®,Silver N5000 456 | Intel®,Pentium®,Gold 4417U 457 | Intel®,Pentium®,Gold 5405U 458 | Intel®,Pentium®,Silver J5040 459 | Intel®,Pentium®,Silver N5030 460 | Intel®,Pentium®,Gold 6405U 461 | Intel®,Pentium®,Gold G6400 462 | Intel®,Pentium®,Gold G6400E 463 | Intel®,Pentium®,Gold G6400T 464 | Intel®,Pentium®,Gold G6400TE 465 | Intel®,Pentium®,Gold G6405 466 | Intel®,Pentium®,Gold G6405T 467 | Intel®,Pentium®,Gold G6500 468 | Intel®,Pentium®,Gold G6500T 469 | Intel®,Pentium®,Gold G6505 470 | Intel®,Pentium®,Gold G6505T 471 | Intel®,Pentium®,Gold G6600 472 | Intel®,Pentium®,Gold G6605 473 | Intel®,Pentium®,6805 474 | Intel®,Pentium®,J6426 475 | Intel®,Pentium®,N6415 476 | Intel®,Pentium®,Silver N6000 477 | Intel®,Pentium®,Silver N6005 478 | Intel®,Pentium®,Gold 7505 479 | Intel®,Xeon®,Bronze 3104 480 | Intel®,Xeon®,Bronze 3106 481 | Intel®,Xeon®,Gold 5115 482 | Intel®,Xeon®,Gold 5118 483 | Intel®,Xeon®,Gold 5119T 484 | Intel®,Xeon®,Gold 5120 485 | Intel®,Xeon®,Gold 5120T 486 | Intel®,Xeon®,Gold 5122 487 | Intel®,Xeon®,Gold 6126 488 | Intel®,Xeon®,Gold 6126F 489 | Intel®,Xeon®,Gold 6126T 490 | Intel®,Xeon®,Gold 6128 491 | Intel®,Xeon®,Gold 6130 492 | Intel®,Xeon®,Gold 6130F 493 | Intel®,Xeon®,Gold 6130T 494 | Intel®,Xeon®,Gold 6132 495 | Intel®,Xeon®,Gold 6134 496 | Intel®,Xeon®,Gold 6136 497 | Intel®,Xeon®,Gold 6138 498 | Intel®,Xeon®,Gold 6138F 499 | Intel®,Xeon®,Gold 6138P 500 | Intel®,Xeon®,Gold 6138T 501 | Intel®,Xeon®,Gold 6140 502 | Intel®,Xeon®,Gold 6142 503 | Intel®,Xeon®,Gold 6142F 504 | Intel®,Xeon®,Gold 6144 505 | Intel®,Xeon®,Gold 6146 506 | Intel®,Xeon®,Gold 6148 507 | Intel®,Xeon®,Gold 6148F 508 | Intel®,Xeon®,Gold 6150 509 | Intel®,Xeon®,Gold 6152 510 | Intel®,Xeon®,Gold 6154 511 | Intel®,Xeon®,Platinum 8153 512 | Intel®,Xeon®,Platinum 8156 513 | Intel®,Xeon®,Platinum 8158 514 | Intel®,Xeon®,Platinum 8160 515 | Intel®,Xeon®,Platinum 8160F 516 | Intel®,Xeon®,Platinum 8160T 517 | Intel®,Xeon®,Platinum 8164 518 | Intel®,Xeon®,Platinum 8168 519 | Intel®,Xeon®,Platinum 8170 520 | Intel®,Xeon®,Platinum 8176 521 | Intel®,Xeon®,Platinum 8176F 522 | Intel®,Xeon®,Platinum 8180 523 | Intel®,Xeon®,Silver 4108 524 | Intel®,Xeon®,Silver 4109T 525 | Intel®,Xeon®,Silver 4110 526 | Intel®,Xeon®,Silver 4112 527 | Intel®,Xeon®,Silver 4114 528 | Intel®,Xeon®,Silver 4114T 529 | Intel®,Xeon®,Silver 4116 530 | Intel®,Xeon®,Silver 4116T 531 | Intel®,Xeon®,E-2124 532 | Intel®,Xeon®,E-2124G 533 | Intel®,Xeon®,E-2126G 534 | Intel®,Xeon®,E-2134 535 | Intel®,Xeon®,E-2136 536 | Intel®,Xeon®,E-2144G 537 | Intel®,Xeon®,E-2146G 538 | Intel®,Xeon®,E-2174G 539 | Intel®,Xeon®,E-2176G 540 | Intel®,Xeon®,E-2176M 541 | Intel®,Xeon®,E-2186G 542 | Intel®,Xeon®,E-2186M 543 | Intel®,Xeon®,E-2224 544 | Intel®,Xeon®,E-2224G 545 | Intel®,Xeon®,E-2226G 546 | Intel®,Xeon®,E-2226GE 547 | Intel®,Xeon®,E-2234 548 | Intel®,Xeon®,E-2236 549 | Intel®,Xeon®,E-2244G 550 | Intel®,Xeon®,E-2246G 551 | Intel®,Xeon®,E-2254ME 552 | Intel®,Xeon®,E-2254ML 553 | Intel®,Xeon®,E-2274G 554 | Intel®,Xeon®,E-2276G 555 | Intel®,Xeon®,E-2276M 556 | Intel®,Xeon®,E-2276ME 557 | Intel®,Xeon®,E-2276ML 558 | Intel®,Xeon®,E-2278G 559 | Intel®,Xeon®,E-2278GE 560 | Intel®,Xeon®,E-2278GEL 561 | Intel®,Xeon®,E-2286G 562 | Intel®,Xeon®,E-2286M 563 | Intel®,Xeon®,E-2288G 564 | Intel®,Xeon®,Bronze 3204 565 | Intel®,Xeon®,Bronze 3206R 566 | Intel®,Xeon®,Gold 5215 567 | Intel®,Xeon®,Gold 5215L 568 | Intel®,Xeon®,Gold 5217 569 | Intel®,Xeon®,Gold 5218B 570 | Intel®,Xeon®,Gold 5218N 571 | Intel®,Xeon®,Gold 5218R 572 | Intel®,Xeon®,Gold 5218T 573 | Intel®,Xeon®,Gold 5220 574 | Intel®,Xeon®,Gold 5220R 575 | Intel®,Xeon®,Gold 5220S 576 | Intel®,Xeon®,Gold 5220T 577 | Intel®,Xeon®,Gold 5222 578 | Intel®,Xeon®,Gold 6208U 579 | Intel®,Xeon®,Gold 6209U 580 | Intel®,Xeon®,Gold 6210U 581 | Intel®,Xeon®,Gold 6212U 582 | Intel®,Xeon®,Gold 6222V 583 | Intel®,Xeon®,Gold 6226 584 | Intel®,Xeon®,Gold 6226R 585 | Intel®,Xeon®,Gold 6230 586 | Intel®,Xeon®,Gold 6230N 587 | Intel®,Xeon®,Gold 6230R 588 | Intel®,Xeon®,Gold 6230T 589 | Intel®,Xeon®,Gold 6238 590 | Intel®,Xeon®,Gold 6238L 591 | Intel®,Xeon®,Gold 6238T 592 | Intel®,Xeon®,Gold 6240 593 | Intel®,Xeon®,Gold 6240L 594 | Intel®,Xeon®,Gold 6240R 595 | Intel®,Xeon®,Gold 6240Y 596 | Intel®,Xeon®,Gold 6242 597 | Intel®,Xeon®,Gold 6242R 598 | Intel®,Xeon®,Gold 6244 599 | Intel®,Xeon®,Gold 6246R 600 | Intel®,Xeon®,Gold 6248 601 | Intel®,Xeon®,Gold 6248R 602 | Intel®,Xeon®,Gold 6250 603 | Intel®,Xeon®,Gold 6250L 604 | Intel®,Xeon®,Gold 6252 605 | Intel®,Xeon®,Gold 6252N 606 | Intel®,Xeon®,Gold 6254 607 | Intel®,Xeon®,Gold 6256 608 | Intel®,Xeon®,Gold 6258R 609 | Intel®,Xeon®,Gold 6262V 610 | Intel®,Xeon®,Gold Gold 5218 611 | Intel®,Xeon®,Gold Gold 6238R 612 | Intel®,Xeon®,Gold6246 613 | Intel®,Xeon®,Goldv 6234 614 | Intel®,Xeon®,Platinum 8253 615 | Intel®,Xeon®,Platinum 8256 616 | Intel®,Xeon®,Platinum 8260 617 | Intel®,Xeon®,Platinum 8260L 618 | Intel®,Xeon®,Platinum 8260Y 619 | Intel®,Xeon®,Platinum 8268 620 | Intel®,Xeon®,Platinum 8270 621 | Intel®,Xeon®,Platinum 8276 622 | Intel®,Xeon®,Platinum 8276L 623 | Intel®,Xeon®,Platinum 8280 624 | Intel®,Xeon®,Platinum 8280L 625 | Intel®,Xeon®,Platinum 9221 626 | Intel®,Xeon®,Platinum 9222 627 | Intel®,Xeon®,Platinum 9242 628 | Intel®,Xeon®,Platinum 9282 629 | Intel®,Xeon®,Silver 4208 630 | Intel®,Xeon®,Silver 4209T 631 | Intel®,Xeon®,Silver 4210 632 | Intel®,Xeon®,Silver 4210R 633 | Intel®,Xeon®,Silver 4210T 634 | Intel®,Xeon®,Silver 4214 635 | Intel®,Xeon®,Silver 4214R 636 | Intel®,Xeon®,Silver 4214Y 637 | Intel®,Xeon®,Silver 4215 638 | Intel®,Xeon®,Silver 4215R 639 | Intel®,Xeon®,Silver 4216 640 | Intel®,Xeon®,W-2223 641 | Intel®,Xeon®,W-2225 642 | Intel®,Xeon®,W-2235 643 | Intel®,Xeon®,W-2245 644 | Intel®,Xeon®,W-2255 645 | Intel®,Xeon®,W-2265 646 | Intel®,Xeon®,W-2275 647 | Intel®,Xeon®,W-2295 648 | Intel®,Xeon®,W-3223 649 | Intel®,Xeon®,W-3225 650 | Intel®,Xeon®,W-3235 651 | Intel®,Xeon®,W-3245 652 | Intel®,Xeon®,W-3245M 653 | Intel®,Xeon®,W-3265 654 | Intel®,Xeon®,W-3265M 655 | Intel®,Xeon®,W-3275 656 | Intel®,Xeon®,W-3275M 657 | Intel®,Xeon®,W-10855M 658 | Intel®,Xeon®,W-10885M 659 | Intel®,Xeon®,W-1250 660 | Intel®,Xeon®,W-1250E 661 | Intel®,Xeon®,W-1250P 662 | Intel®,Xeon®,W-1250TE 663 | Intel®,Xeon®,W-1270 664 | Intel®,Xeon®,W-1270E 665 | Intel®,Xeon®,W-1270P 666 | Intel®,Xeon®,W-1270TE 667 | Intel®,Xeon®,W-1290 668 | Intel®,Xeon®,W-1290E 669 | Intel®,Xeon®,W-1290P 670 | Intel®,Xeon®,W-1290T 671 | Intel®,Xeon®,W-1290TE 672 | Intel®,Xeon®,Gold 5315Y 673 | Intel®,Xeon®,Gold 5317 674 | Intel®,Xeon®,Gold 5318N 675 | Intel®,Xeon®,Gold 5318S 676 | Intel®,Xeon®,Gold 5320 677 | Intel®,Xeon®,Gold 5320T 678 | Intel®,Xeon®,Gold 6312U 679 | Intel®,Xeon®,Gold 6314U 680 | Intel®,Xeon®,Gold 6326 681 | Intel®,Xeon®,Gold 6330 682 | Intel®,Xeon®,Gold 6330N 683 | Intel®,Xeon®,Gold 6334 684 | Intel®,Xeon®,Gold 6336Y 685 | Intel®,Xeon®,Gold 6338 686 | Intel®,Xeon®,Gold 6338N 687 | Intel®,Xeon®,Gold 6338T 688 | Intel®,Xeon®,Gold 6342 689 | Intel®,Xeon®,Gold 6346 690 | Intel®,Xeon®,Gold 6348 691 | Intel®,Xeon®,Gold 6354 692 | Intel®,Xeon®,Gold Gold 5318Y 693 | Intel®,Xeon®,Platinum 8351N 694 | Intel®,Xeon®,Platinum 8352S 695 | Intel®,Xeon®,Platinum 8352V 696 | Intel®,Xeon®,Platinum 8352Y 697 | Intel®,Xeon®,Platinum 8358 698 | Intel®,Xeon®,Platinum 8358P 699 | Intel®,Xeon®,Platinum 8360Y 700 | Intel®,Xeon®,Platinum 8368 701 | Intel®,Xeon®,Platinum 8368Q 702 | Intel®,Xeon®,Platinum 8380 703 | Intel®,Xeon®,Silver 4309Y 704 | Intel®,Xeon®,Silver 4310 705 | Intel®,Xeon®,Silver 4310T 706 | Intel®,Xeon®,Silver 4314 707 | Intel®,Xeon®,Silver 4316 708 | Qualcomm®,Snapdragon™,Snapdragon 850 709 | Qualcomm®,Snapdragon™,Snapdragon 7c 710 | Qualcomm®,Snapdragon™,Snapdragon 8c 711 | Qualcomm®,Snapdragon™,Snapdragon 8cx 712 | Qualcomm®,Snapdragon™,Snapdragon 8cx (Gen2) 713 | Qualcomm®,Snapdragon™,Microsoft SQ1 714 | Qualcomm®,Snapdragon™,Microsoft SQ2 715 | "@ | convertfrom-csv -Header Manafacturer, series, model 716 | 717 | $Proc = (Get-CimInstance -ClassName Win32_Processor).name -split ' ' | ForEach-Object { $models | Where-Object -Property model -eq $_ } 718 | 719 | $Results = [PSCustomObject]@{ 720 | "TPM Compatible" = [bool](Get-Tpm).tpmpresent 721 | "Processor Compatible" = [bool]$Proc 722 | "64 Bit OS" = [Environment]::Is64BitOperatingSystem 723 | } 724 | 725 | if ($results.psobject.properties.value -contains $false) { 726 | write-host "This device is not compatible with Windows 11. See the detailed results for more information" 727 | Set-Asset-Field -Name "Windows 11 Ready" -Value $false 728 | Set-Asset-Field -Name "Windows 11 Results" -Value $($Results | Format-List | Out-String) 729 | } 730 | else { 731 | write-host "This device is compatible with Windows 11. See the detailed results for more information" 732 | Set-Asset-Field -Name "Windows 11 Ready" -Value $true 733 | } -------------------------------------------------------------------------------- /Win11/fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sysadam/Syncro/9b43f957a1e3899ec7fef17bcfcffdbcc59b2950/Win11/fields.png -------------------------------------------------------------------------------- /WinUpdateCheck/CheckBuild.ps1: -------------------------------------------------------------------------------- 1 | $d4n = Invoke-RestMethod -Uri "https://raw.datafornerds.io/ms/mswin/buildnumbers.json" 2 | 3 | $props = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' 4 | $osVer = ([string]$props.CurrentMajorVersionNumber + '.' + [string]$props.CurrentMinorVersionNumber + '.' + [string]$props.CurrentBuildNumber + '.' + [string]$props.UBR) 5 | 6 | $myBuild = $d4n.data | Where-Object { $_.Win10Version -eq $osVer } 7 | 8 | Write-Host "You are running $osVer with Update $($myBuild.Article)" 9 | Write-Host "Your patch level was released by Microsoft on $($myBuild.ReleaseDate)" 10 | 11 | $patchDiff = New-TimeSpan -Start (Get-Date $myBuild.ReleaseDate) -End (Get-Date) 12 | 13 | If($patchDiff.TotalDays -ge 30) { 14 | Write-Host "It might be time to look for an updated patch!" -ForegroundColor Red 15 | } else { 16 | Write-Host "You're patch is recent enough." -ForegroundColor Green 17 | } 18 | -------------------------------------------------------------------------------- /WinUpdateCheck/CheckBuildSyncro.ps1: -------------------------------------------------------------------------------- 1 | Import-Module $env:SyncroModule 2 | 3 | $d4n = Invoke-RestMethod -Uri "https://raw.datafornerds.io/ms/mswin/buildnumbers.json" 4 | $props = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' 5 | $osVer = ([string]$props.CurrentMajorVersionNumber + '.' + [string]$props.CurrentMinorVersionNumber + '.' + [string]$props.CurrentBuildNumber + '.' + [string]$props.UBR) 6 | 7 | $myBuild = $d4n.data | Where-Object { $_.Win10Version -eq $osVer } 8 | 9 | Write-Host "You are running $osVer with Update $($myBuild.Article)" 10 | Write-Host "Your patch level was released by Microsoft on $($myBuild.ReleaseDate)" 11 | 12 | $patchDiff = New-TimeSpan -Start (Get-Date $myBuild.ReleaseDate) -End (Get-Date) 13 | 14 | If($patchDiff.TotalDays -ge 30) { 15 | Write-Host "It might be time to look for an updated patch!" -ForegroundColor Red 16 | Set-Asset-Field -Name "Field Name" -Value $someVariable 17 | } else { 18 | Write-Host "You're patch is recent enough." -ForegroundColor Green 19 | } 20 | -------------------------------------------------------------------------------- /WinUpdateCheck/README.md: -------------------------------------------------------------------------------- 1 | WIP don't use 2 | --------------------------------------------------------------------------------