-
Posts
149 -
Joined
-
Last visited
Content Type
Forums
News
20th
EduGeek EDIT Conference
Blogs
Everything posted by MartinByard
-
We deploy both Visual Studio Community Edition and VS Code. Visual Studio is deployed with a standard set of workflows and plugins installed that we have been asked to include, but also with the reg policies in place to enable non-admins to update and modify it as needed. Powershell Snippet of that bit: Write-Host "Creating VisualStudio Setup Reg Key" if(!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup")){ New-Item -Path HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio -Name Setup -Force } Write-Host "Creating AllowStandardUserControl Reg Value" New-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\VisualStudio\Setup -Name AllowStandardUserControl -PropertyType DWORD -Value 2 -Force VS Code is deployed with a standard set of plugins copied into the Program Files folder so that they are installed and present for all users.
-
Can you put a shortcut to it (with the /clone switch) in the public startup folder in the start menu, that way it will apply once someone has logged in. It won't help pre-login, but would work once they are logged in and running apps.
-
Link: Download Notepad++ v8.8.9 (Vulnerability Fix) In case people haven't seen, Notepad++ have released a new version which patches a vulnerability in its update method that is actively being exploited.
-
Planet Estream - Digital Signage Players
MartinByard replied to BucksITguy's topic in AV and Multimedia Related
We use Planet eStream, and you can get a linux version of the signage player that will run on Raspberry Pi's quickstart guide here. -
I knew there was something that was missing the in the Education plan, that sounds more likely than no SSO at all (although as I said, it was a while ago when I last looked into it).
-
Just to note on the Autodesk and SSO etc. Last time I looked into it (was a while ago, so might have changed now), this was possible on the paid for Enterprise plan - but not the free Education plan.
-
We used to do method 2, but that stopped working reliably and so have switched to method 1, and it seems to be pretty rock solid for us.
-
We've been having problems with this when moving to 24H2. Traditionally we would pin things to create a start menu we wanted, and then copy the start2.bin file into the default user and then "it just worked" for all other new users (we do it in our SCCM task sequence). It has been very hit and miss for us on 24H2. I managed to find this https://github.com/letsdoautomation/powershell/blob/main/Export-StartLayout%2C Import-StartLayout alternatives for Windows 11/README.md, which aims to replicate the reg keys that are created when InTune is managing the start menu for you. It seems to be rock solid so far, but as with anything test it yourself before rolling it out everywhere. The apps we've added to our start menu are: "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Word.lnk", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Excel.lnk", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\OneNote.lnk", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\PowerPoint.lnk", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Office 365.lnk", "C:\Users\%username%\Appdata\Roaming\Microsoft\Windows\Start Menu\Programs\File Explorer.lnk", "MSTeams_8wekyb3d8bbwe!MSTeams", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Edge.lnk", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk", "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Log Off.lnk", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Take a Break.lnk"
-
At the minute we run this script in our SCCM task sequence whilst the machine is still in the WinPE phase: # *************************************************************************** # # File: RemoveApps.ps1 # # Version: 1.2 # # Author: Michael Niehaus # # Purpose: Removes some or all of the in-box apps on Windows 8, Windows 8.1, # or Windows 10 systems. The script supports both offline and # online removal. By default it will remove all apps, but you can # provide a separate RemoveApps.xml file with a list of apps that # you want to instead remove. If this file doesn't exist, the # script will recreate one in the log or temp folder, so you can # run the script once, grab the file, make whatever changes you # want, then put the file alongside the script and it will remove # only the apps you specified. # # Usage: This script can be added into any MDT or ConfigMgr task sequences. # It has a few dependencies: # 1. For offline use in Windows PE, the .NET Framework, # PowerShell, DISM Cmdlets, and Storage cmdlets must be # included in the boot image. # 2. Script execution must be enabled, e.g. "Set-ExecutionPolicy # Bypass". This can be done via a separate task sequence # step if needed, see http://blogs.technet.com/mniehaus for # more information. # # ------------- DISCLAIMER ------------------------------------------------- # This script code is provided as is with no guarantee or waranty concerning # the usability or impact on systems and may be used, distributed, and # modified in any way provided the parties agree and acknowledge the # Microsoft or Microsoft Partners have neither accountabilty or # responsibility for results produced by use of this script. # # Microsoft will not provide any support through any means. # ------------- DISCLAIMER ------------------------------------------------- # # *************************************************************************** # --------------------------------------------------------------------------- # Initialization # --------------------------------------------------------------------------- if ($env:SYSTEMDRIVE -eq "X:") { $script:Offline = $true # Find Windows $drives = get-volume | ? {-not [String]::IsNullOrWhiteSpace($_.DriveLetter) } | ? {$_.DriveType -eq 'Fixed'} | ? {$_.DriveLetter -ne 'X'} $drives | ? { Test-Path "$($_.DriveLetter):\Windows\System32"} | % { $script:OfflinePath = "$($_.DriveLetter):\" } Write-Verbose "Eligible offline drive found: $script:OfflinePath" } else { Write-Verbose "Running in the full OS." $script:Offline = $false } # --------------------------------------------------------------------------- # Get-LogDir: Return the location for logs and output files # --------------------------------------------------------------------------- function Get-LogDir { try { $ts = New-Object -ComObject Microsoft.SMS.TSEnvironment -ErrorAction Stop if ($ts.Value("LogPath") -ne "") { $logDir = $ts.Value("LogPath") } else { $logDir = $ts.Value("_SMSTSLogPath") } } catch { $logDir = $env:TEMP } return $logDir } # --------------------------------------------------------------------------- # Get-AppList: Return the list of apps to be removed # --------------------------------------------------------------------------- function Get-AppList { begin { # Look for a config file. $configFile = "$PSScriptRoot\RemoveApps11.xml" if (Test-Path -Path $configFile) { # Read the list Write-Verbose "Reading list of apps from $configFile" $list = Get-Content $configFile } else { # No list? Build one with all apps. Write-Verbose "Building list of provisioned apps" $list = @() if ($script:Offline) { Get-AppxProvisionedPackage -Path $script:OfflinePath | % { $list += $_.DisplayName } } else { Get-AppxProvisionedPackage -Online | % { $list += $_.DisplayName } } # Write the list to the log path $logDir = Get-LogDir $configFile = "$logDir\RemoveApps.xml" $list | Set-Content $configFile Write-Information "Wrote list of apps to $logDir\RemoveApps.xml, edit and place in the same folder as the script to use that list for future script executions" } Write-Information "Apps selected for removal: $list.Count" } process { $list } } # --------------------------------------------------------------------------- # Remove-App: Remove the specified app (online or offline) # --------------------------------------------------------------------------- function Remove-App { [CmdletBinding()] param ( [parameter(Mandatory=$true,ValueFromPipeline=$true)] [string] $appName ) begin { # Determine offline or online if ($script:Offline) { $script:Provisioned = Get-AppxProvisionedPackage -Path $script:OfflinePath } else { $script:Provisioned = Get-AppxProvisionedPackage -Online $script:AppxPackages = Get-AppxPackage } } process { $app = $_ # Remove the provisioned package Write-Information "Removing provisioned package $_" $current = $script:Provisioned | ? { $_.DisplayName -eq $app } if ($current) { if ($script:Offline) { $a = Remove-AppxProvisionedPackage -Path $script:OfflinePath -PackageName $current.PackageName } else { $a = Remove-AppxProvisionedPackage -Online -PackageName $current.PackageName } } else { Write-Warning "Unable to find provisioned package $_" } # If online, remove installed apps too if (-not $script:Offline) { Write-Information "Removing installed package $_" $current = $script:AppxPackages | ? {$_.Name -eq $app } if ($current) { $current | Remove-AppxPackage } else { Write-Warning "Unable to find installed app $_" } } } } # --------------------------------------------------------------------------- # Main logic # --------------------------------------------------------------------------- $logDir = Get-LogDir Start-Transcript "$logDir\RemoveApps.log" Get-AppList | Remove-App Stop-Transcript with this in an xml file in the location with the name from the script: Clipchamp.Clipchamp Microsoft.549981C3F5F10 Microsoft.BingNews Microsoft.BingWeather Microsoft.GamingApp Microsoft.GetHelp Microsoft.Getstarted Microsoft.MicrosoftOfficeHub Microsoft.MicrosoftSolitaireCollection Microsoft.People Microsoft.PowerAutomateDesktop Microsoft.SecHealthUI Microsoft.Todos Microsoft.WindowsAlarms microsoft.windowscommunicationsapps Microsoft.WindowsFeedbackHub Microsoft.WindowsMaps Microsoft.WindowsSoundRecorder Microsoft.Xbox.TCUI Microsoft.XboxGameOverlay Microsoft.XboxGamingOverlay Microsoft.XboxIdentityProvider Microsoft.XboxSpeechToTextOverlay Microsoft.YourPhone Microsoft.ZuneMusic Microsoft.ZuneVideo This seems to give us a relatively clean install.
-
Updating Adobe Creative Cloud - AUSST & RUM
MartinByard replied to Fazza's topic in Enterprise Software
Yes, thats what we do - on a weekly schedule every sunday morning it checks for incremental updates. We did have it doing the cleanup as well, but it would intermittently remove things it shouldn't (e.g all Photoshop downloads) so we removed that and just keep an eye on the disk space its using and when it runs out run a --fresh command to remove everything and start again. -
Just after christmas I bought myself some new bits from CCL (http://www.cclonline.com, although I did click and collect as its relatively local to me) and am very happy with them. AMD Ryzen 5 9600x, ASUS ROG Strix B650-E mobo, 32Gb Corsair Vengance RAM, Noctua NH-D15 cooler,, Gigabyte RTX 4070 GPU, 1Tb WD SN850x NVMe SSD, Fractal Define 7 case.
-
We do it through SCCM/MECM through a simple batch file (not got round to converting it to a powershell script yet), using the .exe. start /wait npp.8.6.4.Installer.x64.exe /S copy .\config.model.xml "C:\Program Files\Notepad++\config.model.xml" /Y The .xml file is so that we can control and force some settings, but would not necessarily be needed for others.
-
We do it in our OSD task sequence, and we break it down so we install each app seperately (with the needed edits made when the package is created in the console) and use the setup.exe with the --silent switch.
-
Updating Adobe Creative Cloud - AUSST & RUM
MartinByard replied to Fazza's topic in Enterprise Software
We've had our AUSST server up and running for a while now, and have got our override details input into the Admin control panel in the cloud so when we create the Adobe packages to install the apps, the overrides are already present. Then we have a scheduled task that runs the remote update manager (also added as part of the package created from the admin control panel), which runs once a week (probably a bit too often, but our feeling was better safe than sorry) late friday afternoon / early evening. $DT = Get-date -Format yyMMdd if(!(Test-Path "C:\Windows\Logs\Adobe_RUM")){ New-Item -Path "C:\Windows\Logs" -Name "Adobe_RUM" -ItemType Directory -Force } Start-Transcript -Path C:\Windows\Logs\Adobe_RUM\Adobe_RUM_$DT.log -Force $StartTime = Get-date -Format HHmm Write-Host "Started at $StartTime" Start-Process -FilePath "C:\Program Files (x86)\Common Files\Adobe\OOBE_Enterprise\RemoteUpdateManager\RemoteUpdateManager.exe" -Wait If(Test-Path 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Adobe\Adobe*.lnk'){ Move-Item -Path 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Adobe*.lnk' -Destination 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Adobe' -Force -Verbose } $StopTime = Get-date -Format HHmm Write-Host "Started at $StopTime" Stop-Transcript The main thing to remeber (if it applies to you) is that for whatever reason macOS devices can't use it, if you give them the override then they will just sit there doing nothing. -
We bought some 255 models during covid and had an issue with the driver packs, I think its due to these being from the Home range and not being an Enterprise model - thus there are no driver packs available for enterprises to use. I ended up letting one build using the factory image, making sure everything was installed and the latest version (at the time) and then creating a driver pack from that machine: [color=#0101FD][font=SFMono-Regular]Export-WindowsDriver[/font][/color][color=#006881][font=SFMono-Regular] -Online[/font][/color][color=#006881][font=SFMono-Regular] -Destination[/font][/color][color=#161616][font=SFMono-Regular] C:\HP255_drivers[/font][/color]
-
M365 Office and Office Pro Plus
MartinByard replied to discoveranother's topic in Licensing Questions
The M365 Apps Enterprise is listed as being an Add-on, so if the Office Pro Plus was removed then that would be removed as well - if this is the case (licensing is not my strong suit) they possibly could have explained it better. -
We've created a couple of task sequences in SCCM which can backup and restore devices using DISM with the /ffu option to use full disk images. The backup TS starts from within Windows and suspends bitlocker, reboots into PXE then runs the following Powershell script (slightly edited) which pops up a windows form to ask where and what to call the backup file, abd then runs the backup command: function button { ###################Load Assembly for creating form & button###### [void][system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) [void][system.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”) #####Define the form size & placement $form = New-Object “System.Windows.Forms.Form”; $form.Width = 650; $form.Height = 250; $form.Text = $title; $form.StartPosition = [system.Windows.Forms.FormStartPosition]::CenterScreen; ##############Define text label1 $textLabel1 = New-Object “System.Windows.Forms.Label”; $textLabel1.Left = 25; $textLabel1.Top = 15; $textLabel1.Width = 175; $textLabel1.Height = 50; $textLabel1.Text = "Please enter the desired filename for the backup"; ##############Define text label2 $textLabel2 = New-Object “System.Windows.Forms.Label”; $textLabel2.Left = 25; $textLabel2.Top = 70; $textLabel2.Width = 175; $textLabel2.Height = 15; $textLabel2.Text = "Please enter the desired location for the backup"; ##############Define text label3 $textLabel3 = New-Object “System.Windows.Forms.Label”; $textLabel3.Left = 25; $textLabel3.Top = 100; $textLabel3.Width = 600; $textLabel3.Height = 25; $textLabel3.Text = "Examples - \\\MasterImages - \\\Builds\PCBackups"; ##############Define text label5 $textLabel5 = New-Object “System.Windows.Forms.Label”; $textLabel5.Left = 50; $textLabel5.Top = 160; $textLabel5.Width = 350; $textlabel5.Height = 50; $textLabel5.Text = “If you are not expecting to see this screen, please contact the IT Service Desk on x22222”; ############Define text box1 for input $textBox1 = New-Object “System.Windows.Forms.TextBox”; $textBox1.Left = 225; $textBox1.Top = 15; $textBox1.width = 200; ############Define text box2 for input $textBox2 = New-Object “System.Windows.Forms.TextBox”; $textBox2.Left = 225; $textBox2.Top = 70; $textBox2.width = 200; #############Define default values for the input boxes $textBox1.Text = ""; $textBox2.Text = "\\\MasterImages"; #############define OK button $button = New-Object “System.Windows.Forms.Button”; $button.Left = 425; $button.Top = 120; $button.Width = 75; $button.Text = “OK”; ############# This is when you have to close the form after getting values $eventHandler = [system.EventHandler]{ $global:filename = $TextBox1.Text $TextBox1.Text $global:location = $TextBox2.Text $TextBox2.Text $form.Close(); }; $button.Add_Click($eventHandler); #############Add controls to all the above objects defined $form.Controls.Add($button); $form.Controls.Add($textLabel1); $form.Controls.Add($textLabel2); $form.Controls.Add($textLabel3); $form.Controls.Add($textLabel5); $form.Controls.Add($textBox1); $form.Controls.Add($textBox2); $ret = $form.ShowDialog(); #################return values return $TextBox1.Text, $TextBox2.Text } [system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) #Hide the progress dialog $TSProgressUI = new-object -comobject Microsoft.SMS.TSProgressUI $TSProgressUI.CloseProgressDialog() # Pop up device backup name message [system.Windows.Forms.MessageBox]::Show("Please enter the desired name and location of the backup file", "Device Backup TS") $return = button # Capture device backup name $BackupName1 = $global:filename $BackupName2 = $BackupName1 + "D" $BackupLocation1 = $global:location # Set actual TS variable $tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment $tsenv.value("BackupName") = $BackupName1 $tsenv.value("BackupLocation") = $BackupLocation1 $Server = ($BackupLocation1 -split '\\')[2] $Share = ($BackupLocation1 -split '\\')[3] $NetworkPath = "\\" + $Server + "\" + $Share Write-Host "Server is $Server" Write-Host "Share is $Share" Write-Host "NetworkPath is $NetworkPath" Write-Host "BackupName1 is $BackupName1" Write-Host "BackupLocation1 is $BackupLocation1" $tsenv.value("NetworkPath") = $NetworkPath $TSName = $tsenv.value("_SMSTSPackageName") # Create auditing variables $hostname = hostname $macaddress1 = (get-wmiobject -class "Win32_NetworkAdapterConfiguration" | Where{$_.IpEnabled -Match "True"} | Where{ $_.IPADDRESS -like "10.*.*.*" } | select MACAddress).macaddress $system = get-wmiobject win32_computersystem [string]$DT = date $nic = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE $ipaddress = ($NIC.IPAddress[0]) net use \\ /u: # Specify the path to the audit file, and the string to output to it [string]$audit1 = "\\\PCbackups\pcbackups.log" [string]$auditinfo1 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST STARTED " + $TSName + " capturing FFU to " + $BackupName1 + ".wim" + ",on share" + $NetworkPath + " with full file path of " + $BackupLocation1 # Add audit string to the audit file $auditinfo1 | Out-File $audit1 -Append -Encoding ASCII Start-Sleep 2 net use \\ /d net use $NetworkPath /u: Start-Sleep 5 Start-Process dism -ArgumentList "/capture-ffu /imagefile:$BackupLocation1\$BackupName1.wim /capturedrive:\\.\PhysicalDrive0 /name:$BackupName1" -Wait Start-Sleep 10 net use $NetworkPath /d net use \\ /u: [string]$audit2 = "\\\PCbackups\pcbackups.log" [string]$auditinfo2 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST FINISHED " + $TSName + " capturing FFU to " + $BackupName1 + ".wim" + ",on share" + $NetworkPath + " with full file path of " + $BackupLocation1 $auditinfo2 | Out-File $audit2 -Append -Encoding ASCII Start-Sleep 2 net use \\ /d [system.Windows.Forms.MessageBox]::Show("Device has successfully been captured to $BackupLocation1", "Device Backup TS") exit 0 The restore TS is only available in PXE and formats the disk and then runs the following powershell which pops up a windows form to ask where and what the backup file to restore is, and then runs the restore command: function button { ###################Load Assembly for creating form & button###### [void][system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) [void][system.Reflection.Assembly]::LoadWithPartialName(“Microsoft.VisualBasic”) #####Define the form size & placement $form = New-Object “System.Windows.Forms.Form”; $form.Width = 650; $form.Height = 250; $form.Text = $title; $form.StartPosition = [system.Windows.Forms.FormStartPosition]::CenterScreen; ##############Define text label1 $textLabel1 = New-Object “System.Windows.Forms.Label”; $textLabel1.Left = 25; $textLabel1.Top = 15; $textLabel1.Width = 175; $textLabel1.Height = 50; $textLabel1.Text = "Please enter the desired filename to restore"; ##############Define text label2 $textLabel2 = New-Object “System.Windows.Forms.Label”; $textLabel2.Left = 25; $textLabel2.Top = 70; $textLabel2.Width = 175; $textLabel2.Height = 15; $textLabel2.Text = "Please enter the desired location to restore from"; ##############Define text label3 $textLabel3 = New-Object “System.Windows.Forms.Label”; $textLabel3.Left = 25; $textLabel3.Top = 100; $textLabel3.Width = 600; $textLabel3.Height = 25; $textLabel3.Text = "Examples - \\\MasterImages - \\\Builds\PCBackups"; ##############Define text label5 $textLabel5 = New-Object “System.Windows.Forms.Label”; $textLabel5.Left = 50; $textLabel5.Top = 160; $textLabel5.Width = 350; $textlabel5.Height = 50; $textLabel5.Text = “If you are not expecting to see this screen, please contact the IT Service Desk on x22222”; ############Define text box1 for input $textBox1 = New-Object “System.Windows.Forms.TextBox”; $textBox1.Left = 225; $textBox1.Top = 15; $textBox1.width = 200; ############Define text box2 for input $textBox2 = New-Object “System.Windows.Forms.TextBox”; $textBox2.Left = 225; $textBox2.Top = 70; $textBox2.width = 200; #############Define default values for the input boxes $textBox1.Text = ""; $textBox2.Text = "\\\MasterImages"; #############define OK button $button = New-Object “System.Windows.Forms.Button”; $button.Left = 425; $button.Top = 120; $button.Width = 75; $button.Text = “OK”; ############# This is when you have to close the form after getting values $eventHandler = [system.EventHandler]{ $global:filename = $TextBox1.Text $TextBox1.Text $global:location = $TextBox2.Text $TextBox2.Text $form.Close(); }; $button.Add_Click($eventHandler); #############Add controls to all the above objects defined $form.Controls.Add($button); $form.Controls.Add($textLabel1); $form.Controls.Add($textLabel2); $form.Controls.Add($textLabel3); $form.Controls.Add($textLabel5); $form.Controls.Add($textBox1); $form.Controls.Add($textBox2); $ret = $form.ShowDialog(); #################return values return $TextBox1.Text, $TextBox2.Text } [system.Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”) #Hide the progress dialog $TSProgressUI = new-object -comobject Microsoft.SMS.TSProgressUI $TSProgressUI.CloseProgressDialog() # Pop up device backup name message [system.Windows.Forms.MessageBox]::Show("Please enter the name and location of the backup file to restore", "Device Backup TS") $return = button # Capture device backup name $BackupName1 = $global:filename $BackupName2 = $BackupName1 + "D" $BackupLocation1 = $global:location # Set actual TS variable $tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment $tsenv.value("BackupName") = $BackupName1 $tsenv.value("BackupLocation") = $BackupLocation1 $Server = ($BackupLocation1 -split '\\')[2] $Share = ($BackupLocation1 -split '\\')[3] $NetworkPath = "\\" + $Server + "\" + $Share $tsenv.value("NetworkPath") = $NetworkPath $TSName = $tsenv.value("_SMSTSPackageName") # Create auditing variables $hostname = hostname $macaddress1 = (get-wmiobject -class "Win32_NetworkAdapterConfiguration" | Where{$_.IpEnabled -Match "True"} | Where{ $_.IPADDRESS -like "10.*.*.*" } | select MACAddress).macaddress $system = get-wmiobject win32_computersystem [string]$DT = date $nic = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE $ipaddress = ($NIC.IPAddress[0]) # Specify the path to the audit file, and the string to output to it [string]$audit1 = "\\\PCbackups\pcbackups.log" [string]$auditinfo1 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST STARTED " + $TSName + " restoring " + $BackupName1 + ".wim" + ",on share " + $NetworkPath # Add audit string to the audit file $auditinfo1 | Out-File $audit1 -Append -Encoding ASCII Start-Sleep 2 net use $NetworkPath /u: Start-Process DISM -ArgumentList "/apply-ffu /ImageFile:$BackupLocation1\$BackupName1.wim /ApplyDrive:\\.\PhysicalDrive0" -Wait net use $NetworkPath /d [string]$audit2 = "\\\PCbackups\pcbackups.log" [string]$auditinfo2 = $macaddress1 + "," + $DT + "," + $ipaddress + "," + $hostname + "," + $system.manufacturer + "," + $system.model + ",JUST FINISHED " + $TSName + " restoring " + $BackupName1 + ".wim" + ",on share " + $NetworkPath $auditinfo2 | Out-File $audit2 -Append -Encoding ASCII [system.Windows.Forms.MessageBox]::Show("Device has successfully been restored", "Device Backup TS") exit 0 It's not been used in anger yet, but the etesting i've run on approx half a dozen devices has worked with no problem. Even mixing disk sizes, so restoring onto a bigger disk than it was captured on worked, but it did not automatically resize to fill bigger disks.
-
Not used myself, but academics that use it seem quite happy with Openshot for video editing.
-
Screen-Lock times for teaching staff
MartinByard replied to paulkerton's topic in Data Protection & Information Handling
10 minutes for general staff machines for us, 60 minutes for front of class/lecture theatre machines so that if they're projecting something it doesn't time out. -
The only quick thought I have is you are relying completely on local source files, and not allowing it to fallback to the internet if needed (if I'm reading that xml right). Given that Monthly enterprise is typically supported using the last two months of updates, is it possible your source is out of date (if that is even a thing, honestly not sure if it is or not)?
-
The API version you download when launching Android Studio before zipping it up is whats present in the SDK when students would launch it, we predownload several but if you know you only need the one then just get that (at least to start with) . By modifying the permissions that allows extra versions to be downloaded if needed without having to use an admin logon. Plus, given the SDK is stored in a central location it applies to all users of that computer. If you're not using a virtual device, then there would be no reason for installing the HAXM / AEHD. I tried to not use HAXM this year, but for a specific model of PC it still needed it for some reason (this is a bit more of a genreic install script). I've never used a mandatory network profile, but I would presume that instead of unzipping the user folders into each userprofile (and default) then it would need adding to that.
-
This is how I've managed to get a working install within SCCM that our academics seem happy with. Goto https://developer.android.com/studio/run/emulator-acceleration#vm-windows and get the relevant emulator as necessary (HAXM / AEHD) Install Android Studio manually Launch it and configure the SDK to be stored in C:\AndroidSDK (as well as any other locations you might need) Download any bits of the SDK that are needed Create any Virtual devices as needed Create an archive (Winzip, 7Zip, WinRAR - whatever you want. I tend to use 7Zip) of C:\AndroidSDK Create a 2nd archive containg the .android folder from within your profile, as well as the Google/AndroidStudio folders from within AppData/Local and AppData/Roaming Now using this Powershell script, you can install it Start-Transcript -Path C:\Windows\Logs\Android_Studio_2023_Install.txt -Force ####### Function PermissionsFixes ############ Function PermissionsFixes { # Fix Windows Temp param($FolderPath,$User,$perms) $ACL = Get-Acl $FolderPath #Create new access rule to allow users modify rights $Ar1 = New-Object System.Security.AccessControl.FileSystemAccessRule($User,$perms,"ContainerInherit, ObjectInherit","None","Allow") # Add new rule to existing permissions list $ACL.AddAccessRule($Ar1) Set-Acl $FolderPath $ACL } ####### End Function PermissionsFixes ############## # Install Android Studio Start-Process .\android-studio-2023.1.1.27-windows.exe -ArgumentList "/S" -Wait # Add firewall rules New-NetFirewallRule -DisplayName "OpenJDK Platform binary" -Direction Inbound -Program "C:\Program Files\Android\Android Studio\jre\bin\java.exe" -Profile Domain -Action Allow -Enabled True -Protocol TCP New-NetFirewallRule -DisplayName "OpenJDK Platform binary" -Direction Inbound -Program "C:\Program Files\Android\Android Studio\jre\bin\java.exe" -Profile Domain -Action Allow -Enabled True -Protocol UDP New-NetFirewallRule -DisplayName "Android Studio ADB" -Direction Inbound -Program "C:\AndroidStudioSDK\platform-tools\adb.exe" -Profile Domain -Action Allow -Enabled True -Protocol TCP New-NetFirewallRule -DisplayName "Android Studio ADB" -Direction Inbound -Program "C:\AndroidStudioSDK\platform-tools\adb.exe" -Profile Domain -Action Allow -Enabled True -Protocol UDP New-NetFirewallRule -DisplayName "Android emulator" -Direction Inbound -Program "C:\androidstudiosdk\emulator\netsimd.exe" -Profile Domain -Action Allow -Enabled True -Protocol TCP New-NetFirewallRule -DisplayName "Android emulator" -Direction Inbound -Program "C:\androidstudiosdk\emulator\netsimd.exe" -Profile Domain -Action Allow -Enabled True -Protocol UDP $CPUMan = (Get-WmiObject -class Win32_Processor).Manufacturer if($CPUMan -eq "GenuineIntel"){ Write-Host "Installing Intel Emulator" #Start-Process .\HAXM\Silent_Install.bat -Wait Start-Process .\HAXM\7.6.5\Silent_Install.bat -Wait } if($CPUMan -eq "AuthenticAMD"){ Write-Host "Installing AMD Emulator" Start-Process .\GVM\Silent_Install.bat -Wait } Write-Host "Install Android Emulator hypervisor driver" Start-Process .\GVM\Silent_Install.bat -Wait Write-Host "Unizipping DU folders" Start-Process 'C:\Program Files\7-Zip\7z.exe' -ArgumentList "x DUFolders.7z -oC:\Temp\" -Wait # Copy relevant items into Default users profile Write-Host "Copying DU folders to DU" Copy-Item -Path C:\Temp\DUF\* -Destination C:\Users\Default -Recurse -Force # Copy DU folders into any existing user profiles $users = Get-ChildItem C:\Users | where{$_.name -notmatch 'Public|default'} foreach ($user in $users){ Write-Host "Copying DU folders to $User" Copy-Item -Path C:\Temp\DUF\* -Destination C:\Users\$User -Recurse -Force } Remove-Item -Path C:\Temp\DUF -Recurse -Force Write-Host "Unzipping AndroidStudioSDK folders" Start-Process 'C:\Program Files\7-Zip\7z.exe' -ArgumentList "x AndroidStudioSDK.7z" -Wait # Copy relevant items into System drive folder Write-Host "Copying AndroidStudioSDK to C:" Copy-Item -Path .\AndroidStudioSDK -Destination C:\AndroidStudioSDK -Recurse -Force PermissionsFixes C:\AndroidStudioSDK Users Modify Set-ItemProperty -Path "HKLM:\SOFTWARE\Android Studio" -Name "SdkPath" -Value "C:\AndroidStudioSDK" -Force Set-ItemProperty -Path "HKLM:\SOFTWARE\Android Studio" -Name "UserSettingsPath" -Value "" -Force Stop-Transcript The good news is that if you have missed downloading any bits of the SDK, or new features/tools are released then the students can download them as needed.
-
-
Just a note, check for network printers as well as they give us issues in Office apps when off site.
-
I'd say get the best spec you can, and definitely leave space for an extra stick of RAM in the future if you can. We're just speccing out our summer refresh and as standard we're going for : HP EliteOne 840 G9 (non touch) with mid range i5 with vPRO 16Gb RAM 512Gb SSD
