-
Posts
162 -
Joined
-
Last visited
Reputation
26 ExcellentAbout LRSFC_DanJ

Personal Information
-
Occupation
Senior ITServices Technician
-
Location
Cambridge
- X
Employer (optional)
-
Company Represented
Long Road Sixth Form College
Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
-
We're looking at setting things up so that our Games Development course can do Unreal Engine game development for Meta Quest VR headsets. One stumbling block that we've come across is that part of the packaging process in Unreal Editor calls out to Command Prompt, which is blocked for student users. Our current advice has been that students will need to pass their project to their teacher for packaging, but we're looking into possible alternatives. It turns out that it is possible to do the packaging process on a separate machine/account via a command line rather than through the GUI, but we'd need some kind of workflow or orchestration engine to take care of receiving user requests, doing some basic validation on the supplied project (is the submitter a valid user, does the submitted path exist, does it contain a valid project file, etc), maintaining a queue of requests, running the packaging process (one at a time, as it's quite the intensive process), then feeding back to the user that their project has been processed. I could write a script to do this kind of orchestration myself, but it seems like the kind of thing that should already exist? Does anyone know of a package that can do this that can run on Windows?
-
I think we'll go with the easier suggestion of buying a commercial domain direct through Cloudflare and using that instead.
- 8 replies
-
- 1
-
-
- cloudflare
- tunnel
-
(and 3 more)
Tagged with:
-
Does Entra Application Proxy have any web application firewall functionality? As we'll need that as well, hence looking at Cloudflare as they have a WAF option.
- 8 replies
-
- cloudflare
- tunnel
-
(and 3 more)
Tagged with:
-
No, the other end is controlled by our third party admissions platform provider. We also would not want them "inside" our network boundary, which would be the case if we had a tunnel directly to them.
- 8 replies
-
- cloudflare
- tunnel
-
(and 3 more)
Tagged with:
-
In order to integrate with the admissions platform we're using, we'd like to use a Cloudflare tunnel and web application firewall to make the API endpoint for our MIS system available for their system to connect to over the internet, without needing to expose our MIS system directly to the public internet. However looking at Cloudflare's documentation it seems like you have to switch your whole domain's DNS over to Cloudflare as part of the Cloudflare onboarding process? We don't want to do that as we are an .ac.uk domain holder and as such we use Janet DNS for our public DNS. Is it still possible for us to use Cloudflare's tunnels, or do we need to look for a different solution? Entra Application Proxy was something else we looked at but this appears to require an Entra sign-in, which is no good for an API that is only going to be used by automated systems.
- 8 replies
-
- cloudflare
- tunnel
-
(and 3 more)
Tagged with:
-
The full "Microsoft 365 Copilot" licenses would be prohibitively expensive for us to make available for all our staff users, so they do not have access to "Copilot in PowerPoint 365" and can only generate text-only presentations with the regular Copilot Chat. However we do have Copilot Studio licenses and a pack of 25,000 Copilot Credits, so we were wondering if it's possible to create an Agent with Copilot Studio which can generate a PowerPoint presentation which includes images, when requested to do so by our staff members?
-
I put it in as a startup script in a GPO but there's no reason you couldn't have it run in other GPO areas or as a scheduled task or something like that. Unlike DisplaySwitch.exe it should work fine if the computer is at the lock screen as it's not doing anything that requires an interactive session. Wherever you're running it though, it does need administrative permissions due to the registry keys it accesses, so you can't run it in a user context (but then you don't need to run it in a user context, as in the user context you can just use DisplaySwitch.exe instead).
-
Since nobody on the entire internet seems to have a solution for this problem, I plugged away at it for a bit and managed to come up with one myself. Presenting "FixDuplicateDisplay.ps1". Stick this as a PowerShell Startup Script in a GPO targetting computers. NOTE: while I have tested this in our environment and it appears to work, you will need to make your own judgement as to whether you consider it to be safe. It does log everything to C:\Windows\Temp though. As for how it works, it creates the required monitor configuration registry keys and values and then restarts the graphics driver. # Configures registry entries so the system should think that its most recent display topology was clone mode # by Dan Jackson # 2026-01-23 initial version # 2026-01-27 now works successfully! # Log filename $logfilename = "C:\Windows\Temp\FixDuplicateDisplay-" + (Get-Date -uformat "%Y%m%d%H%M%S") + ".log" $transcriptfilename = "C:\Windows\Temp\FixDuplicateDisplay-Transcript-" + (Get-Date -uformat "%Y%m%d%H%M%S") + ".log" $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " FixDuplicateDisplay session start" $outLine | Out-File $logfilename -Encoding UTF8 Start-Transcript $transcriptfilename # Get connected monitors from WMI $connectedMonitors = gwmi WmiMonitorID -Namespace root\wmi # Do we have more than one monitor? if ($null -eq $connectedMonitors -or $connectedMonitors.Count -lt 2) { # Only one monitor or failed to get monitor IDs $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Only one monitor ID or failed to get monitor IDs, exiting" $outLine | Out-File $logfilename -Encoding UTF8 -Append exit 1 } $cms = @() foreach ($monitor in $connectedMonitors) { $monitorString = [System.Text.Encoding]::ASCII.GetString(($monitor.ManufacturerName | Where-Object {$_ -ne 0x0})) + [System.Text.Encoding]::ASCII.GetString(($monitor.ProductCodeID | Where-Object {$_ -ne 0x0})) + [System.Text.Encoding]::ASCII.GetString(($monitor.SerialNumberID | Where-Object {$_ -ne 0x0})) $cms += $monitorString } # Get existing monitor IDs from MonitorDataStore $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Getting monitor IDs from MonitorDataStore" $outLine | Out-File $logfilename -Encoding UTF8 -Append $monitorDataStore = (Get-ChildItem HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\MonitorDataStore).PSChildName # Filter MonitorDataStore down to monitors that actually exist and are currently connected $oldMonitorDataStore = $monitorDataStore.PSObject.Copy() $monitorDataStore = @() foreach ($monitor in $cms) { $monitorMatch = $null $monitorMatch = $oldMonitorDataStore | Where-Object {$_ -match $monitor} if ($null -ne $monitorMatch) { $monitorDataStore += $monitorMatch } } # MD5 hash required objects $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $utf8 = New-Object -TypeName System.Text.UTF8Encoding # Construct connectivity subkey string $multiMonitors = $monitorDataStore -join "^" $hash = ($md5.ComputeHash($utf8.GetBytes($multiMonitors)) | % {$_.ToString("X2")}) -join "" $connectivityString = $multiMonitors + "^" + $hash $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Connectivity subkey string constructed: '$($connectivityString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append # Construct clone value string $cloneString = $monitorDataStore -join "*" $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Clone value string constructed: '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append # Construct configuration subkey string $hash = ($md5.ComputeHash($utf8.GetBytes($cloneString)) | % {$_.ToString("X2")}) -join "" $configurationString = $cloneString + "^" + $hash $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Configuration subkey string constructed: '$($configurationString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append # Construct setId value string $setIdString = $monitorDataStore -join "^" $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " SetID value string constructed: '$($setIdString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append # Construct QWORD timestamp value $qwordTimestamp = [datetime]::Now.ToFileTime() $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " QWORD timestamp value: '$($qwordTimestamp)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append # Check if connectivity subkey exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of subkey: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append if (!(Test-Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)")) { # subkey does not exist $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating subkey: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-Item -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Confirm:$false -Force } # Check if Connectivity Clone value exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of Clone value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\Clone'" $outLine | Out-File $logfilename -Encoding UTF8 -Append $cloneObject = $null $cloneObject = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "Clone" -ErrorAction "SilentlyContinue" # If connectivity clone value exists, update it if ($null -ne $cloneObject) { # Connectivity Clone value needs updating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Setting Clone value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\Clone' to value '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "Clone" -Value $cloneString -Force -Confirm:$false } else { # Connectivity Clone value needs creating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating Clone value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\Clone' with value '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "Clone" -PropertyType String -Value $cloneString -Force -Confirm:$false } # Check if Connectivity Recent value exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of Recent value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\Recent'" $outLine | Out-File $logfilename -Encoding UTF8 -Append $recentObject = $null $recentObject = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "Recent" -ErrorAction "SilentlyContinue" # If connectivity recent value exists, update it if ($null -ne $recentObject) { # Connectivity Recent value needs updating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Setting Recent value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\Recent' to value '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "Recent" -Value $cloneString -Force -Confirm:$false } else { # Connectivity Recent value needs creating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating Recent value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\Recent' with value '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "Recent" -PropertyType String -Value $cloneString -Force -Confirm:$false } # Check if Connectivity SetId value exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of SetId value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\SetId'" $outLine | Out-File $logfilename -Encoding UTF8 -Append $setIdObject = $null $setIdObject = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "SetId" -ErrorAction "SilentlyContinue" # If connectivity setId value exists, update it if ($null -ne $setIdObject) { # Connectivity SetId value needs updating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Setting SetId value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\SetId' to value '$($setIdString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "SetId" -Value $setIdString -Force -Confirm:$false } else { # Connectivity SetId value needs creating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating SetId value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)\SetId' with value '$($setIdString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Connectivity\$($connectivityString)" -Name "SetId" -PropertyType String -Value $setIdString -Force -Confirm:$false } # Check if configuration subkey exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of subkey: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append if (!(Test-Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)")) { # subkey does not exist $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating subkey: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-Item -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Confirm:$false -Force } # Check if Configuration SetId value exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of SetId value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)\SetId'" $outLine | Out-File $logfilename -Encoding UTF8 -Append $setIdObject = $null $setIdObject = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Name "SetId" -ErrorAction "SilentlyContinue" # If configuration setId value exists, update it if ($null -ne $setIdObject) { # Configuration SetId value needs updating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Setting SetId value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)\SetId' to value '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Name "SetId" -Value $cloneString -Force -Confirm:$false } else { # Configuration SetId value needs creating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating SetId value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)\SetId' with value '$($cloneString)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Name "SetId" -PropertyType String -Value $cloneString -Force -Confirm:$false } # Check if Configuration timestamp value exists $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Checking existence of Timestamp value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)\Timestamp'" $outLine | Out-File $logfilename -Encoding UTF8 -Append $qwordTimestampObject = $null $qwordTimestampObject = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Name "Timestamp" -ErrorAction "SilentlyContinue" # If configuration timestamp value exists, update it if ($null -ne $qwordTimestampObject) { # Configuration timestamp value needs updating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Setting Timestamp value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)\Timestamp' to value '$($qwordTimestamp)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Name "Timestamp" -Value $qwordTimestamp -Force -Confirm:$false } else { # Configuration timestamp value needs creating $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Creating Timestamp value: 'HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)\Timestamp' with value '$($qwordTimestamp)'" $outLine | Out-File $logfilename -Encoding UTF8 -Append New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\GraphicsDrivers\Configuration\$($configurationString)" -Name "Timestamp" -PropertyType QWORD -Value $qwordTimestamp -Force -Confirm:$false } # Now all registry keys are set, restart graphics drivers! $timestamp = Get-Date -uformat "%Y-%m-%dT%H:%M:%S" $outLine = $timestamp + " Restarting graphics drivers" $outLine | Out-File $logfilename -Encoding UTF8 -Append Get-PnpDevice -Class "Display" | Disable-PnpDevice -Confirm:$false Get-PnpDevice -Class "Display" | Enable-PnpDevice -Confirm:$false Stop-Transcript
-
The above posters are correct - the most common issue being reported is that the monitor screen is black, as when logging on the teacher may not have switched the projector/IWB out of standby mode, but the computer still sees them as existing as displays.
-
Unfortunately this doesn't help at the login screen, which is the most common callout we have when this issue occurs.
-
Unfortunately it's the login screen that's the biggest problem.
-
Our classroom teacher PCs are connected to both a monitor and a projector or interactive whiteboard. Some teachers like to set the displays to "extend" for some reason, but this then confuses other teachers who then come to use the room, and despite having told them they need to use Windows key + P to change it back, we still get a lot of complaints. So I've been looking into if it's possible to have the computers automatically duplicate the screen on startup. I found there is an app c:\windows\system32\displayswitch.exe which if you give the /clone switch will duplicate the display. However if I put this in a scheduled task to run at startup, this does not seem to work. I've seen some solutions that recommend using psexec but we cannot use this in our environment as it is blocked by our security software. Does anyone have any ideas? Windows 11 Enterprise 24H2.
-
Autograph Maths - what's happened to the website?
LRSFC_DanJ replied to LRSFC_DanJ's topic in Educational Software
Ah yes, indeed that's true. I guess in that situation you'd have to introduce a dummy record in your on-premise DNS service? But either way there's definitely a problem at the Complete Maths end and they will need to be the ones resolving it. -
Autograph Maths - what's happened to the website?
LRSFC_DanJ replied to LRSFC_DanJ's topic in Educational Software
It's not down, if you put the IP address in your hosts file it works, the problem is with their DNS servers. -
Autograph Maths - what's happened to the website?
LRSFC_DanJ replied to LRSFC_DanJ's topic in Educational Software
I think their DNS has gotten screwed up somehow, if I go to DNS Dumpster and search up their domain I can get the IP, and if I put that in my hosts file I can make the website work.
