mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2024-11-24 11:55:31 +00:00
Merge branch 'main' of https://github.com/ChrisTitusTech/winutil
This commit is contained in:
commit
47a4f1547e
@ -321,5 +321,5 @@
|
|||||||
"Order": "a084_",
|
"Order": "a084_",
|
||||||
"Type": "Button",
|
"Type": "Button",
|
||||||
"ButtonWidth": "300"
|
"ButtonWidth": "300"
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
@ -2584,6 +2584,36 @@
|
|||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot"
|
||||||
},
|
},
|
||||||
|
"WPFTweaksRecallOff": {
|
||||||
|
"Content": "Disable Recall",
|
||||||
|
"Description": "Turn Recall off",
|
||||||
|
"category": "Essential Tweaks",
|
||||||
|
"panel": "1",
|
||||||
|
"Order": "a011_",
|
||||||
|
"registry": [
|
||||||
|
{
|
||||||
|
|
||||||
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI",
|
||||||
|
"Name": "DisableAIDataAnalysis",
|
||||||
|
"Type": "DWord",
|
||||||
|
"Value": "1",
|
||||||
|
"OriginalValue": "0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"InvokeScript": [
|
||||||
|
"
|
||||||
|
Write-Host \"Disable Recall\"
|
||||||
|
DISM /Online /Disable-Feature /FeatureName:Recall
|
||||||
|
"
|
||||||
|
],
|
||||||
|
"UndoScript": [
|
||||||
|
"
|
||||||
|
Write-Host \"Enable Recall\"
|
||||||
|
DISM /Online /Enable-Feature /FeatureName:Recall
|
||||||
|
"
|
||||||
|
],
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/DisableRecall"
|
||||||
|
},
|
||||||
"WPFTweaksDisableLMS1": {
|
"WPFTweaksDisableLMS1": {
|
||||||
"Content": "Disable Intel MM (vPro LMS)",
|
"Content": "Disable Intel MM (vPro LMS)",
|
||||||
"Description": "Intel LMS service is always listening on all ports and could be a huge security risk. There is no need to run LMS on home machines and even in the Enterprise there are better solutions.",
|
"Description": "Intel LMS service is always listening on all ports and could be a huge security risk. There is no need to run LMS on home machines and even in the Enterprise there are better solutions.",
|
||||||
|
91
docs/dev/tweaks/Essential-Tweaks/DisableRecall.md
Normal file
91
docs/dev/tweaks/Essential-Tweaks/DisableRecall.md
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Disable Microsoft Recall
|
||||||
|
|
||||||
|
Last Updated: 2024-10-24
|
||||||
|
|
||||||
|
|
||||||
|
!!! info
|
||||||
|
The Development Documentation is auto generated for every compilation of WinUtil, meaning a part of it will always stay up-to-date. **Developers do have the ability to add custom content, which won't be updated automatically.**
|
||||||
|
## Description
|
||||||
|
|
||||||
|
Disables MS Recall built into Windows since 24H2.
|
||||||
|
|
||||||
|
<!-- BEGIN CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<!-- END CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Preview Code</summary>
|
||||||
|
|
||||||
|
```json
|
||||||
|
"WPFTweaksRecallOff": {
|
||||||
|
"Content": "Disable Recall",
|
||||||
|
"Description": "Turn Recall off",
|
||||||
|
"category": "Essential Tweaks",
|
||||||
|
"panel": "1",
|
||||||
|
"Order": "a011_",
|
||||||
|
"registry": [
|
||||||
|
{
|
||||||
|
|
||||||
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI",
|
||||||
|
"Name": "DisableAIDataAnalysis",
|
||||||
|
"Type": "DWord",
|
||||||
|
"Value": "1",
|
||||||
|
"OriginalValue": "0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"InvokeScript": [
|
||||||
|
"
|
||||||
|
Write-Host \"Disable Recall\"
|
||||||
|
DISM /Online /Disable-Feature /FeatureName:Recall
|
||||||
|
"
|
||||||
|
],
|
||||||
|
"UndoScript": [
|
||||||
|
"
|
||||||
|
Write-Host \"Enable Recall\"
|
||||||
|
DISM /Online /Enable-Feature /FeatureName:Recall
|
||||||
|
"
|
||||||
|
],
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/DisableRecall"
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Invoke Script
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
|
||||||
|
Write-Host "Disable Recall"
|
||||||
|
DISM /Online /Disable-Feature /FeatureName:Recall
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
## Undo Script
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
|
||||||
|
Write-Host "Enable Recall"
|
||||||
|
DISM /Online /Enable-Feature /FeatureName:Recall
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
## Registry Changes
|
||||||
|
Applications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.
|
||||||
|
|
||||||
|
|
||||||
|
You can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).
|
||||||
|
|
||||||
|
### Registry Key: DisableAIDataAnalysis
|
||||||
|
|
||||||
|
**Type:** DWord
|
||||||
|
|
||||||
|
**Original Value:** 0
|
||||||
|
|
||||||
|
**New Value:** 1
|
||||||
|
|
||||||
|
<!-- BEGIN SECOND CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<!-- END SECOND CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
|
||||||
|
[View the JSON file](https://github.com/ChrisTitusTech/winutil/tree/main/config/tweaks.json)
|
@ -19,10 +19,10 @@ function Copy-Files {
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
$files = Get-ChildItem -Path $path -Recurse:$recurse
|
$files = Get-ChildItem -Path $path -Recurse:$recurse
|
||||||
Write-Host "Copy $($files.Count)(s) from $path to $destination"
|
Write-Host "Copy $($files.Count) file(s) from $path to $destination"
|
||||||
|
|
||||||
foreach ($file in $files) {
|
foreach ($file in $files) {
|
||||||
$status = "Copy files {0} on {1}: {2}" -f $counter, $files.Count, $file.Name
|
$status = "Copying file {0} of {1}: {2}" -f $counter, $files.Count, $file.Name
|
||||||
Write-Progress -Activity "Copy Windows files" -Status $status -PercentComplete ($counter++/$files.count*100)
|
Write-Progress -Activity "Copy Windows files" -Status $status -PercentComplete ($counter++/$files.count*100)
|
||||||
$restpath = $file.FullName -Replace $path, ''
|
$restpath = $file.FullName -Replace $path, ''
|
||||||
|
|
||||||
@ -37,7 +37,11 @@ function Copy-Files {
|
|||||||
}
|
}
|
||||||
Write-Progress -Activity "Copy Windows files" -Status "Ready" -Completed
|
Write-Progress -Activity "Copy Windows files" -Status "Ready" -Completed
|
||||||
} catch {
|
} catch {
|
||||||
Write-Warning "Unable to Copy all the files due to unhandled exception"
|
Write-Host "Unable to Copy all the files due to an unhandled exception" -ForegroundColor Yellow
|
||||||
Write-Warning $psitem.Exception.StackTrace
|
Write-Host "Error information: $($_.Exception.Message)`n" -ForegroundColor Yellow
|
||||||
|
Write-Host "Additional information:" -ForegroundColor Yellow
|
||||||
|
Write-Host $PSItem.Exception.StackTrace
|
||||||
|
# Write possible suggestions
|
||||||
|
Write-Host "`nIf you are using an antivirus, try configuring exclusions"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,17 @@ function Test-CompatibleImage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ErroredPackage {
|
||||||
|
[string]$PackageName
|
||||||
|
[string]$ErrorMessage
|
||||||
|
ErroredPackage() { $this.Init(@{} )}
|
||||||
|
# Constructor for packages that have errored out
|
||||||
|
ErroredPackage([string]$pkgName, [string]$reason) {
|
||||||
|
$this.PackageName = $pkgName
|
||||||
|
$this.ErrorMessage = $reason
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Get-FidoLangFromCulture {
|
function Get-FidoLangFromCulture {
|
||||||
|
|
||||||
param (
|
param (
|
||||||
@ -98,6 +109,7 @@ function Remove-Features() {
|
|||||||
$_.FeatureName -NotLike "*Media*" -AND
|
$_.FeatureName -NotLike "*Media*" -AND
|
||||||
$_.FeatureName -NotLike "*NFS*" -AND
|
$_.FeatureName -NotLike "*NFS*" -AND
|
||||||
$_.FeatureName -NotLike "*SearchEngine*" -AND
|
$_.FeatureName -NotLike "*SearchEngine*" -AND
|
||||||
|
$_.FeatureName -NotLike "*RemoteDesktop*" -AND
|
||||||
$_.State -ne "Disabled"
|
$_.State -ne "Disabled"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,27 +169,54 @@ function Remove-Packages {
|
|||||||
$_ -NotLike "*WMIC*" -AND
|
$_ -NotLike "*WMIC*" -AND
|
||||||
$_ -NotLike "*UI.XaML*" -AND
|
$_ -NotLike "*UI.XaML*" -AND
|
||||||
$_ -NotLike "*Ethernet*" -AND
|
$_ -NotLike "*Ethernet*" -AND
|
||||||
$_ -NotLike "*Wifi*"
|
$_ -NotLike "*Wifi*" -AND
|
||||||
|
$_ -NotLike "*FodMetadata*" -AND
|
||||||
|
$_ -NotLike "*Foundation*" -AND
|
||||||
|
$_ -NotLike "*LanguageFeatures*" -AND
|
||||||
|
$_ -NotLike "*VBSCRIPT*" -AND
|
||||||
|
$_ -NotLike "*License*"
|
||||||
}
|
}
|
||||||
|
|
||||||
$failedCount = 0
|
$failedCount = 0
|
||||||
|
|
||||||
|
$erroredPackages = [System.Collections.Generic.List[ErroredPackage]]::new()
|
||||||
|
|
||||||
foreach ($pkg in $pkglist) {
|
foreach ($pkg in $pkglist) {
|
||||||
try {
|
try {
|
||||||
$status = "Removing $pkg"
|
$status = "Removing $pkg"
|
||||||
Write-Progress -Activity "Removing Apps" -Status $status -PercentComplete ($counter++/$pkglist.Count*100)
|
Write-Progress -Activity "Removing Packages" -Status $status -PercentComplete ($counter++/$pkglist.Count*100)
|
||||||
Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue
|
Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue
|
||||||
} catch {
|
} catch {
|
||||||
# This can happen if the package that is being removed is a permanent one, like FodMetadata
|
# This can happen if the package that is being removed is a permanent one
|
||||||
Write-Host "Could not remove OS package $($pkg)"
|
$erroredPackages.Add([ErroredPackage]::new($pkg, $_.Exception.Message))
|
||||||
$failedCount += 1
|
$failedCount += 1
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed
|
Write-Progress -Activity "Removing Packages" -Status "Ready" -Completed
|
||||||
if ($failedCount -gt 0)
|
if ($failedCount -gt 0)
|
||||||
{
|
{
|
||||||
Write-Host "Some packages could not be removed. Do not worry: your image will still work fine. This can happen if the package is permanent or has been superseded by a newer one."
|
Write-Host "$failedCount package(s) could not be removed. Your image will still work fine, however. Below is information on what packages failed to be removed and why."
|
||||||
|
if ($erroredPackages.Count -gt 0)
|
||||||
|
{
|
||||||
|
$erroredPackages = $erroredPackages | Sort-Object -Property ErrorMessage
|
||||||
|
|
||||||
|
$previousErroredPackage = $erroredPackages[0]
|
||||||
|
$counter = 0
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "- $($previousErroredPackage.ErrorMessage)"
|
||||||
|
foreach ($erroredPackage in $erroredPackages) {
|
||||||
|
if ($erroredPackage.ErrorMessage -ne $previousErroredPackage.ErrorMessage) {
|
||||||
|
Write-Host ""
|
||||||
|
$counter = 0
|
||||||
|
Write-Host "- $($erroredPackage.ErrorMessage)"
|
||||||
|
}
|
||||||
|
$counter += 1
|
||||||
|
Write-Host " $counter) $($erroredPackage.PackageName)"
|
||||||
|
$previousErroredPackage = $erroredPackage
|
||||||
|
}
|
||||||
|
Write-Host ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
|
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
|
||||||
@ -201,13 +240,8 @@ function Remove-ProvisionedPackages() {
|
|||||||
$appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
|
$appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
|
||||||
$_.PackageName -NotLike "*AppInstaller*" -AND
|
$_.PackageName -NotLike "*AppInstaller*" -AND
|
||||||
$_.PackageName -NotLike "*Store*" -and
|
$_.PackageName -NotLike "*Store*" -and
|
||||||
$_.PackageName -NotLike "*dism*" -and
|
|
||||||
$_.PackageName -NotLike "*Foundation*" -and
|
|
||||||
$_.PackageName -NotLike "*FodMetadata*" -and
|
|
||||||
$_.PackageName -NotLike "*LanguageFeatures*" -and
|
|
||||||
$_.PackageName -NotLike "*Notepad*" -and
|
$_.PackageName -NotLike "*Notepad*" -and
|
||||||
$_.PackageName -NotLike "*Printing*" -and
|
$_.PackageName -NotLike "*Printing*" -and
|
||||||
$_.PackageName -NotLike "*Foundation*" -and
|
|
||||||
$_.PackageName -NotLike "*YourPhone*" -and
|
$_.PackageName -NotLike "*YourPhone*" -and
|
||||||
$_.PackageName -NotLike "*Xbox*" -and
|
$_.PackageName -NotLike "*Xbox*" -and
|
||||||
$_.PackageName -NotLike "*WindowsTerminal*" -and
|
$_.PackageName -NotLike "*WindowsTerminal*" -and
|
||||||
@ -242,6 +276,31 @@ function Remove-ProvisionedPackages() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Get-LocalizedUsers
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Gets a localized user group representation for ICACLS commands (Port from DISMTools PE Helper)
|
||||||
|
.PARAMETER admins
|
||||||
|
Determines whether to get a localized user group representation for the Administrators user group
|
||||||
|
.OUTPUTS
|
||||||
|
A string containing the localized user group
|
||||||
|
.EXAMPLE
|
||||||
|
Get-LocalizedUsers -admins $true
|
||||||
|
#>
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true, Position = 0)] [bool]$admins
|
||||||
|
)
|
||||||
|
if ($admins)
|
||||||
|
{
|
||||||
|
return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-544" }).Name
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-545" }).Name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function Copy-ToUSB([string]$fileToCopy) {
|
function Copy-ToUSB([string]$fileToCopy) {
|
||||||
foreach ($volume in Get-Volume) {
|
foreach ($volume in Get-Volume) {
|
||||||
if ($volume -and $volume.FileSystemLabel -ieq "ventoy") {
|
if ($volume -and $volume.FileSystemLabel -ieq "ventoy") {
|
||||||
@ -625,70 +684,70 @@ function New-CheckInstall {
|
|||||||
# using here string to embedd firstrun
|
# using here string to embedd firstrun
|
||||||
$checkInstall = @'
|
$checkInstall = @'
|
||||||
@echo off
|
@echo off
|
||||||
if exist "C:\windows\cpu.txt" (
|
if exist "%HOMEDRIVE%\windows\cpu.txt" (
|
||||||
echo C:\windows\cpu.txt exists
|
echo %HOMEDRIVE%\windows\cpu.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\windows\cpu.txt does not exist
|
echo %HOMEDRIVE%\windows\cpu.txt does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\windows\SerialNumber.txt" (
|
if exist "%HOMEDRIVE%\windows\SerialNumber.txt" (
|
||||||
echo C:\windows\SerialNumber.txt exists
|
echo %HOMEDRIVE%\windows\SerialNumber.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\windows\SerialNumber.txt does not exist
|
echo %HOMEDRIVE%\windows\SerialNumber.txt does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\unattend.xml" (
|
if exist "%HOMEDRIVE%\unattend.xml" (
|
||||||
echo C:\unattend.xml exists
|
echo %HOMEDRIVE%\unattend.xml exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\unattend.xml does not exist
|
echo %HOMEDRIVE%\unattend.xml does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\Setup\Scripts\SetupComplete.cmd" (
|
if exist "%HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd" (
|
||||||
echo C:\Windows\Setup\Scripts\SetupComplete.cmd exists
|
echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\Setup\Scripts\SetupComplete.cmd does not exist
|
echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\Panther\unattend.xml" (
|
if exist "%HOMEDRIVE%\Windows\Panther\unattend.xml" (
|
||||||
echo C:\Windows\Panther\unattend.xml exists
|
echo %HOMEDRIVE%\Windows\Panther\unattend.xml exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\Panther\unattend.xml does not exist
|
echo %HOMEDRIVE%\Windows\Panther\unattend.xml does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\System32\Sysprep\unattend.xml" (
|
if exist "%HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml" (
|
||||||
echo C:\Windows\System32\Sysprep\unattend.xml exists
|
echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\System32\Sysprep\unattend.xml does not exist
|
echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\FirstStartup.ps1" (
|
if exist "%HOMEDRIVE%\Windows\FirstStartup.ps1" (
|
||||||
echo C:\Windows\FirstStartup.ps1 exists
|
echo %HOMEDRIVE%\Windows\FirstStartup.ps1 exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\FirstStartup.ps1 does not exist
|
echo %HOMEDRIVE%\Windows\FirstStartup.ps1 does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\winutil.ps1" (
|
if exist "%HOMEDRIVE%\Windows\winutil.ps1" (
|
||||||
echo C:\Windows\winutil.ps1 exists
|
echo %HOMEDRIVE%\Windows\winutil.ps1 exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\winutil.ps1 does not exist
|
echo %HOMEDRIVE%\Windows\winutil.ps1 does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\LogSpecialize.txt" (
|
if exist "%HOMEDRIVE%\Windows\LogSpecialize.txt" (
|
||||||
echo C:\Windows\LogSpecialize.txt exists
|
echo %HOMEDRIVE%\Windows\LogSpecialize.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\LogSpecialize.txt does not exist
|
echo %HOMEDRIVE%\Windows\LogSpecialize.txt does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\LogAuditUser.txt" (
|
if exist "%HOMEDRIVE%\Windows\LogAuditUser.txt" (
|
||||||
echo C:\Windows\LogAuditUser.txt exists
|
echo %HOMEDRIVE%\Windows\LogAuditUser.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\LogAuditUser.txt does not exist
|
echo %HOMEDRIVE%\Windows\LogAuditUser.txt does not exist
|
||||||
)
|
)
|
||||||
if exist "C:\Windows\LogOobeSystem.txt" (
|
if exist "%HOMEDRIVE%\Windows\LogOobeSystem.txt" (
|
||||||
echo C:\Windows\LogOobeSystem.txt exists
|
echo %HOMEDRIVE%\Windows\LogOobeSystem.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo C:\Windows\LogOobeSystem.txt does not exist
|
echo %HOMEDRIVE%\Windows\LogOobeSystem.txt does not exist
|
||||||
)
|
)
|
||||||
if exist "c:\windows\csup.txt" (
|
if exist "%HOMEDRIVE%\windows\csup.txt" (
|
||||||
echo c:\windows\csup.txt exists
|
echo %HOMEDRIVE%\windows\csup.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo c:\windows\csup.txt does not exist
|
echo %HOMEDRIVE%\windows\csup.txt does not exist
|
||||||
)
|
)
|
||||||
if exist "c:\windows\LogFirstRun.txt" (
|
if exist "%HOMEDRIVE%\windows\LogFirstRun.txt" (
|
||||||
echo c:\windows\LogFirstRun.txt exists
|
echo %HOMEDRIVE%\windows\LogFirstRun.txt exists
|
||||||
) else (
|
) else (
|
||||||
echo c:\windows\LogFirstRun.txt does not exist
|
echo %HOMEDRIVE%\windows\LogFirstRun.txt does not exist
|
||||||
)
|
)
|
||||||
'@
|
'@
|
||||||
$checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii
|
$checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii
|
||||||
@ -726,7 +785,7 @@ function New-FirstRun {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
"FirstStartup has worked" | Out-File -FilePath c:\windows\LogFirstRun.txt -Append -NoClobber
|
"FirstStartup has worked" | Out-File -FilePath "$env:HOMEDRIVE\windows\LogFirstRun.txt" -Append -NoClobber
|
||||||
|
|
||||||
$taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
|
$taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
|
||||||
# Delete all files on the Taskbar
|
# Delete all files on the Taskbar
|
||||||
@ -746,7 +805,7 @@ function New-FirstRun {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk"
|
Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk"
|
||||||
Remove-Item -Path "C:\Users\Default\Desktop\*.lnk"
|
Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk"
|
||||||
|
|
||||||
# ************************************************
|
# ************************************************
|
||||||
# Create WinUtil shortcut on the desktop
|
# Create WinUtil shortcut on the desktop
|
||||||
@ -762,8 +821,8 @@ function New-FirstRun {
|
|||||||
# Create a shortcut object
|
# Create a shortcut object
|
||||||
$shortcut = $shell.CreateShortcut($shortcutPath)
|
$shortcut = $shell.CreateShortcut($shortcutPath)
|
||||||
|
|
||||||
if (Test-Path -Path "c:\Windows\cttlogo.png") {
|
if (Test-Path -Path "$env:HOMEDRIVE\Windows\cttlogo.png") {
|
||||||
$shortcut.IconLocation = "c:\Windows\cttlogo.png"
|
$shortcut.IconLocation = "$env:HOMEDRIVE\Windows\cttlogo.png"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set properties of the shortcut
|
# Set properties of the shortcut
|
||||||
@ -783,8 +842,17 @@ function New-FirstRun {
|
|||||||
# Done create WinUtil shortcut on the desktop
|
# Done create WinUtil shortcut on the desktop
|
||||||
# ************************************************
|
# ************************************************
|
||||||
|
|
||||||
Start-Process explorer
|
try
|
||||||
|
{
|
||||||
|
if ((Get-WindowsOptionalFeature -Online | Where-Object { $_.FeatureName -like "Recall" }).Count -gt 0)
|
||||||
|
{
|
||||||
|
Disable-WindowsOptionalFeature -Online -FeatureName "Recall" -Remove
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
'@
|
'@
|
||||||
$firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
|
$firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ function Set-WinUtilRegistry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Set $Path\$Name to $Value"
|
Write-Host "Set $Path\$Name to $Value"
|
||||||
if ($Value -ne "<RemoveEntry>"){
|
if ($Value -ne "<RemoveEntry>") {
|
||||||
Set-ItemProperty -Path $Path -Name $Name -Type $Type -Value $Value -Force -ErrorAction Stop | Out-Null
|
Set-ItemProperty -Path $Path -Name $Name -Type $Type -Value $Value -Force -ErrorAction Stop | Out-Null
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
@ -51,10 +51,6 @@ public class PowerManagement {
|
|||||||
$index = $sync.MicrowinWindowsFlavors.SelectedValue.Split(":")[0].Trim()
|
$index = $sync.MicrowinWindowsFlavors.SelectedValue.Split(":")[0].Trim()
|
||||||
Write-Host "Index chosen: '$index' from $($sync.MicrowinWindowsFlavors.SelectedValue)"
|
Write-Host "Index chosen: '$index' from $($sync.MicrowinWindowsFlavors.SelectedValue)"
|
||||||
|
|
||||||
$keepPackages = $sync.WPFMicrowinKeepProvisionedPackages.IsChecked
|
|
||||||
$keepProvisionedPackages = $sync.WPFMicrowinKeepAppxPackages.IsChecked
|
|
||||||
$keepDefender = $sync.WPFMicrowinKeepDefender.IsChecked
|
|
||||||
$keepEdge = $sync.WPFMicrowinKeepEdge.IsChecked
|
|
||||||
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
|
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
|
||||||
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
|
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
|
||||||
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
|
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
|
||||||
@ -91,6 +87,14 @@ public class PowerManagement {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Detect whether the image to process contains Windows 10 and show warning
|
||||||
|
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) {
|
||||||
|
$msg = "Windows 10 has been detected in the image you want to process. While you can continue, Windows 10 is not a recommended target for MicroWin, and you may not get the full experience."
|
||||||
|
$dlg_msg = $msg
|
||||||
|
Write-Host $msg
|
||||||
|
[System.Windows.MessageBox]::Show($dlg_msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Exclamation)
|
||||||
|
}
|
||||||
|
|
||||||
$mountDirExists = Test-Path $mountDir
|
$mountDirExists = Test-Path $mountDir
|
||||||
$scratchDirExists = Test-Path $scratchDir
|
$scratchDirExists = Test-Path $scratchDir
|
||||||
if (-not $mountDirExists -or -not $scratchDirExists) {
|
if (-not $mountDirExists -or -not $scratchDirExists) {
|
||||||
@ -158,6 +162,35 @@ public class PowerManagement {
|
|||||||
Write-Host "Removing Appx Bloat"
|
Write-Host "Removing Appx Bloat"
|
||||||
Remove-ProvisionedPackages
|
Remove-ProvisionedPackages
|
||||||
|
|
||||||
|
# Detect Windows 11 24H2 and add dependency to FileExp to prevent Explorer look from going back - thanks @WitherOrNot and @thecatontheceiling
|
||||||
|
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,26100,1))) -eq $true)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (Test-Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -PathType Leaf)
|
||||||
|
{
|
||||||
|
# Found the culprit. Do the following:
|
||||||
|
|
||||||
|
# 1. Take ownership of the file, from TrustedInstaller to Administrators
|
||||||
|
takeown /F "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /A
|
||||||
|
|
||||||
|
# 2. Set ACLs so that we can write to it
|
||||||
|
icacls "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /grant "$(Get-LocalizedUsers -admins $true):(M)" | Out-Host
|
||||||
|
|
||||||
|
# 3. Open the file and do the modification
|
||||||
|
$appxManifest = Get-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml"
|
||||||
|
$originalLine = $appxManifest[13]
|
||||||
|
$dependency = "`n <PackageDependency Name=`"Microsoft.WindowsAppRuntime.CBS`" MinVersion=`"1.0.0.0`" Publisher=`"CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US`" />"
|
||||||
|
$appxManifest[13] = "$originalLine$dependency"
|
||||||
|
Set-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -Value $appxManifest -Force -Encoding utf8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
|
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
|
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
|
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
|
||||||
@ -238,6 +271,9 @@ public class PowerManagement {
|
|||||||
# Write-Host Error code $LASTEXITCODE
|
# Write-Host Error code $LASTEXITCODE
|
||||||
Write-Host "Done disabling Teams"
|
Write-Host "Done disabling Teams"
|
||||||
|
|
||||||
|
Write-Host "Fix Windows Volume Mixer Issue"
|
||||||
|
reg add "HKLM\zNTUSER\Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore" /f
|
||||||
|
|
||||||
Write-Host "Bypassing system requirements (system image)"
|
Write-Host "Bypassing system requirements (system image)"
|
||||||
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
|
||||||
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
|
||||||
@ -289,6 +325,19 @@ public class PowerManagement {
|
|||||||
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "AppsUseLightTheme" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "AppsUseLightTheme" /t REG_DWORD /d 0 /f
|
||||||
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "SystemUsesLightTheme" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "SystemUsesLightTheme" /t REG_DWORD /d 0 /f
|
||||||
|
|
||||||
|
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) {
|
||||||
|
# We're dealing with Windows 10. Configure sane desktop settings. NOTE: even though stuff to disable News and Interests is there,
|
||||||
|
# it doesn't seem to work, and I don't want to waste more time dealing with an operating system that will lose support in a year (2025)
|
||||||
|
|
||||||
|
# I invite anyone to work on improving stuff for News and Interests, but that won't be me!
|
||||||
|
|
||||||
|
Write-Host "Disabling Search Highlights..."
|
||||||
|
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Feeds\DSB" /v "ShowDynamicContent" /t REG_DWORD /d 0 /f
|
||||||
|
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\SearchSettings" /v "IsDynamicSearchBoxEnabled" /t REG_DWORD /d 0 /f
|
||||||
|
reg add "HKLM\zSOFTWARE\Policies\Microsoft\Dsh" /v "AllowNewsAndInterests" /t REG_DWORD /d 0 /f
|
||||||
|
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "TraySearchBoxVisible" /t REG_DWORD /d 1 /f
|
||||||
|
}
|
||||||
|
|
||||||
} catch {
|
} catch {
|
||||||
Write-Error "An unexpected error occurred: $_"
|
Write-Error "An unexpected error occurred: $_"
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -410,10 +410,8 @@ $sync["ISOmanual"].add_Checked({
|
|||||||
$sync["ISOLanguage"].Visibility = [System.Windows.Visibility]::Collapsed
|
$sync["ISOLanguage"].Visibility = [System.Windows.Visibility]::Collapsed
|
||||||
})
|
})
|
||||||
|
|
||||||
$sync["ISORelease"].Items.Add("23H2") | Out-Null
|
$sync["ISORelease"].Items.Add("24H2") | Out-Null
|
||||||
$sync["ISORelease"].Items.Add("22H2") | Out-Null
|
$sync["ISORelease"].SelectedItem = "24H2"
|
||||||
$sync["ISORelease"].Items.Add("21H2") | Out-Null
|
|
||||||
$sync["ISORelease"].SelectedItem = "23H2"
|
|
||||||
|
|
||||||
$sync["ISOLanguage"].Items.Add("System Language ($(Get-FidoLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
|
$sync["ISOLanguage"].Items.Add("System Language ($(Get-FidoLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
|
||||||
if ($currentCulture -ne "English International") {
|
if ($currentCulture -ne "English International") {
|
||||||
|
@ -1040,7 +1040,7 @@
|
|||||||
HorizontalAlignment="Stretch">
|
HorizontalAlignment="Stretch">
|
||||||
<StackPanel Name="MicrowinMain" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Column="0" Grid.Row="0">
|
<StackPanel Name="MicrowinMain" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Column="0" Grid.Row="0">
|
||||||
<StackPanel Background="Transparent" SnapsToDevicePixels="True" Margin="1">
|
<StackPanel Background="Transparent" SnapsToDevicePixels="True" Margin="1">
|
||||||
<CheckBox x:Name="WPFMicrowinDownloadFromGitHub" Content="Download oscdimg.exe from CTT Github repo" IsChecked="False" Margin="{DynamicResource MicrowinCheckBoxMargin}" />
|
<CheckBox x:Name="WPFMicrowinDownloadFromGitHub" Content="Download oscdimg.exe from CTT Github repo" IsChecked="True" Margin="{DynamicResource MicrowinCheckBoxMargin}" />
|
||||||
<TextBlock Margin="5" Padding="1" TextWrapping="Wrap" Foreground="{DynamicResource ComboBoxForegroundColor}">
|
<TextBlock Margin="5" Padding="1" TextWrapping="Wrap" Foreground="{DynamicResource ComboBoxForegroundColor}">
|
||||||
Choose a Windows ISO file that you've downloaded <LineBreak/>
|
Choose a Windows ISO file that you've downloaded <LineBreak/>
|
||||||
Check the status in the console
|
Check the status in the console
|
||||||
|
Loading…
Reference in New Issue
Block a user