mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2024-11-24 11:55:31 +00:00
Compare commits
20 Commits
0fa7b6c9ef
...
d147cf2d01
Author | SHA1 | Date | |
---|---|---|---|
|
d147cf2d01 | ||
|
171441ddcf | ||
|
7a0c40420e | ||
|
0f0d9d0ae3 | ||
|
6149738e6c | ||
|
aa0b03feda | ||
|
e0889d51db | ||
|
ce1ef2a519 | ||
|
77cb0a14c4 | ||
|
c254a43f77 | ||
|
640d2ca107 | ||
|
c186642998 | ||
|
47a4f1547e | ||
|
1caf3111d3 | ||
|
7dcdc4dbb7 | ||
|
bfaba14191 | ||
|
5640f9d04c | ||
|
c6a832b006 | ||
|
fe19094395 | ||
|
fdd32f441f |
2
.github/mkdocs.yml
vendored
2
.github/mkdocs.yml
vendored
@ -5,7 +5,7 @@ repo_url: https://github.com/ChrisTitusTech/winutil
|
|||||||
nav:
|
nav:
|
||||||
- Introduction: 'index.md'
|
- Introduction: 'index.md'
|
||||||
- User Guide: 'userguide.md'
|
- User Guide: 'userguide.md'
|
||||||
- Contributing Guide: 'contribute.md'
|
- Contributing Guide: 'CONTRIBUTING.md'
|
||||||
- Documentation:
|
- Documentation:
|
||||||
- Dev Docs: 'devdocs.md'
|
- Dev Docs: 'devdocs.md'
|
||||||
- Known Issues: 'KnownIssues.md'
|
- Known Issues: 'KnownIssues.md'
|
||||||
|
@ -113,7 +113,7 @@
|
|||||||
</RunSynchronousCommand>
|
</RunSynchronousCommand>
|
||||||
<RunSynchronousCommand wcm:action="add">
|
<RunSynchronousCommand wcm:action="add">
|
||||||
<Order>19</Order>
|
<Order>19</Order>
|
||||||
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-packages.ps1' -Raw | Invoke-Expression;"</Path>
|
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"</Path>
|
||||||
</RunSynchronousCommand>
|
</RunSynchronousCommand>
|
||||||
<RunSynchronousCommand wcm:action="add">
|
<RunSynchronousCommand wcm:action="add">
|
||||||
<Order>20</Order>
|
<Order>20</Order>
|
||||||
@ -312,7 +312,7 @@ foreach( $file in $Document.unattend.Extensions.File ) {
|
|||||||
[System.IO.File]::WriteAllBytes( $path, ( $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ) ) );
|
[System.IO.File]::WriteAllBytes( $path, ( $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ) ) );
|
||||||
}
|
}
|
||||||
</ExtractScript>
|
</ExtractScript>
|
||||||
<File path="C:\Windows\Temp\remove-packages.ps1">
|
<File path="C:\Windows\Temp\Microwin-RemovePackages.ps1">
|
||||||
$selectors = @(
|
$selectors = @(
|
||||||
'Microsoft.Microsoft3DViewer';
|
'Microsoft.Microsoft3DViewer';
|
||||||
'Microsoft.BingSearch';
|
'Microsoft.BingSearch';
|
||||||
@ -359,7 +359,7 @@ $removeCommand = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
$type = 'Package';
|
$type = 'Package';
|
||||||
$logfile = 'C:\Windows\Temp\remove-packages.log';
|
$logfile = 'C:\Windows\Temp\Microwin-RemovePackages.log';
|
||||||
& {
|
& {
|
||||||
$installed = & $getCommand;
|
$installed = & $getCommand;
|
||||||
foreach( $selector in $selectors ) {
|
foreach( $selector in $selectors ) {
|
||||||
|
@ -306,13 +306,23 @@
|
|||||||
"ButtonWidth": "300",
|
"ButtonWidth": "300",
|
||||||
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/user"
|
"link": "https://christitustech.github.io/winutil/dev/features/Legacy-Windows-Panels/user"
|
||||||
},
|
},
|
||||||
"WPFWinUtilPSProfile": {
|
"WPFWinUtilInstallPSProfile": {
|
||||||
"Content": "Install CTT PowerShell Profile",
|
"Content": "Install CTT PowerShell Profile",
|
||||||
"category": "Powershell Profile",
|
"category": "Powershell Profile",
|
||||||
"panel": "2",
|
"panel": "2",
|
||||||
"Order": "a083_",
|
"Order": "a083_",
|
||||||
"Type": "Button",
|
"Type": "Button",
|
||||||
"ButtonWidth": "300"
|
"ButtonWidth": "300",
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/features/Powershell-Profile/PSProfileInstall"
|
||||||
|
},
|
||||||
|
"WPFWinUtilUninstallPSProfile": {
|
||||||
|
"Content": "Uninstall CTT PowerShell Profile",
|
||||||
|
"category": "Powershell Profile",
|
||||||
|
"panel": "2",
|
||||||
|
"Order": "a084_",
|
||||||
|
"Type": "Button",
|
||||||
|
"ButtonWidth": "300",
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/features/Powershell-Profile/PSProfileUninstall"
|
||||||
},
|
},
|
||||||
"WPFWinUtilSSHServer": {
|
"WPFWinUtilSSHServer": {
|
||||||
"Content": "Enable OpenSSH Server",
|
"Content": "Enable OpenSSH Server",
|
||||||
@ -322,4 +332,4 @@
|
|||||||
"Type": "Button",
|
"Type": "Button",
|
||||||
"ButtonWidth": "300"
|
"ButtonWidth": "300"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -11,21 +11,21 @@
|
|||||||
"Name": "EnableActivityFeed",
|
"Name": "EnableActivityFeed",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
|
||||||
"Name": "PublishUserActivities",
|
"Name": "PublishUserActivities",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
|
||||||
"Name": "UploadUserActivities",
|
"Name": "UploadUserActivities",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/AH"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/AH"
|
||||||
@ -1598,126 +1598,126 @@
|
|||||||
"Name": "CreateDesktopShortcutDefault",
|
"Name": "CreateDesktopShortcutDefault",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "PersonalizationReportingEnabled",
|
"Name": "PersonalizationReportingEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "ShowRecommendationsEnabled",
|
"Name": "ShowRecommendationsEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "HideFirstRunExperience",
|
"Name": "HideFirstRunExperience",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"OriginalValue": "0"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "UserFeedbackAllowed",
|
"Name": "UserFeedbackAllowed",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "ConfigureDoNotTrack",
|
"Name": "ConfigureDoNotTrack",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"OriginalValue": "0"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "AlternateErrorPagesEnabled",
|
"Name": "AlternateErrorPagesEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "EdgeCollectionsEnabled",
|
"Name": "EdgeCollectionsEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "EdgeShoppingAssistantEnabled",
|
"Name": "EdgeShoppingAssistantEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "MicrosoftEdgeInsiderPromotionEnabled",
|
"Name": "MicrosoftEdgeInsiderPromotionEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "PersonalizationReportingEnabled",
|
"Name": "PersonalizationReportingEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "ShowMicrosoftRewards",
|
"Name": "ShowMicrosoftRewards",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "WebWidgetAllowed",
|
"Name": "WebWidgetAllowed",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "DiagnosticData",
|
"Name": "DiagnosticData",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "EdgeAssetDeliveryServiceEnabled",
|
"Name": "EdgeAssetDeliveryServiceEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "EdgeCollectionsEnabled",
|
"Name": "EdgeCollectionsEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "CryptoWalletEnabled",
|
"Name": "CryptoWalletEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge",
|
||||||
"Name": "WalletDonationEnabled",
|
"Name": "WalletDonationEnabled",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/EdgeDebloat"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/EdgeDebloat"
|
||||||
@ -1731,7 +1731,7 @@
|
|||||||
"registry": [
|
"registry": [
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent",
|
||||||
"OriginalValue": "0",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "DisableWindowsConsumerFeatures",
|
"Name": "DisableWindowsConsumerFeatures",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
@ -1818,11 +1818,11 @@
|
|||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"Name": "AllowTelemetry",
|
"Name": "AllowTelemetry",
|
||||||
"OriginalValue": "1"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection",
|
||||||
"OriginalValue": "1",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "AllowTelemetry",
|
"Name": "AllowTelemetry",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
@ -1906,21 +1906,21 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection",
|
||||||
"OriginalValue": "0",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "DoNotShowFeedbackNotifications",
|
"Name": "DoNotShowFeedbackNotifications",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent",
|
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent",
|
||||||
"OriginalValue": "0",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "DisableTailoredExperiencesWithDiagnosticData",
|
"Name": "DisableTailoredExperiencesWithDiagnosticData",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\AdvertisingInfo",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\AdvertisingInfo",
|
||||||
"OriginalValue": "0",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "DisabledByGroupPolicy",
|
"Name": "DisabledByGroupPolicy",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
@ -2047,7 +2047,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Windows Feeds",
|
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Windows Feeds",
|
||||||
"OriginalValue": "1",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "EnableFeeds",
|
"Name": "EnableFeeds",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
@ -2061,7 +2061,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
|
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
|
||||||
"OriginalValue": "1",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Name": "HideSCAMeetNow",
|
"Name": "HideSCAMeetNow",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
@ -2553,14 +2553,14 @@
|
|||||||
"Name": "TurnOffWindowsCopilot",
|
"Name": "TurnOffWindowsCopilot",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"OriginalValue": "0"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKCU:\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot",
|
"Path": "HKCU:\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot",
|
||||||
"Name": "TurnOffWindowsCopilot",
|
"Name": "TurnOffWindowsCopilot",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"OriginalValue": "0"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
|
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
|
||||||
@ -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": "<RemoveEntry>"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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.",
|
||||||
@ -2794,7 +2824,7 @@
|
|||||||
"Name": "DisableNotificationCenter",
|
"Name": "DisableNotificationCenter",
|
||||||
"Type": "DWord",
|
"Type": "DWord",
|
||||||
"Value": "1",
|
"Value": "1",
|
||||||
"OriginalValue": "0"
|
"OriginalValue": "<RemoveEntry>"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\PushNotifications",
|
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\PushNotifications",
|
||||||
@ -3153,7 +3183,7 @@
|
|||||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR",
|
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR",
|
||||||
"Name": "AllowGameDVR",
|
"Name": "AllowGameDVR",
|
||||||
"Value": "0",
|
"Value": "0",
|
||||||
"OriginalValue": "1",
|
"OriginalValue": "<RemoveEntry>",
|
||||||
"Type": "DWord"
|
"Type": "DWord"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -3434,14 +3464,5 @@
|
|||||||
"Type": "Button",
|
"Type": "Button",
|
||||||
"ButtonWidth": "300",
|
"ButtonWidth": "300",
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Performance-Plans/RemoveUltPerf"
|
"link": "https://christitustech.github.io/winutil/dev/tweaks/Performance-Plans/RemoveUltPerf"
|
||||||
},
|
|
||||||
"WPFWinUtilShortcut": {
|
|
||||||
"Content": "Create WinUtil Shortcut",
|
|
||||||
"category": "Shortcuts",
|
|
||||||
"panel": "2",
|
|
||||||
"Order": "a082_",
|
|
||||||
"Type": "Button",
|
|
||||||
"ButtonWidth": "300",
|
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Shortcuts/Shortcut"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
38
docs/dev/features/PowerShell-Profile/PSProfileInstall.md
Normal file
38
docs/dev/features/PowerShell-Profile/PSProfileInstall.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Install CTT PowerShell Profile
|
||||||
|
|
||||||
|
Last Updated: 2024-10-01
|
||||||
|
|
||||||
|
|
||||||
|
!!! 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.**
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BEGIN CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<!-- END CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Preview Code</summary>
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Content": "Install CTT PowerShell Profile",
|
||||||
|
"category": "Powershell Profile",
|
||||||
|
"panel": "2",
|
||||||
|
"Order": "a083_",
|
||||||
|
"Type": "Button",
|
||||||
|
"ButtonWidth": "300",
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/features/Powershell-Profile/PSProfileInstall"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BEGIN SECOND CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<!-- END SECOND CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
|
||||||
|
[View the JSON file](https://github.com/ChrisTitusTech/winutil/tree/main/config/feature.json)
|
||||||
|
|
38
docs/dev/features/PowerShell-Profile/PSProfileUninstall.md
Normal file
38
docs/dev/features/PowerShell-Profile/PSProfileUninstall.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Uninstall CTT PowerShell Profile
|
||||||
|
|
||||||
|
Last Updated: 2024-10-01
|
||||||
|
|
||||||
|
|
||||||
|
!!! 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.**
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BEGIN CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<!-- END CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Preview Code</summary>
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Content": "Uninstall CTT PowerShell Profile",
|
||||||
|
"category": "Powershell Profile",
|
||||||
|
"panel": "2",
|
||||||
|
"Order": "a084_",
|
||||||
|
"Type": "Button",
|
||||||
|
"ButtonWidth": "300",
|
||||||
|
"link": "https://christitustech.github.io/winutil/dev/features/Powershell-Profile/PSProfileUninstall"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BEGIN SECOND CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
<!-- END SECOND CUSTOM CONTENT -->
|
||||||
|
|
||||||
|
|
||||||
|
[View the JSON file](https://github.com/ChrisTitusTech/winutil/tree/main/config/feature.json)
|
||||||
|
|
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)
|
@ -1,113 +0,0 @@
|
|||||||
# Create WinUtil Shortcut
|
|
||||||
|
|
||||||
Last Updated: 2024-08-07
|
|
||||||
|
|
||||||
|
|
||||||
!!! 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.**
|
|
||||||
|
|
||||||
|
|
||||||
<!-- BEGIN CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<!-- END CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Preview Code</summary>
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Content": "Create WinUtil Shortcut",
|
|
||||||
"category": "Shortcuts",
|
|
||||||
"panel": "2",
|
|
||||||
"Order": "a082_",
|
|
||||||
"Type": "Button",
|
|
||||||
"ButtonWidth": "300",
|
|
||||||
"link": "https://christitustech.github.io/winutil/dev/tweaks/Shortcuts/Shortcut"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## Function: Invoke-WPFShortcut
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
function Invoke-WPFShortcut {
|
|
||||||
<#
|
|
||||||
|
|
||||||
.SYNOPSIS
|
|
||||||
Creates a shortcut and prompts for a save location
|
|
||||||
|
|
||||||
.PARAMETER ShortcutToAdd
|
|
||||||
The name of the shortcut to add
|
|
||||||
|
|
||||||
.PARAMETER RunAsAdmin
|
|
||||||
A boolean value to make 'Run as administrator' property on (true) or off (false), defaults to off
|
|
||||||
|
|
||||||
#>
|
|
||||||
param(
|
|
||||||
$ShortcutToAdd,
|
|
||||||
[bool]$RunAsAdmin = $false
|
|
||||||
)
|
|
||||||
|
|
||||||
# Preper the Shortcut Fields and add an a Custom Icon if it's available, else don't add a Custom Icon.
|
|
||||||
|
|
||||||
Switch ($ShortcutToAdd) {
|
|
||||||
"WinUtil" {
|
|
||||||
# Use Powershell 7 if installed and fallback to PS5 if not
|
|
||||||
if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
|
|
||||||
$shell = "pwsh.exe"
|
|
||||||
} else {
|
|
||||||
$shell = "powershell.exe"
|
|
||||||
}
|
|
||||||
|
|
||||||
$shellArgs = "-ExecutionPolicy Bypass -Command `"Start-Process $shell -verb runas -ArgumentList `'-Command `"irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1 | iex`"`'"
|
|
||||||
|
|
||||||
$DestinationName = "WinUtil.lnk"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show a File Dialog Browser, to let the User choose the Name and Location of where to save the Shortcut
|
|
||||||
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
|
|
||||||
$FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
|
|
||||||
$FileBrowser.Filter = "Shortcut Files (*.lnk)|*.lnk"
|
|
||||||
$FileBrowser.FileName = $DestinationName
|
|
||||||
|
|
||||||
# Do an Early Return if the Save Operation was canceled by User's Input.
|
|
||||||
$FileBrowserResult = $FileBrowser.ShowDialog()
|
|
||||||
$DialogResultEnum = New-Object System.Windows.Forms.DialogResult
|
|
||||||
if (-not ($FileBrowserResult -eq $DialogResultEnum::OK)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
# Prepare the Shortcut paramter
|
|
||||||
$WshShell = New-Object -comObject WScript.Shell
|
|
||||||
$Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName)
|
|
||||||
$Shortcut.TargetPath = $shell
|
|
||||||
$Shortcut.Arguments = $shellArgs
|
|
||||||
if (Test-Path -Path $winutildir["logo.ico"]) {
|
|
||||||
$shortcut.IconLocation = $winutildir["logo.ico"]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Save the Shortcut to disk
|
|
||||||
$Shortcut.Save()
|
|
||||||
|
|
||||||
if ($RunAsAdmin -eq $true) {
|
|
||||||
$bytes = [System.IO.File]::ReadAllBytes($FileBrowser.FileName)
|
|
||||||
# Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex
|
|
||||||
$bytes[0x15] = $bytes[0x15] -bor 0x20
|
|
||||||
[System.IO.File]::WriteAllBytes($FileBrowser.FileName, $bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName) with 'Run as administrator' set to $RunAsAdmin"
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
<!-- BEGIN SECOND CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
<!-- END SECOND CUSTOM CONTENT -->
|
|
||||||
|
|
||||||
|
|
||||||
[View the JSON file](https://github.com/ChrisTitusTech/winutil/tree/main/config/tweaks.json)
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
function Invoke-WPFMicrowin {
|
function Invoke-Microwin {
|
||||||
<#
|
<#
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
Invoke MicroWin routines...
|
Invoke MicroWin routines...
|
||||||
@ -78,7 +78,7 @@ public class PowerManagement {
|
|||||||
$imgVersion = (Get-WindowsImage -ImagePath $mountDir\sources\install.wim -Index $index).Version
|
$imgVersion = (Get-WindowsImage -ImagePath $mountDir\sources\install.wim -Index $index).Version
|
||||||
|
|
||||||
# Detect image version to avoid performing MicroWin processing on Windows 8 and earlier
|
# Detect image version to avoid performing MicroWin processing on Windows 8 and earlier
|
||||||
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,10240,0))) -eq $false) {
|
if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,10240,0))) -eq $false) {
|
||||||
$msg = "This image is not compatible with MicroWin processing. Make sure it isn't a Windows 8 or earlier image."
|
$msg = "This image is not compatible with MicroWin processing. Make sure it isn't a Windows 8 or earlier image."
|
||||||
$dlg_msg = $msg + "`n`nIf you want more information, the version of the image selected is $($imgVersion)`n`nIf an image has been incorrectly marked as incompatible, report an issue to the developers."
|
$dlg_msg = $msg + "`n`nIf you want more information, the version of the image selected is $($imgVersion)`n`nIf an image has been incorrectly marked as incompatible, report an issue to the developers."
|
||||||
Write-Host $msg
|
Write-Host $msg
|
||||||
@ -88,7 +88,7 @@ public class PowerManagement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Detect whether the image to process contains Windows 10 and show warning
|
# 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) {
|
if ((Microwin-TestCompatibleImage $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."
|
$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
|
$dlg_msg = $msg
|
||||||
Write-Host $msg
|
Write-Host $msg
|
||||||
@ -155,47 +155,69 @@ public class PowerManagement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Remove Features from the image"
|
Write-Host "Remove Features from the image"
|
||||||
Remove-Features
|
Microwin-RemoveFeatures
|
||||||
Write-Host "Removing features complete!"
|
Write-Host "Removing features complete!"
|
||||||
Write-Host "Removing OS packages"
|
Write-Host "Removing OS packages"
|
||||||
Remove-Packages
|
Microwin-RemovePackages
|
||||||
Write-Host "Removing Appx Bloat"
|
Write-Host "Removing Appx Bloat"
|
||||||
Remove-ProvisionedPackages
|
Microwin-RemoveProvisionedPackages
|
||||||
|
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
|
# Detect Windows 11 24H2 and add dependency to FileExp to prevent Explorer look from going back - thanks @WitherOrNot and @thecatontheceiling
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
|
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,26100,1))) -eq $true) {
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
|
try {
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe"
|
if (Test-Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -PathType Leaf) {
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory
|
# Found the culprit. Do the following:
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory
|
# 1. Take ownership of the file, from TrustedInstaller to Administrators
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory
|
takeown /F "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /A
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory
|
# 2. Set ACLs so that we can write to it
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory
|
icacls "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /grant "$(Microwin-GetLocalizedUsers -admins $true):(M)" | Out-Host
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory
|
# 3. Open the file and do the modification
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory
|
$appxManifest = Get-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml"
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory
|
$originalLine = $appxManifest[13]
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter"
|
$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`" />"
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe"
|
$appxManifest[13] = "$originalLine$dependency"
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico"
|
Set-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -Value $appxManifest -Force -Encoding utf8
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory
|
}
|
||||||
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory
|
}
|
||||||
|
catch {
|
||||||
|
# Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe"
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter"
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe"
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico"
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory
|
||||||
|
Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory
|
||||||
Write-Host "Removal complete!"
|
Write-Host "Removal complete!"
|
||||||
|
|
||||||
Write-Host "Create unattend.xml"
|
Write-Host "Create unattend.xml"
|
||||||
#New-Unattend
|
|
||||||
if ($sync.MicrowinUserName.Text -eq "")
|
if ($sync.MicrowinUserName.Text -eq "")
|
||||||
{
|
{
|
||||||
New-Unattend -userName "User"
|
Microwin-NewUnattend -userName "User"
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ($sync.MicrowinUserPassword.Password -eq "")
|
if ($sync.MicrowinUserPassword.Password -eq "")
|
||||||
{
|
{
|
||||||
New-Unattend -userName "$($sync.MicrowinUserName.Text)"
|
Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)"
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
New-Unattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)"
|
Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Write-Host "Done Create unattend.xml"
|
Write-Host "Done Create unattend.xml"
|
||||||
@ -208,7 +230,7 @@ public class PowerManagement {
|
|||||||
Write-Host "Done Copy unattend.xml"
|
Write-Host "Done Copy unattend.xml"
|
||||||
|
|
||||||
Write-Host "Create FirstRun"
|
Write-Host "Create FirstRun"
|
||||||
New-FirstRun
|
Microwin-NewFirstRun
|
||||||
Write-Host "Done create FirstRun"
|
Write-Host "Done create FirstRun"
|
||||||
Write-Host "Copy FirstRun.ps1 into the ISO"
|
Write-Host "Copy FirstRun.ps1 into the ISO"
|
||||||
Copy-Item "$env:temp\FirstStartup.ps1" "$($scratchDir)\Windows\FirstStartup.ps1" -force
|
Copy-Item "$env:temp\FirstStartup.ps1" "$($scratchDir)\Windows\FirstStartup.ps1" -force
|
||||||
@ -220,7 +242,7 @@ public class PowerManagement {
|
|||||||
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default"
|
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default"
|
||||||
|
|
||||||
Write-Host "Copy checkinstall.cmd into the ISO"
|
Write-Host "Copy checkinstall.cmd into the ISO"
|
||||||
New-CheckInstall
|
Microwin-NewCheckInstall
|
||||||
Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force
|
Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force
|
||||||
Write-Host "Done copy checkinstall.cmd"
|
Write-Host "Done copy checkinstall.cmd"
|
||||||
|
|
||||||
@ -296,7 +318,7 @@ 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) {
|
if ((Microwin-TestCompatibleImage $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,
|
# 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)
|
# 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)
|
||||||
|
|
||||||
@ -408,7 +430,7 @@ public class PowerManagement {
|
|||||||
|
|
||||||
if ($copyToUSB) {
|
if ($copyToUSB) {
|
||||||
Write-Host "Copying target ISO to the USB drive"
|
Write-Host "Copying target ISO to the USB drive"
|
||||||
Copy-ToUSB("$($SaveDialog.FileName)")
|
Microwin-CopyToUSB("$($SaveDialog.FileName)")
|
||||||
if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." }
|
if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." }
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
function Invoke-WPFGetIso {
|
function Invoke-MicrowinGetIso {
|
||||||
<#
|
<#
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
Function to get the path to Iso file for MicroWin, unpack that isom=, read basic information and populate the UI Options
|
Function to get the path to Iso file for MicroWin, unpack that isom=, read basic information and populate the UI Options
|
||||||
@ -50,7 +50,7 @@ function Invoke-WPFGetIso {
|
|||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
[System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it from github. This might take a long time.")
|
[System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it from github. This might take a long time.")
|
||||||
Get-Oscdimg -oscdimgPath $oscdimgPath
|
Microwin-GetOscdimg -oscdimgPath $oscdimgPath
|
||||||
$oscdImgFound = Test-Path $oscdimgPath -PathType Leaf
|
$oscdImgFound = Test-Path $oscdimgPath -PathType Leaf
|
||||||
if (!$oscdImgFound) {
|
if (!$oscdImgFound) {
|
||||||
$msg = "oscdimg was not downloaded can not proceed"
|
$msg = "oscdimg was not downloaded can not proceed"
|
||||||
@ -100,7 +100,7 @@ function Invoke-WPFGetIso {
|
|||||||
Set-Location -Path $env:temp
|
Set-Location -Path $env:temp
|
||||||
# Detect if the first option ("System language") has been selected and get a Fido-approved language from the current culture
|
# Detect if the first option ("System language") has been selected and get a Fido-approved language from the current culture
|
||||||
$lang = if ($sync["ISOLanguage"].SelectedIndex -eq 0) {
|
$lang = if ($sync["ISOLanguage"].SelectedIndex -eq 0) {
|
||||||
Get-FidoLangFromCulture -langName (Get-Culture).Name
|
Microwin-GetLangFromCulture -langName (Get-Culture).Name
|
||||||
} else {
|
} else {
|
||||||
$sync["ISOLanguage"].SelectedItem
|
$sync["ISOLanguage"].SelectedItem
|
||||||
}
|
}
|
10
functions/microwin/Microwin-Classes.ps1
Normal file
10
functions/microwin/Microwin-Classes.ps1
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
23
functions/microwin/Microwin-CopyToUSB.ps1
Normal file
23
functions/microwin/Microwin-CopyToUSB.ps1
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
function Microwin-CopyToUSB([string]$fileToCopy) {
|
||||||
|
foreach ($volume in Get-Volume) {
|
||||||
|
if ($volume -and $volume.FileSystemLabel -ieq "ventoy") {
|
||||||
|
$destinationPath = "$($volume.DriveLetter):\"
|
||||||
|
#Copy-Item -Path $fileToCopy -Destination $destinationPath -Force
|
||||||
|
# Get the total size of the file
|
||||||
|
$totalSize = (Get-Item "$fileToCopy").length
|
||||||
|
|
||||||
|
Copy-Item -Path "$fileToCopy" -Destination "$destinationPath" -Verbose -Force -Recurse -Container -PassThru |
|
||||||
|
ForEach-Object {
|
||||||
|
# Calculate the percentage completed
|
||||||
|
$completed = ($_.BytesTransferred / $totalSize) * 100
|
||||||
|
|
||||||
|
# Display the progress bar
|
||||||
|
Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB))
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "File copied to Ventoy drive $($volume.DriveLetter)"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Host "Ventoy USB Key is not inserted"
|
||||||
|
}
|
49
functions/microwin/Microwin-GetLangFromCulture.ps1
Normal file
49
functions/microwin/Microwin-GetLangFromCulture.ps1
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
function Microwin-GetLangFromCulture {
|
||||||
|
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory, Position = 0)] [string]$langName
|
||||||
|
)
|
||||||
|
|
||||||
|
switch -Wildcard ($langName)
|
||||||
|
{
|
||||||
|
"ar*" { return "Arabic" }
|
||||||
|
"pt-BR" { return "Brazilian Portuguese" }
|
||||||
|
"bg*" { return "Bulgarian" }
|
||||||
|
{($_ -eq "zh-CH") -or ($_ -like "zh-Hans*") -or ($_ -eq "zh-SG") -or ($_ -eq "zh-CHS")} { return "Chinese (Simplified)" }
|
||||||
|
{($_ -eq "zh") -or ($_ -eq "zh-Hant") -or ($_ -eq "zh-HK") -or ($_ -eq "zh-MO") -or ($_ -eq "zh-TW") -or ($_ -eq "zh-CHT")} { return "Chinese (Traditional)" }
|
||||||
|
"hr*" { return "Croatian" }
|
||||||
|
"cs*" { return "Czech" }
|
||||||
|
"da*" { return "Danish" }
|
||||||
|
"nl*" { return "Dutch" }
|
||||||
|
"en-US" { return "English" }
|
||||||
|
{($_ -like "en*") -and ($_ -ne "en-US")} { return "English International" }
|
||||||
|
"et*" { return "Estonian" }
|
||||||
|
"fi*" { return "Finnish" }
|
||||||
|
{($_ -like "fr*") -and ($_ -ne "fr-CA")} { return "French" }
|
||||||
|
"fr-CA" { return "French Canadian" }
|
||||||
|
"de*" { return "German" }
|
||||||
|
"el*" { return "Greek" }
|
||||||
|
"he*" { return "Hebrew" }
|
||||||
|
"hu*" { return "Hungarian" }
|
||||||
|
"it*" { return "Italian" }
|
||||||
|
"ja*" { return "Japanese" }
|
||||||
|
"ko*" { return "Korean" }
|
||||||
|
"lv*" { return "Latvian" }
|
||||||
|
"lt*" { return "Lituanian" }
|
||||||
|
"nb*" { return "Norwegian" }
|
||||||
|
"pl*" { return "Polish" }
|
||||||
|
{($_ -like "pt*") -and ($_ -ne "pt-BR")} { return "Portuguese" }
|
||||||
|
"ro*" { return "Romanian" }
|
||||||
|
"ru*" { return "Russian" }
|
||||||
|
"sr-Latn*" { return "Serbian Latin" }
|
||||||
|
"sk*" { return "Slovak" }
|
||||||
|
"sl*" { return "Slovenian" }
|
||||||
|
{($_ -like "es*") -and ($_ -ne "es-MX")} { return "Spanish" }
|
||||||
|
"es-MX" { return "Spanish (Mexico)" }
|
||||||
|
"sv*" { return "Swedish" }
|
||||||
|
"th*" { return "Thai" }
|
||||||
|
"tr*" { return "Turkish" }
|
||||||
|
"uk*" { return "Ukrainian" }
|
||||||
|
default { return "English" }
|
||||||
|
}
|
||||||
|
}
|
21
functions/microwin/Microwin-GetLocalizedUsers.ps1
Normal file
21
functions/microwin/Microwin-GetLocalizedUsers.ps1
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
function Microwin-GetLocalizedUsers
|
||||||
|
{
|
||||||
|
<#
|
||||||
|
.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
|
||||||
|
Microwin-GetLocalizedUsers -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
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,10 @@
|
|||||||
function Get-Oscdimg {
|
function Microwin-GetOscdimg {
|
||||||
<#
|
<#
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
This function will download oscdimg file from github Release folders and put it into env:temp folder
|
This function will download oscdimg file from github Release folders and put it into env:temp folder
|
||||||
|
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
Get-Oscdimg
|
Microwin-GetOscdimg
|
||||||
#>
|
#>
|
||||||
|
|
||||||
param(
|
param(
|
73
functions/microwin/Microwin-NewCheckInstall.ps1
Normal file
73
functions/microwin/Microwin-NewCheckInstall.ps1
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
function Microwin-NewCheckInstall {
|
||||||
|
|
||||||
|
# using here string to embedd firstrun
|
||||||
|
$checkInstall = @'
|
||||||
|
@echo off
|
||||||
|
if exist "%HOMEDRIVE%\windows\cpu.txt" (
|
||||||
|
echo %HOMEDRIVE%\windows\cpu.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\windows\cpu.txt does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\windows\SerialNumber.txt" (
|
||||||
|
echo %HOMEDRIVE%\windows\SerialNumber.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\windows\SerialNumber.txt does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\unattend.xml" (
|
||||||
|
echo %HOMEDRIVE%\unattend.xml exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\unattend.xml does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd" (
|
||||||
|
echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\Panther\unattend.xml" (
|
||||||
|
echo %HOMEDRIVE%\Windows\Panther\unattend.xml exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\Panther\unattend.xml does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml" (
|
||||||
|
echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\FirstStartup.ps1" (
|
||||||
|
echo %HOMEDRIVE%\Windows\FirstStartup.ps1 exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\FirstStartup.ps1 does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\winutil.ps1" (
|
||||||
|
echo %HOMEDRIVE%\Windows\winutil.ps1 exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\winutil.ps1 does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\LogSpecialize.txt" (
|
||||||
|
echo %HOMEDRIVE%\Windows\LogSpecialize.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\LogSpecialize.txt does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\LogAuditUser.txt" (
|
||||||
|
echo %HOMEDRIVE%\Windows\LogAuditUser.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\LogAuditUser.txt does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\Windows\LogOobeSystem.txt" (
|
||||||
|
echo %HOMEDRIVE%\Windows\LogOobeSystem.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\Windows\LogOobeSystem.txt does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\windows\csup.txt" (
|
||||||
|
echo %HOMEDRIVE%\windows\csup.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\windows\csup.txt does not exist
|
||||||
|
)
|
||||||
|
if exist "%HOMEDRIVE%\windows\LogFirstRun.txt" (
|
||||||
|
echo %HOMEDRIVE%\windows\LogFirstRun.txt exists
|
||||||
|
) else (
|
||||||
|
echo %HOMEDRIVE%\windows\LogFirstRun.txt does not exist
|
||||||
|
)
|
||||||
|
'@
|
||||||
|
$checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii
|
||||||
|
}
|
68
functions/microwin/Microwin-NewFirstRun.ps1
Normal file
68
functions/microwin/Microwin-NewFirstRun.ps1
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
function Microwin-NewFirstRun {
|
||||||
|
|
||||||
|
# using here string to embedd firstrun
|
||||||
|
$firstRun = @'
|
||||||
|
# Set the global error action preference to continue
|
||||||
|
$ErrorActionPreference = "Continue"
|
||||||
|
function Remove-RegistryValue {
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$RegistryPath,
|
||||||
|
|
||||||
|
[Parameter(Mandatory = $true)]
|
||||||
|
[string]$ValueName
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if the registry path exists
|
||||||
|
if (Test-Path -Path $RegistryPath) {
|
||||||
|
$registryValue = Get-ItemProperty -Path $RegistryPath -Name $ValueName -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
# Check if the registry value exists
|
||||||
|
if ($registryValue) {
|
||||||
|
# Remove the registry value
|
||||||
|
Remove-ItemProperty -Path $RegistryPath -Name $ValueName -Force
|
||||||
|
Write-Host "Registry value '$ValueName' removed from '$RegistryPath'."
|
||||||
|
} else {
|
||||||
|
Write-Host "Registry value '$ValueName' not found in '$RegistryPath'."
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Registry path '$RegistryPath' not found."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"FirstStartup has worked" | Out-File -FilePath "$env:HOMEDRIVE\windows\LogFirstRun.txt" -Append -NoClobber
|
||||||
|
|
||||||
|
$taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
|
||||||
|
# Delete all files on the Taskbar
|
||||||
|
Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force
|
||||||
|
Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesRemovedChanges"
|
||||||
|
Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesChanges"
|
||||||
|
Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "Favorites"
|
||||||
|
|
||||||
|
# Delete Edge Icon from the desktop
|
||||||
|
$edgeShortcutFiles = Get-ChildItem -Path $desktopPath -Filter "*Edge*.lnk"
|
||||||
|
# Check if Edge shortcuts exist on the desktop
|
||||||
|
if ($edgeShortcutFiles) {
|
||||||
|
foreach ($shortcutFile in $edgeShortcutFiles) {
|
||||||
|
# Remove each Edge shortcut
|
||||||
|
Remove-Item -Path $shortcutFile.FullName -Force
|
||||||
|
Write-Host "Edge shortcut '$($shortcutFile.Name)' removed from the desktop."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk"
|
||||||
|
Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk"
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
310
functions/microwin/Microwin-NewUnattend.ps1
Normal file
310
functions/microwin/Microwin-NewUnattend.ps1
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
function Microwin-NewUnattend {
|
||||||
|
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory, Position = 0)] [string]$userName,
|
||||||
|
[Parameter(Position = 1)] [string]$userPassword
|
||||||
|
)
|
||||||
|
|
||||||
|
$unattend = @'
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<unattend xmlns="urn:schemas-microsoft-com:unattend"
|
||||||
|
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<#REPLACEME#>
|
||||||
|
<settings pass="auditUser">
|
||||||
|
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<RunSynchronous>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>1</Order>
|
||||||
|
<CommandLine>CMD /C echo LAU GG>C:\Windows\LogAuditUser.txt</CommandLine>
|
||||||
|
<Description>StartMenu</Description>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
</RunSynchronous>
|
||||||
|
</component>
|
||||||
|
</settings>
|
||||||
|
<settings pass="oobeSystem">
|
||||||
|
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<UserAccounts>
|
||||||
|
<LocalAccounts>
|
||||||
|
<LocalAccount wcm:action="add">
|
||||||
|
<Name>USER-REPLACEME</Name>
|
||||||
|
<Group>Administrators</Group>
|
||||||
|
<Password>
|
||||||
|
<Value>PW-REPLACEME</Value>
|
||||||
|
<PlainText>true</PlainText>
|
||||||
|
</Password>
|
||||||
|
</LocalAccount>
|
||||||
|
</LocalAccounts>
|
||||||
|
</UserAccounts>
|
||||||
|
<AutoLogon>
|
||||||
|
<Username>USER-REPLACEME</Username>
|
||||||
|
<Enabled>true</Enabled>
|
||||||
|
<LogonCount>1</LogonCount>
|
||||||
|
<Password>
|
||||||
|
<Value>PW-REPLACEME</Value>
|
||||||
|
<PlainText>true</PlainText>
|
||||||
|
</Password>
|
||||||
|
</AutoLogon>
|
||||||
|
<OOBE>
|
||||||
|
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
|
||||||
|
<SkipUserOOBE>true</SkipUserOOBE>
|
||||||
|
<SkipMachineOOBE>true</SkipMachineOOBE>
|
||||||
|
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
|
||||||
|
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
|
||||||
|
<HideEULAPage>true</HideEULAPage>
|
||||||
|
<ProtectYourPC>3</ProtectYourPC>
|
||||||
|
</OOBE>
|
||||||
|
<FirstLogonCommands>
|
||||||
|
<SynchronousCommand wcm:action="add">
|
||||||
|
<Order>1</Order>
|
||||||
|
<CommandLine>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f</CommandLine>
|
||||||
|
</SynchronousCommand>
|
||||||
|
<SynchronousCommand wcm:action="add">
|
||||||
|
<Order>2</Order>
|
||||||
|
<CommandLine>cmd.exe /c echo 23>c:\windows\csup.txt</CommandLine>
|
||||||
|
</SynchronousCommand>
|
||||||
|
<SynchronousCommand wcm:action="add">
|
||||||
|
<Order>3</Order>
|
||||||
|
<CommandLine>CMD /C echo GG>C:\Windows\LogOobeSystem.txt</CommandLine>
|
||||||
|
</SynchronousCommand>
|
||||||
|
<SynchronousCommand wcm:action="add">
|
||||||
|
<Order>4</Order>
|
||||||
|
<CommandLine>powershell -ExecutionPolicy Bypass -File c:\windows\FirstStartup.ps1</CommandLine>
|
||||||
|
</SynchronousCommand>
|
||||||
|
</FirstLogonCommands>
|
||||||
|
</component>
|
||||||
|
</settings>
|
||||||
|
</unattend>
|
||||||
|
'@
|
||||||
|
$specPass = @'
|
||||||
|
<settings pass="specialize">
|
||||||
|
<component name="Microsoft-Windows-SQMApi" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<CEIPEnabled>0</CEIPEnabled>
|
||||||
|
</component>
|
||||||
|
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<ConfigureChatAutoInstall>false</ConfigureChatAutoInstall>
|
||||||
|
</component>
|
||||||
|
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||||
|
<RunSynchronous>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>1</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>2</Order>
|
||||||
|
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>3</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "UninstallCopilot" /t REG_SZ /d "powershell.exe -NoProfile -Command \"Get-AppxPackage -Name 'Microsoft.Windows.Ai.Copilot.Provider' | Remove-AppxPackage;\"" /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>4</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>5</Order>
|
||||||
|
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>6</Order>
|
||||||
|
<Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>7</Order>
|
||||||
|
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>8</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>9</Order>
|
||||||
|
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>10</Order>
|
||||||
|
<Path>cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>11</Order>
|
||||||
|
<Path>cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>12</Order>
|
||||||
|
<Path>cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>13</Order>
|
||||||
|
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>14</Order>
|
||||||
|
<Path>reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>15</Order>
|
||||||
|
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>16</Order>
|
||||||
|
<Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>17</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>18</Order>
|
||||||
|
<Path>powershell.exe -NoProfile -Command "$xml = [xml]::new(); $xml.Load('C:\Windows\Panther\unattend.xml'); $sb = [scriptblock]::Create( $xml.unattend.Extensions.ExtractScript ); Invoke-Command -ScriptBlock $sb -ArgumentList $xml;"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>19</Order>
|
||||||
|
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>20</Order>
|
||||||
|
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>21</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>22</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>23</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>24</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>25</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins_LastWrite /t REG_DWORD /d 1 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>26</Order>
|
||||||
|
<Path>net.exe accounts /maxpwage:UNLIMITED</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>27</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>28</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>29</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>30</Order>
|
||||||
|
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>31</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>32</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>33</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>34</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>35</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>36</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>37</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>38</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>39</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>40</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>41</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>42</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>43</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>44</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>45</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>46</Order>
|
||||||
|
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>47</Order>
|
||||||
|
<Path>reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>48</Order>
|
||||||
|
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>49</Order>
|
||||||
|
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>50</Order>
|
||||||
|
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "ClassicContextMenu" /t REG_SZ /d "reg.exe add \"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32\" /ve /f" /f</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
<RunSynchronousCommand wcm:action="add">
|
||||||
|
<Order>51</Order>
|
||||||
|
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
||||||
|
</RunSynchronousCommand>
|
||||||
|
</RunSynchronous>
|
||||||
|
</component>
|
||||||
|
</settings>
|
||||||
|
'@
|
||||||
|
if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) {
|
||||||
|
# Replace the placeholder text with an empty string to make it valid for Windows 10 Setup
|
||||||
|
$unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
|
||||||
|
} else {
|
||||||
|
# Replace the placeholder text with the Specialize pass
|
||||||
|
$unattend = $unattend.Replace("<#REPLACEME#>", $specPass).Trim()
|
||||||
|
}
|
||||||
|
# Replace default User and Password values with the provided parameters
|
||||||
|
$unattend = $unattend.Replace("USER-REPLACEME", $userName).Trim()
|
||||||
|
$unattend = $unattend.Replace("PW-REPLACEME", $userPassword).Trim()
|
||||||
|
|
||||||
|
# Save unattended answer file with UTF-8 encoding
|
||||||
|
$unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8
|
||||||
|
}
|
40
functions/microwin/Microwin-RemoveFeatures.ps1
Normal file
40
functions/microwin/Microwin-RemoveFeatures.ps1
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
function Microwin-RemoveFeatures() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Removes certain features from ISO image
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
No Params
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Microwin-RemoveFeatures
|
||||||
|
#>
|
||||||
|
try {
|
||||||
|
$featlist = (Get-WindowsOptionalFeature -Path $scratchDir)
|
||||||
|
|
||||||
|
$featlist = $featlist | Where-Object {
|
||||||
|
$_.FeatureName -NotLike "*Defender*" -AND
|
||||||
|
$_.FeatureName -NotLike "*Printing*" -AND
|
||||||
|
$_.FeatureName -NotLike "*TelnetClient*" -AND
|
||||||
|
$_.FeatureName -NotLike "*PowerShell*" -AND
|
||||||
|
$_.FeatureName -NotLike "*NetFx*" -AND
|
||||||
|
$_.FeatureName -NotLike "*Media*" -AND
|
||||||
|
$_.FeatureName -NotLike "*NFS*" -AND
|
||||||
|
$_.FeatureName -NotLike "*SearchEngine*" -AND
|
||||||
|
$_.FeatureName -NotLike "*RemoteDesktop*" -AND
|
||||||
|
$_.State -ne "Disabled"
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($feature in $featlist) {
|
||||||
|
$status = "Removing feature $($feature.FeatureName)"
|
||||||
|
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
|
||||||
|
Write-Debug "Removing feature $($feature.FeatureName)"
|
||||||
|
Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart
|
||||||
|
}
|
||||||
|
Write-Progress -Activity "Removing features" -Status "Ready" -Completed
|
||||||
|
Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in <installation media>\Sources."
|
||||||
|
} catch {
|
||||||
|
Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
|
||||||
|
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
42
functions/microwin/Microwin-RemoveFileOrDirectory.ps1
Normal file
42
functions/microwin/Microwin-RemoveFileOrDirectory.ps1
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
function Microwin-RemoveFileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) {
|
||||||
|
if(([string]::IsNullOrEmpty($pathToDelete))) { return }
|
||||||
|
if (-not (Test-Path -Path "$($pathToDelete)")) { return }
|
||||||
|
|
||||||
|
$yesNo = Get-LocalizedYesNo
|
||||||
|
Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer."
|
||||||
|
|
||||||
|
$itemsToDelete = [System.Collections.ArrayList]::new()
|
||||||
|
|
||||||
|
if ($mask -eq "") {
|
||||||
|
Write-Debug "Adding $($pathToDelete) to array."
|
||||||
|
[void]$itemsToDelete.Add($pathToDelete)
|
||||||
|
} else {
|
||||||
|
Write-Debug "Adding $($pathToDelete) to array and mask is $($mask)"
|
||||||
|
if ($Directory) { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse -Directory } else { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse }
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($itemToDelete in $itemsToDelete) {
|
||||||
|
$status = "Deleting $($itemToDelete)"
|
||||||
|
Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100)
|
||||||
|
|
||||||
|
if (Test-Path -Path "$($itemToDelete)" -PathType Container) {
|
||||||
|
$status = "Deleting directory: $($itemToDelete)"
|
||||||
|
|
||||||
|
takeown /r /d $yesNo[0] /a /f "$($itemToDelete)"
|
||||||
|
icacls "$($itemToDelete)" /q /c /t /reset
|
||||||
|
icacls $itemToDelete /setowner "*S-1-5-32-544"
|
||||||
|
icacls $itemToDelete /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
|
||||||
|
Remove-Item -Force -Recurse "$($itemToDelete)"
|
||||||
|
}
|
||||||
|
elseif (Test-Path -Path "$($itemToDelete)" -PathType Leaf) {
|
||||||
|
$status = "Deleting file: $($itemToDelete)"
|
||||||
|
|
||||||
|
takeown /a /f "$($itemToDelete)"
|
||||||
|
icacls "$($itemToDelete)" /q /c /t /reset
|
||||||
|
icacls "$($itemToDelete)" /setowner "*S-1-5-32-544"
|
||||||
|
icacls "$($itemToDelete)" /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
|
||||||
|
Remove-Item -Force "$($itemToDelete)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Progress -Activity "Removing Items" -Status "Ready" -Completed
|
||||||
|
}
|
96
functions/microwin/Microwin-RemovePackages.ps1
Normal file
96
functions/microwin/Microwin-RemovePackages.ps1
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
function Microwin-RemovePackages {
|
||||||
|
try {
|
||||||
|
$pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName
|
||||||
|
|
||||||
|
$pkglist = $pkglist | Where-Object {
|
||||||
|
$_ -NotLike "*ApplicationModel*" -AND
|
||||||
|
$_ -NotLike "*indows-Client-LanguagePack*" -AND
|
||||||
|
$_ -NotLike "*LanguageFeatures-Basic*" -AND
|
||||||
|
$_ -NotLike "*Package_for_ServicingStack*" -AND
|
||||||
|
$_ -NotLike "*.NET*" -AND
|
||||||
|
$_ -NotLike "*Store*" -AND
|
||||||
|
$_ -NotLike "*VCLibs*" -AND
|
||||||
|
$_ -NotLike "*AAD.BrokerPlugin",
|
||||||
|
$_ -NotLike "*LockApp*" -AND
|
||||||
|
$_ -NotLike "*Notepad*" -AND
|
||||||
|
$_ -NotLike "*immersivecontrolpanel*" -AND
|
||||||
|
$_ -NotLike "*ContentDeliveryManager*" -AND
|
||||||
|
$_ -NotLike "*PinningConfirMationDialog*" -AND
|
||||||
|
$_ -NotLike "*SecHealthUI*" -AND
|
||||||
|
$_ -NotLike "*SecureAssessmentBrowser*" -AND
|
||||||
|
$_ -NotLike "*PrintDialog*" -AND
|
||||||
|
$_ -NotLike "*AssignedAccessLockApp*" -AND
|
||||||
|
$_ -NotLike "*OOBENetworkConnectionFlow*" -AND
|
||||||
|
$_ -NotLike "*Apprep.ChxApp*" -AND
|
||||||
|
$_ -NotLike "*CBS*" -AND
|
||||||
|
$_ -NotLike "*OOBENetworkCaptivePortal*" -AND
|
||||||
|
$_ -NotLike "*PeopleExperienceHost*" -AND
|
||||||
|
$_ -NotLike "*ParentalControls*" -AND
|
||||||
|
$_ -NotLike "*Win32WebViewHost*" -AND
|
||||||
|
$_ -NotLike "*InputApp*" -AND
|
||||||
|
$_ -NotLike "*DirectPlay*" -AND
|
||||||
|
$_ -NotLike "*AccountsControl*" -AND
|
||||||
|
$_ -NotLike "*AsyncTextService*" -AND
|
||||||
|
$_ -NotLike "*CapturePicker*" -AND
|
||||||
|
$_ -NotLike "*CredDialogHost*" -AND
|
||||||
|
$_ -NotLike "*BioEnrollMent*" -AND
|
||||||
|
$_ -NotLike "*ShellExperienceHost*" -AND
|
||||||
|
$_ -NotLike "*DesktopAppInstaller*" -AND
|
||||||
|
$_ -NotLike "*WebMediaExtensions*" -AND
|
||||||
|
$_ -NotLike "*WMIC*" -AND
|
||||||
|
$_ -NotLike "*UI.XaML*" -AND
|
||||||
|
$_ -NotLike "*Ethernet*" -AND
|
||||||
|
$_ -NotLike "*Wifi*" -AND
|
||||||
|
$_ -NotLike "*FodMetadata*" -AND
|
||||||
|
$_ -NotLike "*Foundation*" -AND
|
||||||
|
$_ -NotLike "*LanguageFeatures*" -AND
|
||||||
|
$_ -NotLike "*VBSCRIPT*" -AND
|
||||||
|
$_ -NotLike "*License*"
|
||||||
|
}
|
||||||
|
|
||||||
|
$failedCount = 0
|
||||||
|
|
||||||
|
$erroredPackages = [System.Collections.Generic.List[ErroredPackage]]::new()
|
||||||
|
|
||||||
|
foreach ($pkg in $pkglist) {
|
||||||
|
try {
|
||||||
|
$status = "Removing $pkg"
|
||||||
|
Write-Progress -Activity "Removing Packages" -Status $status -PercentComplete ($counter++/$pkglist.Count*100)
|
||||||
|
Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue
|
||||||
|
} catch {
|
||||||
|
# This can happen if the package that is being removed is a permanent one
|
||||||
|
$erroredPackages.Add([ErroredPackage]::new($pkg, $_.Exception.Message))
|
||||||
|
$failedCount += 1
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Progress -Activity "Removing Packages" -Status "Ready" -Completed
|
||||||
|
if ($failedCount -gt 0)
|
||||||
|
{
|
||||||
|
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 {
|
||||||
|
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
|
||||||
|
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
51
functions/microwin/Microwin-RemoveProvisionedPackages.ps1
Normal file
51
functions/microwin/Microwin-RemoveProvisionedPackages.ps1
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
function Microwin-RemoveProvisionedPackages() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Removes AppX packages from a Windows image during MicroWin processing
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
No Params
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
Microwin-RemoveProvisionedPackages
|
||||||
|
#>
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
|
||||||
|
$_.PackageName -NotLike "*AppInstaller*" -AND
|
||||||
|
$_.PackageName -NotLike "*Store*" -and
|
||||||
|
$_.PackageName -NotLike "*Notepad*" -and
|
||||||
|
$_.PackageName -NotLike "*Printing*" -and
|
||||||
|
$_.PackageName -NotLike "*YourPhone*" -and
|
||||||
|
$_.PackageName -NotLike "*Xbox*" -and
|
||||||
|
$_.PackageName -NotLike "*WindowsTerminal*" -and
|
||||||
|
$_.PackageName -NotLike "*Calculator*" -and
|
||||||
|
$_.PackageName -NotLike "*Photos*" -and
|
||||||
|
$_.PackageName -NotLike "*VCLibs*" -and
|
||||||
|
$_.PackageName -NotLike "*Paint*" -and
|
||||||
|
$_.PackageName -NotLike "*Gaming*" -and
|
||||||
|
$_.PackageName -NotLike "*Extension*" -and
|
||||||
|
$_.PackageName -NotLike "*SecHealthUI*" -and
|
||||||
|
$_.PackageName -NotLike "*ScreenSketch*"
|
||||||
|
}
|
||||||
|
|
||||||
|
$counter = 0
|
||||||
|
foreach ($appx in $appxProvisionedPackages) {
|
||||||
|
$status = "Removing Provisioned $($appx.PackageName)"
|
||||||
|
Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100)
|
||||||
|
try {
|
||||||
|
Remove-AppxProvisionedPackage -Path "$scratchDir" -PackageName $appx.PackageName -ErrorAction SilentlyContinue
|
||||||
|
} catch {
|
||||||
|
Write-Host "Application $($appx.PackageName) could not be removed"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
# This can happen if getting AppX packages fails
|
||||||
|
Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed"
|
||||||
|
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
26
functions/microwin/Microwin-TestCompatibleImage.ps1
Normal file
26
functions/microwin/Microwin-TestCompatibleImage.ps1
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
function Microwin-TestCompatibleImage() {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version
|
||||||
|
|
||||||
|
.PARAMETER Name
|
||||||
|
imgVersion - The version of the Windows image
|
||||||
|
desiredVersion - The version to compare the image version with
|
||||||
|
#>
|
||||||
|
|
||||||
|
param
|
||||||
|
(
|
||||||
|
[Parameter(Mandatory, position=0)]
|
||||||
|
[string]$imgVersion,
|
||||||
|
|
||||||
|
[Parameter(Mandatory, position=1)]
|
||||||
|
[Version]$desiredVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
try {
|
||||||
|
$version = [Version]$imgVersion
|
||||||
|
return $version -ge $desiredVersion
|
||||||
|
} catch {
|
||||||
|
return $False
|
||||||
|
}
|
||||||
|
}
|
103
functions/private/Invoke-WinUtilInstallPSProfile.ps1
Normal file
103
functions/private/Invoke-WinUtilInstallPSProfile.ps1
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
function Invoke-WinUtilInstallPSProfile {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Backs up your original profile then installs and applies the CTT PowerShell profile.
|
||||||
|
#>
|
||||||
|
|
||||||
|
Invoke-WPFRunspace -ArgumentList $PROFILE -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
|
# Remap the automatic built-in $PROFILE variable to the parameter named $PSProfile.
|
||||||
|
param ($PSProfile)
|
||||||
|
|
||||||
|
function Invoke-PSSetup {
|
||||||
|
# Define the URL used to download Chris Titus Tech's PowerShell profile.
|
||||||
|
$url = "https://raw.githubusercontent.com/ChrisTitusTech/powershell-profile/main/Microsoft.PowerShell_profile.ps1"
|
||||||
|
|
||||||
|
# Get the file hash for the user's current PowerShell profile.
|
||||||
|
$OldHash = Get-FileHash $PSProfile -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
# Download Chris Titus Tech's PowerShell profile to the 'TEMP' folder.
|
||||||
|
Invoke-RestMethod $url -OutFile "$env:TEMP/Microsoft.PowerShell_profile.ps1"
|
||||||
|
|
||||||
|
# Get the file hash for Chris Titus Tech's PowerShell profile.
|
||||||
|
$NewHash = Get-FileHash "$env:TEMP/Microsoft.PowerShell_profile.ps1"
|
||||||
|
|
||||||
|
# Store the file hash of Chris Titus Tech's PowerShell profile.
|
||||||
|
if (!(Test-Path "$PSProfile.hash")) {
|
||||||
|
$NewHash.Hash | Out-File "$PSProfile.hash"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if the new profile's hash doesn't match the old profile's hash.
|
||||||
|
if ($NewHash.Hash -ne $OldHash.Hash) {
|
||||||
|
# Check if oldprofile.ps1 exists and use it as a profile backup source.
|
||||||
|
if (Test-Path "$env:USERPROFILE\oldprofile.ps1") {
|
||||||
|
Write-Host "===> Backup File Exists... <===" -ForegroundColor Yellow
|
||||||
|
Write-Host "===> Moving Backup File... <===" -ForegroundColor Yellow
|
||||||
|
Copy-Item "$env:USERPROFILE\oldprofile.ps1" "$PSProfile.bak"
|
||||||
|
Write-Host "===> Profile Backup: Done. <===" -ForegroundColor Yellow
|
||||||
|
} else {
|
||||||
|
# If oldprofile.ps1 does not exist use $PSProfile as a profile backup source.
|
||||||
|
# Check if the profile backup file has not already been created on the disk.
|
||||||
|
if ((Test-Path $PSProfile) -and (-not (Test-Path "$PSProfile.bak"))) {
|
||||||
|
# Let the user know their PowerShell profile is being backed up.
|
||||||
|
Write-Host "===> Backing Up Profile... <===" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Copy the user's current PowerShell profile to the backup file path.
|
||||||
|
Copy-Item -Path $PSProfile -Destination "$PSProfile.bak"
|
||||||
|
|
||||||
|
# Let the user know the profile backup has been completed successfully.
|
||||||
|
Write-Host "===> Profile Backup: Done. <===" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Let the user know Chris Titus Tech's PowerShell profile is being installed.
|
||||||
|
Write-Host "===> Installing Profile... <===" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Start a new hidden PowerShell instance because setup.ps1 does not work in runspaces.
|
||||||
|
Start-Process -FilePath "pwsh" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -Command `"Invoke-Expression (Invoke-WebRequest `'https://github.com/ChrisTitusTech/powershell-profile/raw/main/setup.ps1`')`"" -WindowStyle Hidden -Wait
|
||||||
|
|
||||||
|
# Let the user know Chris Titus Tech's PowerShell profile has been installed successfully.
|
||||||
|
Write-Host "Profile has been installed. Please restart your shell to reflect the changes!" -ForegroundColor Magenta
|
||||||
|
|
||||||
|
# Let the user know Chris Titus Tech's PowerShell profile has been setup successfully.
|
||||||
|
Write-Host "===> Finished Profile Setup <===" -ForegroundColor Yellow
|
||||||
|
} else {
|
||||||
|
# Let the user know Chris Titus Tech's PowerShell profile is already fully up-to-date.
|
||||||
|
Write-Host "Profile is up to date" -ForegroundColor Magenta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if PowerShell Core is currently installed as a program and is available as a command.
|
||||||
|
if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
|
||||||
|
# Check if the version of PowerShell Core currently in use is version 7 or higher.
|
||||||
|
if ($PSVersionTable.PSVersion.Major -ge 7) {
|
||||||
|
# Invoke the PowerShell Profile setup script to install Chris Titus Tech's PowerShell Profile.
|
||||||
|
Invoke-PSSetup
|
||||||
|
} else {
|
||||||
|
# Let the user know that PowerShell 7 is installed but is not currently in use.
|
||||||
|
Write-Host "This profile requires Powershell 7, which is currently installed but not used!" -ForegroundColor Red
|
||||||
|
|
||||||
|
# Load the necessary .NET library required to use Windows Forms to show dialog boxes.
|
||||||
|
Add-Type -AssemblyName System.Windows.Forms
|
||||||
|
|
||||||
|
# Display the message box asking if the user wants to install PowerShell 7 or not.
|
||||||
|
$question = [System.Windows.Forms.MessageBox]::Show(
|
||||||
|
"Profile requires Powershell 7, which is currently installed but not used! Do you want to install the profile for Powershell 7?",
|
||||||
|
"Question",
|
||||||
|
[System.Windows.Forms.MessageBoxButtons]::YesNo,
|
||||||
|
[System.Windows.Forms.MessageBoxIcon]::Question
|
||||||
|
)
|
||||||
|
|
||||||
|
# Proceed with the installation and setup of the profile as the user pressed the 'Yes' button.
|
||||||
|
if ($question -eq [System.Windows.Forms.DialogResult]::Yes) {
|
||||||
|
Invoke-PSSetup
|
||||||
|
} else {
|
||||||
|
# Let the user know the setup of the profile will not proceed as they pressed the 'No' button.
|
||||||
|
Write-Host "Not proceeding with the profile setup!" -ForegroundColor Magenta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Let the user know that the profile requires PowerShell Core but it is not currently installed.
|
||||||
|
Write-Host "This profile requires Powershell Core, which is currently not installed!" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,834 +0,0 @@
|
|||||||
function Test-CompatibleImage() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version
|
|
||||||
|
|
||||||
.PARAMETER Name
|
|
||||||
imgVersion - The version of the Windows image
|
|
||||||
desiredVersion - The version to compare the image version with
|
|
||||||
#>
|
|
||||||
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[Parameter(Mandatory, position=0)]
|
|
||||||
[string]$imgVersion,
|
|
||||||
|
|
||||||
[Parameter(Mandatory, position=1)]
|
|
||||||
[Version]$desiredVersion
|
|
||||||
)
|
|
||||||
|
|
||||||
try {
|
|
||||||
$version = [Version]$imgVersion
|
|
||||||
return $version -ge $desiredVersion
|
|
||||||
} catch {
|
|
||||||
return $False
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
|
||||||
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory, Position = 0)] [string]$langName
|
|
||||||
)
|
|
||||||
|
|
||||||
switch -Wildcard ($langName)
|
|
||||||
{
|
|
||||||
"ar*" { return "Arabic" }
|
|
||||||
"pt-BR" { return "Brazilian Portuguese" }
|
|
||||||
"bg*" { return "Bulgarian" }
|
|
||||||
{($_ -eq "zh-CH") -or ($_ -like "zh-Hans*") -or ($_ -eq "zh-SG") -or ($_ -eq "zh-CHS")} { return "Chinese (Simplified)" }
|
|
||||||
{($_ -eq "zh") -or ($_ -eq "zh-Hant") -or ($_ -eq "zh-HK") -or ($_ -eq "zh-MO") -or ($_ -eq "zh-TW") -or ($_ -eq "zh-CHT")} { return "Chinese (Traditional)" }
|
|
||||||
"hr*" { return "Croatian" }
|
|
||||||
"cs*" { return "Czech" }
|
|
||||||
"da*" { return "Danish" }
|
|
||||||
"nl*" { return "Dutch" }
|
|
||||||
"en-US" { return "English" }
|
|
||||||
{($_ -like "en*") -and ($_ -ne "en-US")} { return "English International" }
|
|
||||||
"et*" { return "Estonian" }
|
|
||||||
"fi*" { return "Finnish" }
|
|
||||||
{($_ -like "fr*") -and ($_ -ne "fr-CA")} { return "French" }
|
|
||||||
"fr-CA" { return "French Canadian" }
|
|
||||||
"de*" { return "German" }
|
|
||||||
"el*" { return "Greek" }
|
|
||||||
"he*" { return "Hebrew" }
|
|
||||||
"hu*" { return "Hungarian" }
|
|
||||||
"it*" { return "Italian" }
|
|
||||||
"ja*" { return "Japanese" }
|
|
||||||
"ko*" { return "Korean" }
|
|
||||||
"lv*" { return "Latvian" }
|
|
||||||
"lt*" { return "Lituanian" }
|
|
||||||
"nb*" { return "Norwegian" }
|
|
||||||
"pl*" { return "Polish" }
|
|
||||||
{($_ -like "pt*") -and ($_ -ne "pt-BR")} { return "Portuguese" }
|
|
||||||
"ro*" { return "Romanian" }
|
|
||||||
"ru*" { return "Russian" }
|
|
||||||
"sr-Latn*" { return "Serbian Latin" }
|
|
||||||
"sk*" { return "Slovak" }
|
|
||||||
"sl*" { return "Slovenian" }
|
|
||||||
{($_ -like "es*") -and ($_ -ne "es-MX")} { return "Spanish" }
|
|
||||||
"es-MX" { return "Spanish (Mexico)" }
|
|
||||||
"sv*" { return "Swedish" }
|
|
||||||
"th*" { return "Thai" }
|
|
||||||
"tr*" { return "Turkish" }
|
|
||||||
"uk*" { return "Ukrainian" }
|
|
||||||
default { return "English" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Remove-Features() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Removes certain features from ISO image
|
|
||||||
|
|
||||||
.PARAMETER Name
|
|
||||||
No Params
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Remove-Features
|
|
||||||
#>
|
|
||||||
try {
|
|
||||||
$featlist = (Get-WindowsOptionalFeature -Path $scratchDir)
|
|
||||||
|
|
||||||
$featlist = $featlist | Where-Object {
|
|
||||||
$_.FeatureName -NotLike "*Defender*" -AND
|
|
||||||
$_.FeatureName -NotLike "*Printing*" -AND
|
|
||||||
$_.FeatureName -NotLike "*TelnetClient*" -AND
|
|
||||||
$_.FeatureName -NotLike "*PowerShell*" -AND
|
|
||||||
$_.FeatureName -NotLike "*NetFx*" -AND
|
|
||||||
$_.FeatureName -NotLike "*Media*" -AND
|
|
||||||
$_.FeatureName -NotLike "*NFS*" -AND
|
|
||||||
$_.FeatureName -NotLike "*SearchEngine*" -AND
|
|
||||||
$_.FeatureName -NotLike "*RemoteDesktop*" -AND
|
|
||||||
$_.FeatureName -NotLike "*Recall*" -AND
|
|
||||||
$_.State -ne "Disabled"
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($feature in $featlist) {
|
|
||||||
$status = "Removing feature $($feature.FeatureName)"
|
|
||||||
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
|
|
||||||
Write-Debug "Removing feature $($feature.FeatureName)"
|
|
||||||
Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart
|
|
||||||
}
|
|
||||||
Write-Progress -Activity "Removing features" -Status "Ready" -Completed
|
|
||||||
Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in <installation media>\Sources."
|
|
||||||
} catch {
|
|
||||||
Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
|
|
||||||
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Remove-Packages {
|
|
||||||
try {
|
|
||||||
$pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName
|
|
||||||
|
|
||||||
$pkglist = $pkglist | Where-Object {
|
|
||||||
$_ -NotLike "*ApplicationModel*" -AND
|
|
||||||
$_ -NotLike "*indows-Client-LanguagePack*" -AND
|
|
||||||
$_ -NotLike "*LanguageFeatures-Basic*" -AND
|
|
||||||
$_ -NotLike "*Package_for_ServicingStack*" -AND
|
|
||||||
$_ -NotLike "*.NET*" -AND
|
|
||||||
$_ -NotLike "*Store*" -AND
|
|
||||||
$_ -NotLike "*VCLibs*" -AND
|
|
||||||
$_ -NotLike "*AAD.BrokerPlugin",
|
|
||||||
$_ -NotLike "*LockApp*" -AND
|
|
||||||
$_ -NotLike "*Notepad*" -AND
|
|
||||||
$_ -NotLike "*immersivecontrolpanel*" -AND
|
|
||||||
$_ -NotLike "*ContentDeliveryManager*" -AND
|
|
||||||
$_ -NotLike "*PinningConfirMationDialog*" -AND
|
|
||||||
$_ -NotLike "*SecHealthUI*" -AND
|
|
||||||
$_ -NotLike "*SecureAssessmentBrowser*" -AND
|
|
||||||
$_ -NotLike "*PrintDialog*" -AND
|
|
||||||
$_ -NotLike "*AssignedAccessLockApp*" -AND
|
|
||||||
$_ -NotLike "*OOBENetworkConnectionFlow*" -AND
|
|
||||||
$_ -NotLike "*Apprep.ChxApp*" -AND
|
|
||||||
$_ -NotLike "*CBS*" -AND
|
|
||||||
$_ -NotLike "*OOBENetworkCaptivePortal*" -AND
|
|
||||||
$_ -NotLike "*PeopleExperienceHost*" -AND
|
|
||||||
$_ -NotLike "*ParentalControls*" -AND
|
|
||||||
$_ -NotLike "*Win32WebViewHost*" -AND
|
|
||||||
$_ -NotLike "*InputApp*" -AND
|
|
||||||
$_ -NotLike "*DirectPlay*" -AND
|
|
||||||
$_ -NotLike "*AccountsControl*" -AND
|
|
||||||
$_ -NotLike "*AsyncTextService*" -AND
|
|
||||||
$_ -NotLike "*CapturePicker*" -AND
|
|
||||||
$_ -NotLike "*CredDialogHost*" -AND
|
|
||||||
$_ -NotLike "*BioEnrollMent*" -AND
|
|
||||||
$_ -NotLike "*ShellExperienceHost*" -AND
|
|
||||||
$_ -NotLike "*DesktopAppInstaller*" -AND
|
|
||||||
$_ -NotLike "*WebMediaExtensions*" -AND
|
|
||||||
$_ -NotLike "*WMIC*" -AND
|
|
||||||
$_ -NotLike "*UI.XaML*" -AND
|
|
||||||
$_ -NotLike "*Ethernet*" -AND
|
|
||||||
$_ -NotLike "*Wifi*" -AND
|
|
||||||
$_ -NotLike "*FodMetadata*" -AND
|
|
||||||
$_ -NotLike "*Foundation*" -AND
|
|
||||||
$_ -NotLike "*LanguageFeatures*" -AND
|
|
||||||
$_ -NotLike "*VBSCRIPT*" -AND
|
|
||||||
$_ -NotLike "*License*"
|
|
||||||
}
|
|
||||||
|
|
||||||
$failedCount = 0
|
|
||||||
|
|
||||||
$erroredPackages = [System.Collections.Generic.List[ErroredPackage]]::new()
|
|
||||||
|
|
||||||
foreach ($pkg in $pkglist) {
|
|
||||||
try {
|
|
||||||
$status = "Removing $pkg"
|
|
||||||
Write-Progress -Activity "Removing Packages" -Status $status -PercentComplete ($counter++/$pkglist.Count*100)
|
|
||||||
Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue
|
|
||||||
} catch {
|
|
||||||
# This can happen if the package that is being removed is a permanent one
|
|
||||||
$erroredPackages.Add([ErroredPackage]::new($pkg, $_.Exception.Message))
|
|
||||||
$failedCount += 1
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Write-Progress -Activity "Removing Packages" -Status "Ready" -Completed
|
|
||||||
if ($failedCount -gt 0)
|
|
||||||
{
|
|
||||||
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 {
|
|
||||||
Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
|
|
||||||
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Remove-ProvisionedPackages() {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Removes AppX packages from a Windows image during MicroWin processing
|
|
||||||
|
|
||||||
.PARAMETER Name
|
|
||||||
No Params
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
Remove-ProvisionedPackages
|
|
||||||
#>
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
|
|
||||||
$_.PackageName -NotLike "*AppInstaller*" -AND
|
|
||||||
$_.PackageName -NotLike "*Store*" -and
|
|
||||||
$_.PackageName -NotLike "*Notepad*" -and
|
|
||||||
$_.PackageName -NotLike "*Printing*" -and
|
|
||||||
$_.PackageName -NotLike "*YourPhone*" -and
|
|
||||||
$_.PackageName -NotLike "*Xbox*" -and
|
|
||||||
$_.PackageName -NotLike "*WindowsTerminal*" -and
|
|
||||||
$_.PackageName -NotLike "*Calculator*" -and
|
|
||||||
$_.PackageName -NotLike "*Photos*" -and
|
|
||||||
$_.PackageName -NotLike "*VCLibs*" -and
|
|
||||||
$_.PackageName -NotLike "*Paint*" -and
|
|
||||||
$_.PackageName -NotLike "*Gaming*" -and
|
|
||||||
$_.PackageName -NotLike "*Extension*" -and
|
|
||||||
$_.PackageName -NotLike "*SecHealthUI*" -and
|
|
||||||
$_.PackageName -NotLike "*ScreenSketch*"
|
|
||||||
}
|
|
||||||
|
|
||||||
$counter = 0
|
|
||||||
foreach ($appx in $appxProvisionedPackages) {
|
|
||||||
$status = "Removing Provisioned $($appx.PackageName)"
|
|
||||||
Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100)
|
|
||||||
try {
|
|
||||||
Remove-AppxProvisionedPackage -Path "$scratchDir" -PackageName $appx.PackageName -ErrorAction SilentlyContinue
|
|
||||||
} catch {
|
|
||||||
Write-Host "Application $($appx.PackageName) could not be removed"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
# This can happen if getting AppX packages fails
|
|
||||||
Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed"
|
|
||||||
Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Copy-ToUSB([string]$fileToCopy) {
|
|
||||||
foreach ($volume in Get-Volume) {
|
|
||||||
if ($volume -and $volume.FileSystemLabel -ieq "ventoy") {
|
|
||||||
$destinationPath = "$($volume.DriveLetter):\"
|
|
||||||
#Copy-Item -Path $fileToCopy -Destination $destinationPath -Force
|
|
||||||
# Get the total size of the file
|
|
||||||
$totalSize = (Get-Item "$fileToCopy").length
|
|
||||||
|
|
||||||
Copy-Item -Path "$fileToCopy" -Destination "$destinationPath" -Verbose -Force -Recurse -Container -PassThru |
|
|
||||||
ForEach-Object {
|
|
||||||
# Calculate the percentage completed
|
|
||||||
$completed = ($_.BytesTransferred / $totalSize) * 100
|
|
||||||
|
|
||||||
# Display the progress bar
|
|
||||||
Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB))
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "File copied to Ventoy drive $($volume.DriveLetter)"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Write-Host "Ventoy USB Key is not inserted"
|
|
||||||
}
|
|
||||||
|
|
||||||
function Remove-FileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) {
|
|
||||||
if(([string]::IsNullOrEmpty($pathToDelete))) { return }
|
|
||||||
if (-not (Test-Path -Path "$($pathToDelete)")) { return }
|
|
||||||
|
|
||||||
$yesNo = Get-LocalizedYesNo
|
|
||||||
Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer."
|
|
||||||
|
|
||||||
$itemsToDelete = [System.Collections.ArrayList]::new()
|
|
||||||
|
|
||||||
if ($mask -eq "") {
|
|
||||||
Write-Debug "Adding $($pathToDelete) to array."
|
|
||||||
[void]$itemsToDelete.Add($pathToDelete)
|
|
||||||
} else {
|
|
||||||
Write-Debug "Adding $($pathToDelete) to array and mask is $($mask)"
|
|
||||||
if ($Directory) { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse -Directory } else { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse }
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($itemToDelete in $itemsToDelete) {
|
|
||||||
$status = "Deleting $($itemToDelete)"
|
|
||||||
Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100)
|
|
||||||
|
|
||||||
if (Test-Path -Path "$($itemToDelete)" -PathType Container) {
|
|
||||||
$status = "Deleting directory: $($itemToDelete)"
|
|
||||||
|
|
||||||
takeown /r /d $yesNo[0] /a /f "$($itemToDelete)"
|
|
||||||
icacls "$($itemToDelete)" /q /c /t /reset
|
|
||||||
icacls $itemToDelete /setowner "*S-1-5-32-544"
|
|
||||||
icacls $itemToDelete /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
|
|
||||||
Remove-Item -Force -Recurse "$($itemToDelete)"
|
|
||||||
}
|
|
||||||
elseif (Test-Path -Path "$($itemToDelete)" -PathType Leaf) {
|
|
||||||
$status = "Deleting file: $($itemToDelete)"
|
|
||||||
|
|
||||||
takeown /a /f "$($itemToDelete)"
|
|
||||||
icacls "$($itemToDelete)" /q /c /t /reset
|
|
||||||
icacls "$($itemToDelete)" /setowner "*S-1-5-32-544"
|
|
||||||
icacls "$($itemToDelete)" /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
|
|
||||||
Remove-Item -Force "$($itemToDelete)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Write-Progress -Activity "Removing Items" -Status "Ready" -Completed
|
|
||||||
}
|
|
||||||
|
|
||||||
function New-Unattend {
|
|
||||||
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory, Position = 0)] [string]$userName,
|
|
||||||
[Parameter(Position = 1)] [string]$userPassword
|
|
||||||
)
|
|
||||||
|
|
||||||
$unattend = @'
|
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<unattend xmlns="urn:schemas-microsoft-com:unattend"
|
|
||||||
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<#REPLACEME#>
|
|
||||||
<settings pass="auditUser">
|
|
||||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<RunSynchronous>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>1</Order>
|
|
||||||
<CommandLine>CMD /C echo LAU GG>C:\Windows\LogAuditUser.txt</CommandLine>
|
|
||||||
<Description>StartMenu</Description>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
</RunSynchronous>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="oobeSystem">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<UserAccounts>
|
|
||||||
<LocalAccounts>
|
|
||||||
<LocalAccount wcm:action="add">
|
|
||||||
<Name>USER-REPLACEME</Name>
|
|
||||||
<Group>Administrators</Group>
|
|
||||||
<Password>
|
|
||||||
<Value>PW-REPLACEME</Value>
|
|
||||||
<PlainText>true</PlainText>
|
|
||||||
</Password>
|
|
||||||
</LocalAccount>
|
|
||||||
</LocalAccounts>
|
|
||||||
</UserAccounts>
|
|
||||||
<AutoLogon>
|
|
||||||
<Username>USER-REPLACEME</Username>
|
|
||||||
<Enabled>true</Enabled>
|
|
||||||
<LogonCount>1</LogonCount>
|
|
||||||
<Password>
|
|
||||||
<Value>PW-REPLACEME</Value>
|
|
||||||
<PlainText>true</PlainText>
|
|
||||||
</Password>
|
|
||||||
</AutoLogon>
|
|
||||||
<OOBE>
|
|
||||||
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
|
|
||||||
<SkipUserOOBE>true</SkipUserOOBE>
|
|
||||||
<SkipMachineOOBE>true</SkipMachineOOBE>
|
|
||||||
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
|
|
||||||
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
|
|
||||||
<HideEULAPage>true</HideEULAPage>
|
|
||||||
<ProtectYourPC>3</ProtectYourPC>
|
|
||||||
</OOBE>
|
|
||||||
<FirstLogonCommands>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>1</Order>
|
|
||||||
<CommandLine>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f</CommandLine>
|
|
||||||
</SynchronousCommand>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>2</Order>
|
|
||||||
<CommandLine>cmd.exe /c echo 23>c:\windows\csup.txt</CommandLine>
|
|
||||||
</SynchronousCommand>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>3</Order>
|
|
||||||
<CommandLine>CMD /C echo GG>C:\Windows\LogOobeSystem.txt</CommandLine>
|
|
||||||
</SynchronousCommand>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<Order>4</Order>
|
|
||||||
<CommandLine>powershell -ExecutionPolicy Bypass -File c:\windows\FirstStartup.ps1</CommandLine>
|
|
||||||
</SynchronousCommand>
|
|
||||||
</FirstLogonCommands>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
</unattend>
|
|
||||||
'@
|
|
||||||
$specPass = @'
|
|
||||||
<settings pass="specialize">
|
|
||||||
<component name="Microsoft-Windows-SQMApi" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<CEIPEnabled>0</CEIPEnabled>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<ConfigureChatAutoInstall>false</ConfigureChatAutoInstall>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
|
||||||
<RunSynchronous>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>1</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>2</Order>
|
|
||||||
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>3</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "UninstallCopilot" /t REG_SZ /d "powershell.exe -NoProfile -Command \"Get-AppxPackage -Name 'Microsoft.Windows.Ai.Copilot.Provider' | Remove-AppxPackage;\"" /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>4</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>5</Order>
|
|
||||||
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>6</Order>
|
|
||||||
<Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>7</Order>
|
|
||||||
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>8</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>9</Order>
|
|
||||||
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>10</Order>
|
|
||||||
<Path>cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>11</Order>
|
|
||||||
<Path>cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>12</Order>
|
|
||||||
<Path>cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>13</Order>
|
|
||||||
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>14</Order>
|
|
||||||
<Path>reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>15</Order>
|
|
||||||
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>16</Order>
|
|
||||||
<Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>17</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>18</Order>
|
|
||||||
<Path>powershell.exe -NoProfile -Command "$xml = [xml]::new(); $xml.Load('C:\Windows\Panther\unattend.xml'); $sb = [scriptblock]::Create( $xml.unattend.Extensions.ExtractScript ); Invoke-Command -ScriptBlock $sb -ArgumentList $xml;"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>19</Order>
|
|
||||||
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-packages.ps1' -Raw | Invoke-Expression;"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>20</Order>
|
|
||||||
<Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>21</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>22</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>23</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>24</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>25</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins_LastWrite /t REG_DWORD /d 1 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>26</Order>
|
|
||||||
<Path>net.exe accounts /maxpwage:UNLIMITED</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>27</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>28</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>29</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>30</Order>
|
|
||||||
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>31</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>32</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>33</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>34</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>35</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>36</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>37</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>38</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>39</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>40</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>41</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>42</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>43</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>44</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>45</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>46</Order>
|
|
||||||
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>47</Order>
|
|
||||||
<Path>reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>48</Order>
|
|
||||||
<Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>49</Order>
|
|
||||||
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>50</Order>
|
|
||||||
<Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "ClassicContextMenu" /t REG_SZ /d "reg.exe add \"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32\" /ve /f" /f</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
<RunSynchronousCommand wcm:action="add">
|
|
||||||
<Order>51</Order>
|
|
||||||
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
|
||||||
</RunSynchronousCommand>
|
|
||||||
</RunSynchronous>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
'@
|
|
||||||
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) {
|
|
||||||
# Replace the placeholder text with an empty string to make it valid for Windows 10 Setup
|
|
||||||
$unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
|
|
||||||
} else {
|
|
||||||
# Replace the placeholder text with the Specialize pass
|
|
||||||
$unattend = $unattend.Replace("<#REPLACEME#>", $specPass).Trim()
|
|
||||||
}
|
|
||||||
# Replace default User and Password values with the provided parameters
|
|
||||||
$unattend = $unattend.Replace("USER-REPLACEME", $userName).Trim()
|
|
||||||
$unattend = $unattend.Replace("PW-REPLACEME", $userPassword).Trim()
|
|
||||||
|
|
||||||
# Save unattended answer file with UTF-8 encoding
|
|
||||||
$unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8
|
|
||||||
}
|
|
||||||
|
|
||||||
function New-CheckInstall {
|
|
||||||
|
|
||||||
# using here string to embedd firstrun
|
|
||||||
$checkInstall = @'
|
|
||||||
@echo off
|
|
||||||
if exist "%HOMEDRIVE%\windows\cpu.txt" (
|
|
||||||
echo %HOMEDRIVE%\windows\cpu.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\windows\cpu.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\windows\SerialNumber.txt" (
|
|
||||||
echo %HOMEDRIVE%\windows\SerialNumber.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\windows\SerialNumber.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\unattend.xml" (
|
|
||||||
echo %HOMEDRIVE%\unattend.xml exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\unattend.xml does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd" (
|
|
||||||
echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\Panther\unattend.xml" (
|
|
||||||
echo %HOMEDRIVE%\Windows\Panther\unattend.xml exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\Panther\unattend.xml does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml" (
|
|
||||||
echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\FirstStartup.ps1" (
|
|
||||||
echo %HOMEDRIVE%\Windows\FirstStartup.ps1 exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\FirstStartup.ps1 does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\winutil.ps1" (
|
|
||||||
echo %HOMEDRIVE%\Windows\winutil.ps1 exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\winutil.ps1 does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\LogSpecialize.txt" (
|
|
||||||
echo %HOMEDRIVE%\Windows\LogSpecialize.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\LogSpecialize.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\LogAuditUser.txt" (
|
|
||||||
echo %HOMEDRIVE%\Windows\LogAuditUser.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\LogAuditUser.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\Windows\LogOobeSystem.txt" (
|
|
||||||
echo %HOMEDRIVE%\Windows\LogOobeSystem.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\Windows\LogOobeSystem.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\windows\csup.txt" (
|
|
||||||
echo %HOMEDRIVE%\windows\csup.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\windows\csup.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "%HOMEDRIVE%\windows\LogFirstRun.txt" (
|
|
||||||
echo %HOMEDRIVE%\windows\LogFirstRun.txt exists
|
|
||||||
) else (
|
|
||||||
echo %HOMEDRIVE%\windows\LogFirstRun.txt does not exist
|
|
||||||
)
|
|
||||||
'@
|
|
||||||
$checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii
|
|
||||||
}
|
|
||||||
|
|
||||||
function New-FirstRun {
|
|
||||||
|
|
||||||
# using here string to embedd firstrun
|
|
||||||
$firstRun = @'
|
|
||||||
# Set the global error action preference to continue
|
|
||||||
$ErrorActionPreference = "Continue"
|
|
||||||
function Remove-RegistryValue {
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$RegistryPath,
|
|
||||||
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$ValueName
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if the registry path exists
|
|
||||||
if (Test-Path -Path $RegistryPath) {
|
|
||||||
$registryValue = Get-ItemProperty -Path $RegistryPath -Name $ValueName -ErrorAction SilentlyContinue
|
|
||||||
|
|
||||||
# Check if the registry value exists
|
|
||||||
if ($registryValue) {
|
|
||||||
# Remove the registry value
|
|
||||||
Remove-ItemProperty -Path $RegistryPath -Name $ValueName -Force
|
|
||||||
Write-Host "Registry value '$ValueName' removed from '$RegistryPath'."
|
|
||||||
} else {
|
|
||||||
Write-Host "Registry value '$ValueName' not found in '$RegistryPath'."
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Write-Host "Registry path '$RegistryPath' not found."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"FirstStartup has worked" | Out-File -FilePath "$env:HOMEDRIVE\windows\LogFirstRun.txt" -Append -NoClobber
|
|
||||||
|
|
||||||
$taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
|
|
||||||
# Delete all files on the Taskbar
|
|
||||||
Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force
|
|
||||||
Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesRemovedChanges"
|
|
||||||
Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesChanges"
|
|
||||||
Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "Favorites"
|
|
||||||
|
|
||||||
# Delete Edge Icon from the desktop
|
|
||||||
$edgeShortcutFiles = Get-ChildItem -Path $desktopPath -Filter "*Edge*.lnk"
|
|
||||||
# Check if Edge shortcuts exist on the desktop
|
|
||||||
if ($edgeShortcutFiles) {
|
|
||||||
foreach ($shortcutFile in $edgeShortcutFiles) {
|
|
||||||
# Remove each Edge shortcut
|
|
||||||
Remove-Item -Path $shortcutFile.FullName -Force
|
|
||||||
Write-Host "Edge shortcut '$($shortcutFile.Name)' removed from the desktop."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk"
|
|
||||||
Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk"
|
|
||||||
|
|
||||||
# ************************************************
|
|
||||||
# Create WinUtil shortcut on the desktop
|
|
||||||
#
|
|
||||||
$desktopPath = "$($env:USERPROFILE)\Desktop"
|
|
||||||
# Specify the target PowerShell command
|
|
||||||
$command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'"
|
|
||||||
# Specify the path for the shortcut
|
|
||||||
$shortcutPath = Join-Path $desktopPath 'winutil.lnk'
|
|
||||||
# Create a shell object
|
|
||||||
$shell = New-Object -ComObject WScript.Shell
|
|
||||||
|
|
||||||
# Create a shortcut object
|
|
||||||
$shortcut = $shell.CreateShortcut($shortcutPath)
|
|
||||||
|
|
||||||
if (Test-Path -Path "$env:HOMEDRIVE\Windows\cttlogo.png") {
|
|
||||||
$shortcut.IconLocation = "$env:HOMEDRIVE\Windows\cttlogo.png"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set properties of the shortcut
|
|
||||||
$shortcut.TargetPath = "powershell.exe"
|
|
||||||
$shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`""
|
|
||||||
# Save the shortcut
|
|
||||||
$shortcut.Save()
|
|
||||||
|
|
||||||
# Make the shortcut have 'Run as administrator' property on
|
|
||||||
$bytes = [System.IO.File]::ReadAllBytes($shortcutPath)
|
|
||||||
# Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex
|
|
||||||
$bytes[0x15] = $bytes[0x15] -bor 0x20
|
|
||||||
[System.IO.File]::WriteAllBytes($shortcutPath, $bytes)
|
|
||||||
|
|
||||||
Write-Host "Shortcut created at: $shortcutPath"
|
|
||||||
#
|
|
||||||
# Done create WinUtil shortcut on the desktop
|
|
||||||
# ************************************************
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
187
functions/private/Invoke-WinUtilUninstallPSProfile.ps1
Normal file
187
functions/private/Invoke-WinUtilUninstallPSProfile.ps1
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
function Invoke-WinUtilUninstallPSProfile {
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
# Uninstalls the CTT PowerShell profile then restores the original profile.
|
||||||
|
#>
|
||||||
|
|
||||||
|
Invoke-WPFRunspace -ArgumentList $PROFILE -DebugPreference $DebugPreference -ScriptBlock {
|
||||||
|
# Remap the automatic built-in $PROFILE variable to the parameter named $PSProfile.
|
||||||
|
param ($PSProfile)
|
||||||
|
|
||||||
|
# Helper function used to uninstall a specific Nerd Fonts font package.
|
||||||
|
function Uninstall-NerdFonts {
|
||||||
|
# Define the parameters block for the Uninstall-NerdFonts function.
|
||||||
|
param (
|
||||||
|
[string]$FontsPath = "$env:LOCALAPPDATA\Microsoft\Windows\Fonts",
|
||||||
|
[string]$FontFamilyName = "CaskaydiaCoveNerdFont"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Get the list of installed fonts as specified by the FontFamilyName parameter.
|
||||||
|
$Fonts = Get-ChildItem $FontsPath -Recurse -Filter "*.ttf" | Where-Object { $_.Name -match $FontFamilyName }
|
||||||
|
|
||||||
|
# Check if the specified fonts are currently installed on the system.
|
||||||
|
if ($Fonts) {
|
||||||
|
# Let the user know that the Nerd Fonts are currently being uninstalled.
|
||||||
|
Write-Host "===> Uninstalling: Nerd Fonts... <===" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Loop over the font files and remove each installed font file one-by-one.
|
||||||
|
$Fonts | ForEach-Object {
|
||||||
|
# Check if the font file exists on the disk before attempting to remove it.
|
||||||
|
if (Test-Path "$($_.FullName)") {
|
||||||
|
# Remove the found font files from the disk; uninstalling the font.
|
||||||
|
Remove-Item "$($_.FullName)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Let the user know that the Nerd Fonts package has been uninstalled from the system.
|
||||||
|
if (-not $Fonts) {
|
||||||
|
Write-Host "===> Successfully Uninstalled: Nerd Fonts. <===" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if Chris Titus Tech's PowerShell profile is currently available in the PowerShell profile folder.
|
||||||
|
if (Test-Path $PSProfile -PathType Leaf) {
|
||||||
|
# Set the GitHub repo path used for looking up the name of Chris Titus Tech's powershell-profile repo.
|
||||||
|
$GitHubRepoPath = "ChrisTitusTech/powershell-profile"
|
||||||
|
|
||||||
|
# Get the unique identifier used to test for the presence of Chris Titus Tech's PowerShell profile.
|
||||||
|
$PSProfileIdentifier = (Invoke-RestMethod "https://api.github.com/repos/$GitHubRepoPath").full_name
|
||||||
|
|
||||||
|
# Check if Chris Titus Tech's PowerShell profile is currently installed in the PowerShell profile folder.
|
||||||
|
if ((Get-Content $PSProfile) -match $PSProfileIdentifier) {
|
||||||
|
# Attempt to uninstall Chris Titus Tech's PowerShell profile from the PowerShell profile folder.
|
||||||
|
try {
|
||||||
|
# Get the content of the backup PowerShell profile and store it in-memory.
|
||||||
|
$PSProfileContent = Get-Content "$PSProfile.bak"
|
||||||
|
|
||||||
|
# Store the flag used to check if OhMyPosh is in use by the backup PowerShell profile.
|
||||||
|
$OhMyPoshInUse = $PSProfileContent -match "oh-my-posh init"
|
||||||
|
|
||||||
|
# Check if OhMyPosh is not currently in use by the backup PowerShell profile.
|
||||||
|
if (-not $OhMyPoshInUse) {
|
||||||
|
# If OhMyPosh is currently installed attempt to uninstall it from the system.
|
||||||
|
if (Get-Command oh-my-posh -ErrorAction SilentlyContinue) {
|
||||||
|
# Let the user know that OhMyPosh is currently being uninstalled from their system.
|
||||||
|
Write-Host "===> Uninstalling: OhMyPosh... <===" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Attempt to uninstall OhMyPosh from the system with the WinGet package manager.
|
||||||
|
winget uninstall -e --id JanDeDobbeleer.OhMyPosh
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Let the user know that the uninstallation of OhMyPosh has been skipped because it is in use.
|
||||||
|
Write-Host "===> Skipped Uninstall: OhMyPosh In-Use. <===" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# Let the user know that an error was encountered when uninstalling OhMyPosh.
|
||||||
|
Write-Host "Failed to uninstall OhMyPosh. Error: $_" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to uninstall the specified Nerd Fonts package from the system.
|
||||||
|
try {
|
||||||
|
# Specify the directory that the specified font package will be uninstalled from.
|
||||||
|
[string]$FontsPath = "$env:LOCALAPPDATA\Microsoft\Windows\Fonts"
|
||||||
|
|
||||||
|
# Specify the name of the font package that is to be uninstalled from the system.
|
||||||
|
[string]$FontFamilyName = "CaskaydiaCoveNerdFont"
|
||||||
|
|
||||||
|
# Call the function used to uninstall the specified Nerd Fonts package from the system.
|
||||||
|
Uninstall-NerdFonts -FontsPath $FontsPath -FontFamilyName $FontFamilyName
|
||||||
|
} catch {
|
||||||
|
# Let the user know that an error was encountered when uninstalling Nerd Fonts.
|
||||||
|
Write-Host "Failed to uninstall Nerd Fonts. Error: $_" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to uninstall the Terminal-Icons PowerShell module from the system.
|
||||||
|
try {
|
||||||
|
# Get the content of the backup PowerShell profile and store it in-memory.
|
||||||
|
$PSProfileContent = Get-Content "$PSProfile.bak"
|
||||||
|
|
||||||
|
# Store the flag used to check if Terminal-Icons is in use by the backup PowerShell profile.
|
||||||
|
$TerminalIconsInUse = $PSProfileContent -match "Import-Module" -and $PSProfileContent -match "Terminal-Icons"
|
||||||
|
|
||||||
|
# Check if Terminal-Icons is not currently in use by the backup PowerShell profile.
|
||||||
|
if (-not $TerminalIconsInUse) {
|
||||||
|
# If Terminal-Icons is currently installed attempt to uninstall it from the system.
|
||||||
|
if (Get-Module -ListAvailable Terminal-Icons) {
|
||||||
|
# Let the user know that Terminal-Icons is currently being uninstalled from their system.
|
||||||
|
Write-Host "===> Uninstalling: Terminal-Icons... <===" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Attempt to uninstall Terminal-Icons from the system with Uninstall-Module.
|
||||||
|
Uninstall-Module -Name Terminal-Icons
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Let the user know that the uninstallation of Terminal-Icons has been skipped because it is in use.
|
||||||
|
Write-Host "===> Skipped Uninstall: Terminal-Icons In-Use. <===" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# Let the user know that an error was encountered when uninstalling Terminal-Icons.
|
||||||
|
Write-Host "Failed to uninstall Terminal-Icons. Error: $_" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to uninstall the Zoxide application from the system.
|
||||||
|
try {
|
||||||
|
# Get the content of the backup PowerShell profile and store it in-memory.
|
||||||
|
$PSProfileContent = Get-Content "$PSProfile.bak"
|
||||||
|
|
||||||
|
# Store the flag used to check if Zoxide is in use by the backup PowerShell profile.
|
||||||
|
$ZoxideInUse = $PSProfileContent -match "zoxide init"
|
||||||
|
|
||||||
|
# Check if Zoxide is not currently in use by the backup PowerShell profile.
|
||||||
|
if (-not $ZoxideInUse) {
|
||||||
|
# If Zoxide is currently installed attempt to uninstall it from the system.
|
||||||
|
if (Get-Command zoxide -ErrorAction SilentlyContinue) {
|
||||||
|
# Let the user know that Zoxide is currently being uninstalled from their system.
|
||||||
|
Write-Host "===> Uninstalling: Zoxide... <===" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Attempt to uninstall Zoxide from the system with the WinGet package manager.
|
||||||
|
winget uninstall -e --id ajeetdsouza.zoxide
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Let the user know that the uninstallation of Zoxide been skipped because it is in use.
|
||||||
|
Write-Host "===> Skipped Uninstall: Zoxide In-Use. <===" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# Let the user know that an error was encountered when uninstalling Zoxide.
|
||||||
|
Write-Host "Failed to uninstall Zoxide. Error: $_" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to uninstall the CTT PowerShell profile from the system.
|
||||||
|
try {
|
||||||
|
# Try and remove the CTT PowerShell Profile file from the disk with Remove-Item.
|
||||||
|
Remove-Item $PSProfile
|
||||||
|
|
||||||
|
# Let the user know that the CTT PowerShell profile has been uninstalled from the system.
|
||||||
|
Write-Host "Profile has been uninstalled. Please restart your shell to reflect the changes!" -ForegroundColor Magenta
|
||||||
|
} catch {
|
||||||
|
# Let the user know that an error was encountered when uninstalling the profile.
|
||||||
|
Write-Host "Failed to uninstall profile. Error: $_" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Attempt to move the user's original PowerShell profile backup back to its original location.
|
||||||
|
try {
|
||||||
|
# Check if the backup PowerShell profile exists before attempting to restore the backup.
|
||||||
|
if (Test-Path "$PSProfile.bak") {
|
||||||
|
# Restore the backup PowerShell profile and move it to its original location.
|
||||||
|
Move-Item "$PSProfile.bak" $PSProfile
|
||||||
|
|
||||||
|
# Let the user know that their PowerShell profile backup has been successfully restored.
|
||||||
|
Write-Host "===> Restored Profile Backup. <===" -ForegroundColor Yellow
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# Let the user know that an error was encountered when restoring the profile backup.
|
||||||
|
Write-Host "Failed to restore profile backup. Error: $_" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
|
||||||
|
# Silently cleanup the oldprofile.ps1 file that was created when the CTT PowerShell profile was installed.
|
||||||
|
Remove-Item "$env:USERPROFILE\oldprofile.ps1" | Out-Null
|
||||||
|
} else {
|
||||||
|
# Let the user know that the CTT PowerShell profile is not installed and that the uninstallation was skipped.
|
||||||
|
Write-Host "===> Chris Titus Tech's PowerShell Profile Not Found. Skipped Uninstallation. <===" -ForegroundColor Magenta
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Let the user know that no PowerShell profile was found and that the uninstallation was skipped.
|
||||||
|
Write-Host "===> No PowerShell Profile Found. Skipped Uninstallation. <===" -ForegroundColor Magenta
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,11 +35,12 @@ function Set-WinUtilRegistry {
|
|||||||
New-Item -Path $Path -Force -ErrorAction Stop | Out-Null
|
New-Item -Path $Path -Force -ErrorAction Stop | Out-Null
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Set $Path\$Name to $Value"
|
|
||||||
if ($Value -ne "<RemoveEntry>") {
|
if ($Value -ne "<RemoveEntry>") {
|
||||||
|
Write-Host "Set $Path\$Name to $Value"
|
||||||
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{
|
||||||
|
Write-Host "Remove $Path\$Name"
|
||||||
Remove-ItemProperty -Path $Path -Name $Name -Force -ErrorAction Stop | Out-Null
|
Remove-ItemProperty -Path $Path -Name $Name -Force -ErrorAction Stop | Out-Null
|
||||||
}
|
}
|
||||||
} catch [System.Security.SecurityException] {
|
} catch [System.Security.SecurityException] {
|
||||||
|
@ -54,11 +54,12 @@ function Invoke-WPFButton {
|
|||||||
"WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil" -RunAsAdmin $true}
|
"WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil" -RunAsAdmin $true}
|
||||||
"WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"}
|
"WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"}
|
||||||
"WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"}
|
"WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"}
|
||||||
"WPFGetIso" {Invoke-WPFGetIso}
|
"WPFGetIso" {Invoke-MicrowinGetIso}
|
||||||
"WPFMicrowin" {Invoke-WPFMicrowin}
|
"WPFMicrowin" {Invoke-Microwin}
|
||||||
"WPFCloseButton" {Invoke-WPFCloseButton}
|
"WPFCloseButton" {Invoke-WPFCloseButton}
|
||||||
"MicrowinScratchDirBT" {Invoke-ScratchDialog}
|
"MicrowinScratchDirBT" {Invoke-ScratchDialog}
|
||||||
"WPFWinUtilPSProfile" {Invoke-WinUtilpsProfile}
|
"WPFWinUtilInstallPSProfile" {Invoke-WinUtilInstallPSProfile}
|
||||||
|
"WPFWinUtilUninstallPSProfile" {Invoke-WinUtilUninstallPSProfile}
|
||||||
"WPFWinUtilSSHServer" {Invoke-WinUtilSSHServer}
|
"WPFWinUtilSSHServer" {Invoke-WinUtilSSHServer}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
function Invoke-WPFShortcut {
|
|
||||||
<#
|
|
||||||
|
|
||||||
.SYNOPSIS
|
|
||||||
Creates a shortcut and prompts for a save location
|
|
||||||
|
|
||||||
.PARAMETER ShortcutToAdd
|
|
||||||
The name of the shortcut to add
|
|
||||||
|
|
||||||
.PARAMETER RunAsAdmin
|
|
||||||
A boolean value to make 'Run as administrator' property on (true) or off (false), defaults to off
|
|
||||||
|
|
||||||
#>
|
|
||||||
param(
|
|
||||||
$ShortcutToAdd,
|
|
||||||
[bool]$RunAsAdmin = $false
|
|
||||||
)
|
|
||||||
|
|
||||||
# Preper the Shortcut Fields and add an a Custom Icon if it's available, else don't add a Custom Icon.
|
|
||||||
|
|
||||||
Switch ($ShortcutToAdd) {
|
|
||||||
"WinUtil" {
|
|
||||||
# Use Powershell 7 if installed and fallback to PS5 if not
|
|
||||||
if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
|
|
||||||
$shell = "pwsh.exe"
|
|
||||||
} else {
|
|
||||||
$shell = "powershell.exe"
|
|
||||||
}
|
|
||||||
|
|
||||||
$shellArgs = "-ExecutionPolicy Bypass -Command `"Start-Process $shell -verb runas -ArgumentList `'-Command `"irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1 | iex`"`'"
|
|
||||||
|
|
||||||
$DestinationName = "WinUtil.lnk"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Show a File Dialog Browser, to let the User choose the Name and Location of where to save the Shortcut
|
|
||||||
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
|
|
||||||
$FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
|
|
||||||
$FileBrowser.Filter = "Shortcut Files (*.lnk)|*.lnk"
|
|
||||||
$FileBrowser.FileName = $DestinationName
|
|
||||||
|
|
||||||
# Do an Early Return if the Save Operation was canceled by User's Input.
|
|
||||||
$FileBrowserResult = $FileBrowser.ShowDialog()
|
|
||||||
$DialogResultEnum = New-Object System.Windows.Forms.DialogResult
|
|
||||||
if (-not ($FileBrowserResult -eq $DialogResultEnum::OK)) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
# Prepare the Shortcut paramter
|
|
||||||
$WshShell = New-Object -comObject WScript.Shell
|
|
||||||
$Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName)
|
|
||||||
$Shortcut.TargetPath = $shell
|
|
||||||
$Shortcut.Arguments = $shellArgs
|
|
||||||
if (-NOT (Test-Path -Path $winutildir["logo.ico"])) {
|
|
||||||
Invoke-WebRequest -Uri "https://christitus.com/images/logo-full.ico" -OutFile $winutildir["logo.ico"]
|
|
||||||
}
|
|
||||||
if (Test-Path -Path $winutildir["logo.ico"]) {
|
|
||||||
$shortcut.IconLocation = $winutildir["logo.ico"]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Save the Shortcut to disk
|
|
||||||
$Shortcut.Save()
|
|
||||||
|
|
||||||
if ($RunAsAdmin -eq $true) {
|
|
||||||
$bytes = [System.IO.File]::ReadAllBytes($FileBrowser.FileName)
|
|
||||||
# Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex
|
|
||||||
$bytes[0x15] = $bytes[0x15] -bor 0x20
|
|
||||||
[System.IO.File]::WriteAllBytes($FileBrowser.FileName, $bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName) with 'Run as administrator' set to $RunAsAdmin"
|
|
||||||
}
|
|
@ -42,4 +42,24 @@ function Invoke-WPFUpdatesdefault {
|
|||||||
Write-Host "==================================================="
|
Write-Host "==================================================="
|
||||||
Write-Host "--- Windows Update Settings Reset to Default ---"
|
Write-Host "--- Windows Update Settings Reset to Default ---"
|
||||||
Write-Host "==================================================="
|
Write-Host "==================================================="
|
||||||
|
|
||||||
|
Start-Process -FilePath "secedit" -ArgumentList "/configure /cfg $env:windir\inf\defltbase.inf /db defltbase.sdb /verbose" -Wait
|
||||||
|
Start-Process -FilePath "cmd.exe" -ArgumentList "/c RD /S /Q $env:WinDir\System32\GroupPolicyUsers" -Wait
|
||||||
|
Start-Process -FilePath "cmd.exe" -ArgumentList "/c RD /S /Q $env:WinDir\System32\GroupPolicy" -Wait
|
||||||
|
Start-Process -FilePath "gpupdate" -ArgumentList "/force" -Wait
|
||||||
|
Remove-Item -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKCU:\Software\Microsoft\WindowsSelfHost" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKCU:\Software\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\Microsoft\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\Microsoft\WindowsSelfHost" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\WOW6432Node\Microsoft\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Policies" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -Path "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\WindowsStore\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
Write-Host "==================================================="
|
||||||
|
Write-Host "--- Windows Local Policies Reset to Default ---"
|
||||||
|
Write-Host "==================================================="
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
{{ super() }}
|
{{ super() }}
|
||||||
<div style="color: red; text-align: center; padding: 10px; font-size: 20px;">
|
<div style="color: red; text-align: center; padding: 10px; font-size: 20px;">
|
||||||
<strong>Announcement:</strong> We are currently not adding any applications to WinUtil and any apps that will be added through a PR will be declined by the maintainer.
|
<strong>Announcement:</strong> We are currently not adding any applications to WinUtil and any apps that will be added through a PR will be declined by the maintainer.
|
||||||
|
<strong>Announcement:</strong> We are currently reworking the docs to use Hugo rather then mkdocs.
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionSta
|
|||||||
$InitialSessionState.Variables.Add($hashVars)
|
$InitialSessionState.Variables.Add($hashVars)
|
||||||
|
|
||||||
# Get every private function and add them to the session state
|
# Get every private function and add them to the session state
|
||||||
$functions = (Get-ChildItem function:\).where{$_.name -like "*winutil*" -or $_.name -like "*WPF*"}
|
$functions = Get-ChildItem function:\ | Where-Object { $_.Name -imatch 'winutil|Microwin|WPF' }
|
||||||
foreach ($function in $functions) {
|
foreach ($function in $functions) {
|
||||||
$functionDefinition = Get-Content function:\$($function.name)
|
$functionDefinition = Get-Content function:\$($function.name)
|
||||||
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
|
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
|
||||||
@ -464,7 +464,7 @@ $sync["ISOmanual"].add_Checked({
|
|||||||
$sync["ISORelease"].Items.Add("24H2") | Out-Null
|
$sync["ISORelease"].Items.Add("24H2") | Out-Null
|
||||||
$sync["ISORelease"].SelectedItem = "24H2"
|
$sync["ISORelease"].SelectedItem = "24H2"
|
||||||
|
|
||||||
$sync["ISOLanguage"].Items.Add("System Language ($(Get-FidoLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
|
$sync["ISOLanguage"].Items.Add("System Language ($(Microwin-GetLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
|
||||||
if ($currentCulture -ne "English International") {
|
if ($currentCulture -ne "English International") {
|
||||||
$sync["ISOLanguage"].Items.Add("English International") | Out-Null
|
$sync["ISOLanguage"].Items.Add("English International") | Out-Null
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ function RedirectToLatestPreRelease {
|
|||||||
if ($latestRelease) {
|
if ($latestRelease) {
|
||||||
$url = "https://github.com/ChrisTitusTech/winutil/releases/download/$latestRelease/winutil.ps1"
|
$url = "https://github.com/ChrisTitusTech/winutil/releases/download/$latestRelease/winutil.ps1"
|
||||||
} else {
|
} else {
|
||||||
Write-Host 'Unable to determine latest pre-release version.' -ForegroundColor Red
|
Write-Host 'No pre-release version found. This is most likely because the latest release is a full release and no newer pre-release exists.' -ForegroundColor Yellow
|
||||||
Write-Host "Using latest Full Release"
|
Write-Host "Using latest Full Release"
|
||||||
$url = "https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1"
|
$url = "https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1"
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user