mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2025-07-04 12:13:51 -05:00
Compare commits
28 Commits
24.10.01
...
28e74856a4
Author | SHA1 | Date | |
---|---|---|---|
28e74856a4 | |||
3cdb761537 | |||
b382f16ae8 | |||
171441ddcf | |||
7a0c40420e | |||
0f0d9d0ae3 | |||
6149738e6c | |||
aa0b03feda | |||
e0889d51db | |||
ce1ef2a519 | |||
77cb0a14c4 | |||
c254a43f77 | |||
640d2ca107 | |||
c186642998 | |||
47a4f1547e | |||
1caf3111d3 | |||
7dcdc4dbb7 | |||
bfaba14191 | |||
5640f9d04c | |||
c6a832b006 | |||
fe19094395 | |||
fdd32f441f | |||
e4565f1f6f | |||
1404efab26 | |||
1deb863f40 | |||
de73efa868 | |||
59097fc7e1 | |||
207ce43428 |
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'
|
||||||
|
@ -445,7 +445,7 @@
|
|||||||
"category": "Utilities",
|
"category": "Utilities",
|
||||||
"content": "Dual Monitor Tools",
|
"content": "Dual Monitor Tools",
|
||||||
"link": "https://dualmonitortool.sourceforge.net/",
|
"link": "https://dualmonitortool.sourceforge.net/",
|
||||||
"description": "Dual Monitor Tools (DMT) is a FOSS app that customize handling multiple monitors and even lock the mouse on specific monitor. Useful for full screen games and apps that does not handle well a second monitor or helps the workflow."
|
"description": "Dual Monitor Tools (DMT) is a FOSS app that allows you to customize the handling of multiple monitors. Useful for fullscreen games and apps that handle a second monitor poorly and can improve your workflow."
|
||||||
},
|
},
|
||||||
"duplicati": {
|
"duplicati": {
|
||||||
"category": "Utilities",
|
"category": "Utilities",
|
||||||
|
@ -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,7 +306,7 @@
|
|||||||
"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",
|
||||||
@ -314,6 +314,14 @@
|
|||||||
"Type": "Button",
|
"Type": "Button",
|
||||||
"ButtonWidth": "300"
|
"ButtonWidth": "300"
|
||||||
},
|
},
|
||||||
|
"WPFWinUtilUninstallPSProfile": {
|
||||||
|
"Content": "Uninstall CTT PowerShell Profile",
|
||||||
|
"category": "Powershell Profile",
|
||||||
|
"panel": "2",
|
||||||
|
"Order": "a084_",
|
||||||
|
"Type": "Button",
|
||||||
|
"ButtonWidth": "300"
|
||||||
|
},
|
||||||
"WPFWinUtilSSHServer": {
|
"WPFWinUtilSSHServer": {
|
||||||
"Content": "Enable OpenSSH Server",
|
"Content": "Enable OpenSSH Server",
|
||||||
"category": "Remote Access",
|
"category": "Remote Access",
|
||||||
@ -321,5 +329,5 @@
|
|||||||
"Order": "a084_",
|
"Order": "a084_",
|
||||||
"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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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...
|
||||||
@ -51,10 +51,6 @@ public class PowerManagement {
|
|||||||
$index = $sync.MicrowinWindowsFlavors.SelectedValue.Split(":")[0].Trim()
|
$index = $sync.MicrowinWindowsFlavors.SelectedValue.Split(":")[0].Trim()
|
||||||
Write-Host "Index chosen: '$index' from $($sync.MicrowinWindowsFlavors.SelectedValue)"
|
Write-Host "Index chosen: '$index' from $($sync.MicrowinWindowsFlavors.SelectedValue)"
|
||||||
|
|
||||||
$keepPackages = $sync.WPFMicrowinKeepProvisionedPackages.IsChecked
|
|
||||||
$keepProvisionedPackages = $sync.WPFMicrowinKeepAppxPackages.IsChecked
|
|
||||||
$keepDefender = $sync.WPFMicrowinKeepDefender.IsChecked
|
|
||||||
$keepEdge = $sync.WPFMicrowinKeepEdge.IsChecked
|
|
||||||
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
|
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
|
||||||
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
|
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
|
||||||
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
|
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
|
||||||
@ -82,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
|
||||||
@ -91,6 +87,14 @@ public class PowerManagement {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Detect whether the image to process contains Windows 10 and show warning
|
||||||
|
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."
|
||||||
|
$dlg_msg = $msg
|
||||||
|
Write-Host $msg
|
||||||
|
[System.Windows.MessageBox]::Show($dlg_msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Exclamation)
|
||||||
|
}
|
||||||
|
|
||||||
$mountDirExists = Test-Path $mountDir
|
$mountDirExists = Test-Path $mountDir
|
||||||
$scratchDirExists = Test-Path $scratchDir
|
$scratchDirExists = Test-Path $scratchDir
|
||||||
if (-not $mountDirExists -or -not $scratchDirExists) {
|
if (-not $mountDirExists -or -not $scratchDirExists) {
|
||||||
@ -151,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"
|
||||||
@ -204,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
|
||||||
@ -216,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"
|
||||||
|
|
||||||
@ -238,6 +264,9 @@ public class PowerManagement {
|
|||||||
# Write-Host Error code $LASTEXITCODE
|
# Write-Host Error code $LASTEXITCODE
|
||||||
Write-Host "Done disabling Teams"
|
Write-Host "Done disabling Teams"
|
||||||
|
|
||||||
|
Write-Host "Fix Windows Volume Mixer Issue"
|
||||||
|
reg add "HKLM\zNTUSER\Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore" /f
|
||||||
|
|
||||||
Write-Host "Bypassing system requirements (system image)"
|
Write-Host "Bypassing system requirements (system image)"
|
||||||
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
|
||||||
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
|
||||||
@ -289,6 +318,19 @@ public class PowerManagement {
|
|||||||
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "AppsUseLightTheme" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "AppsUseLightTheme" /t REG_DWORD /d 0 /f
|
||||||
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "SystemUsesLightTheme" /t REG_DWORD /d 0 /f
|
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "SystemUsesLightTheme" /t REG_DWORD /d 0 /f
|
||||||
|
|
||||||
|
if ((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,
|
||||||
|
# it doesn't seem to work, and I don't want to waste more time dealing with an operating system that will lose support in a year (2025)
|
||||||
|
|
||||||
|
# I invite anyone to work on improving stuff for News and Interests, but that won't be me!
|
||||||
|
|
||||||
|
Write-Host "Disabling Search Highlights..."
|
||||||
|
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Feeds\DSB" /v "ShowDynamicContent" /t REG_DWORD /d 0 /f
|
||||||
|
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\SearchSettings" /v "IsDynamicSearchBoxEnabled" /t REG_DWORD /d 0 /f
|
||||||
|
reg add "HKLM\zSOFTWARE\Policies\Microsoft\Dsh" /v "AllowNewsAndInterests" /t REG_DWORD /d 0 /f
|
||||||
|
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "TraySearchBoxVisible" /t REG_DWORD /d 1 /f
|
||||||
|
}
|
||||||
|
|
||||||
} catch {
|
} catch {
|
||||||
Write-Error "An unexpected error occurred: $_"
|
Write-Error "An unexpected error occurred: $_"
|
||||||
} finally {
|
} finally {
|
||||||
@ -388,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
|
||||||
|
}
|
@ -1,315 +1,4 @@
|
|||||||
function Test-CompatibleImage() {
|
function Microwin-NewUnattend {
|
||||||
<#
|
|
||||||
.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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
$_.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*"
|
|
||||||
}
|
|
||||||
|
|
||||||
$failedCount = 0
|
|
||||||
|
|
||||||
foreach ($pkg in $pkglist) {
|
|
||||||
try {
|
|
||||||
$status = "Removing $pkg"
|
|
||||||
Write-Progress -Activity "Removing Apps" -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, like FodMetadata
|
|
||||||
Write-Host "Could not remove OS package $($pkg)"
|
|
||||||
$failedCount += 1
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed
|
|
||||||
if ($failedCount -gt 0)
|
|
||||||
{
|
|
||||||
Write-Host "Some packages could not be removed. Do not worry: your image will still work fine. This can happen if the package is permanent or has been superseded by a newer one."
|
|
||||||
}
|
|
||||||
} 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 "*dism*" -and
|
|
||||||
$_.PackageName -NotLike "*Foundation*" -and
|
|
||||||
$_.PackageName -NotLike "*FodMetadata*" -and
|
|
||||||
$_.PackageName -NotLike "*LanguageFeatures*" -and
|
|
||||||
$_.PackageName -NotLike "*Notepad*" -and
|
|
||||||
$_.PackageName -NotLike "*Printing*" -and
|
|
||||||
$_.PackageName -NotLike "*Foundation*" -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 (
|
param (
|
||||||
[Parameter(Mandatory, Position = 0)] [string]$userName,
|
[Parameter(Mandatory, Position = 0)] [string]$userName,
|
||||||
@ -471,7 +160,7 @@ function New-Unattend {
|
|||||||
</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>
|
||||||
@ -605,7 +294,7 @@ function New-Unattend {
|
|||||||
</component>
|
</component>
|
||||||
</settings>
|
</settings>
|
||||||
'@
|
'@
|
||||||
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) {
|
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
|
# Replace the placeholder text with an empty string to make it valid for Windows 10 Setup
|
||||||
$unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
|
$unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
|
||||||
} else {
|
} else {
|
||||||
@ -619,172 +308,3 @@ function New-Unattend {
|
|||||||
# Save unattended answer file with UTF-8 encoding
|
# Save unattended answer file with UTF-8 encoding
|
||||||
$unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8
|
$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 "C:\windows\cpu.txt" (
|
|
||||||
echo C:\windows\cpu.txt exists
|
|
||||||
) else (
|
|
||||||
echo C:\windows\cpu.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\windows\SerialNumber.txt" (
|
|
||||||
echo C:\windows\SerialNumber.txt exists
|
|
||||||
) else (
|
|
||||||
echo C:\windows\SerialNumber.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\unattend.xml" (
|
|
||||||
echo C:\unattend.xml exists
|
|
||||||
) else (
|
|
||||||
echo C:\unattend.xml does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\Setup\Scripts\SetupComplete.cmd" (
|
|
||||||
echo C:\Windows\Setup\Scripts\SetupComplete.cmd exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\Setup\Scripts\SetupComplete.cmd does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\Panther\unattend.xml" (
|
|
||||||
echo C:\Windows\Panther\unattend.xml exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\Panther\unattend.xml does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\System32\Sysprep\unattend.xml" (
|
|
||||||
echo C:\Windows\System32\Sysprep\unattend.xml exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\System32\Sysprep\unattend.xml does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\FirstStartup.ps1" (
|
|
||||||
echo C:\Windows\FirstStartup.ps1 exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\FirstStartup.ps1 does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\winutil.ps1" (
|
|
||||||
echo C:\Windows\winutil.ps1 exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\winutil.ps1 does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\LogSpecialize.txt" (
|
|
||||||
echo C:\Windows\LogSpecialize.txt exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\LogSpecialize.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\LogAuditUser.txt" (
|
|
||||||
echo C:\Windows\LogAuditUser.txt exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\LogAuditUser.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "C:\Windows\LogOobeSystem.txt" (
|
|
||||||
echo C:\Windows\LogOobeSystem.txt exists
|
|
||||||
) else (
|
|
||||||
echo C:\Windows\LogOobeSystem.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "c:\windows\csup.txt" (
|
|
||||||
echo c:\windows\csup.txt exists
|
|
||||||
) else (
|
|
||||||
echo c:\windows\csup.txt does not exist
|
|
||||||
)
|
|
||||||
if exist "c:\windows\LogFirstRun.txt" (
|
|
||||||
echo c:\windows\LogFirstRun.txt exists
|
|
||||||
) else (
|
|
||||||
echo c:\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 c:\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 "C:\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 "c:\Windows\cttlogo.png") {
|
|
||||||
$shortcut.IconLocation = "c:\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
|
|
||||||
# ************************************************
|
|
||||||
|
|
||||||
Start-Process explorer
|
|
||||||
|
|
||||||
'@
|
|
||||||
$firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
|
|
||||||
}
|
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -19,10 +19,10 @@ function Copy-Files {
|
|||||||
try {
|
try {
|
||||||
|
|
||||||
$files = Get-ChildItem -Path $path -Recurse:$recurse
|
$files = Get-ChildItem -Path $path -Recurse:$recurse
|
||||||
Write-Host "Copy $($files.Count)(s) from $path to $destination"
|
Write-Host "Copy $($files.Count) file(s) from $path to $destination"
|
||||||
|
|
||||||
foreach ($file in $files) {
|
foreach ($file in $files) {
|
||||||
$status = "Copy files {0} on {1}: {2}" -f $counter, $files.Count, $file.Name
|
$status = "Copying file {0} of {1}: {2}" -f $counter, $files.Count, $file.Name
|
||||||
Write-Progress -Activity "Copy Windows files" -Status $status -PercentComplete ($counter++/$files.count*100)
|
Write-Progress -Activity "Copy Windows files" -Status $status -PercentComplete ($counter++/$files.count*100)
|
||||||
$restpath = $file.FullName -Replace $path, ''
|
$restpath = $file.FullName -Replace $path, ''
|
||||||
|
|
||||||
@ -37,7 +37,11 @@ function Copy-Files {
|
|||||||
}
|
}
|
||||||
Write-Progress -Activity "Copy Windows files" -Status "Ready" -Completed
|
Write-Progress -Activity "Copy Windows files" -Status "Ready" -Completed
|
||||||
} catch {
|
} catch {
|
||||||
Write-Warning "Unable to Copy all the files due to unhandled exception"
|
Write-Host "Unable to Copy all the files due to an unhandled exception" -ForegroundColor Yellow
|
||||||
Write-Warning $psitem.Exception.StackTrace
|
Write-Host "Error information: $($_.Exception.Message)`n" -ForegroundColor Yellow
|
||||||
|
Write-Host "Additional information:" -ForegroundColor Yellow
|
||||||
|
Write-Host $PSItem.Exception.StackTrace
|
||||||
|
# Write possible suggestions
|
||||||
|
Write-Host "`nIf you are using an antivirus, try configuring exclusions"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
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] {
|
||||||
|
@ -50,14 +50,14 @@ function Invoke-WPFButton {
|
|||||||
"WPFFixesNetwork" {Invoke-WPFFixesNetwork}
|
"WPFFixesNetwork" {Invoke-WPFFixesNetwork}
|
||||||
"WPFUpdatesdisable" {Invoke-WPFUpdatesdisable}
|
"WPFUpdatesdisable" {Invoke-WPFUpdatesdisable}
|
||||||
"WPFUpdatessecurity" {Invoke-WPFUpdatessecurity}
|
"WPFUpdatessecurity" {Invoke-WPFUpdatessecurity}
|
||||||
"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
|
||||||
@ -410,12 +410,10 @@ $sync["ISOmanual"].add_Checked({
|
|||||||
$sync["ISOLanguage"].Visibility = [System.Windows.Visibility]::Collapsed
|
$sync["ISOLanguage"].Visibility = [System.Windows.Visibility]::Collapsed
|
||||||
})
|
})
|
||||||
|
|
||||||
$sync["ISORelease"].Items.Add("23H2") | Out-Null
|
$sync["ISORelease"].Items.Add("24H2") | Out-Null
|
||||||
$sync["ISORelease"].Items.Add("22H2") | Out-Null
|
$sync["ISORelease"].SelectedItem = "24H2"
|
||||||
$sync["ISORelease"].Items.Add("21H2") | Out-Null
|
|
||||||
$sync["ISORelease"].SelectedItem = "23H2"
|
|
||||||
|
|
||||||
$sync["ISOLanguage"].Items.Add("System Language ($(Get-FidoLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
|
$sync["ISOLanguage"].Items.Add("System Language ($(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"
|
||||||
}
|
}
|
||||||
|
@ -1040,7 +1040,7 @@
|
|||||||
HorizontalAlignment="Stretch">
|
HorizontalAlignment="Stretch">
|
||||||
<StackPanel Name="MicrowinMain" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Column="0" Grid.Row="0">
|
<StackPanel Name="MicrowinMain" Background="{DynamicResource MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Column="0" Grid.Row="0">
|
||||||
<StackPanel Background="Transparent" SnapsToDevicePixels="True" Margin="1">
|
<StackPanel Background="Transparent" SnapsToDevicePixels="True" Margin="1">
|
||||||
<CheckBox x:Name="WPFMicrowinDownloadFromGitHub" Content="Download oscdimg.exe from CTT Github repo" IsChecked="False" Margin="{DynamicResource MicrowinCheckBoxMargin}" />
|
<CheckBox x:Name="WPFMicrowinDownloadFromGitHub" Content="Download oscdimg.exe from CTT Github repo" IsChecked="True" Margin="{DynamicResource MicrowinCheckBoxMargin}" />
|
||||||
<TextBlock Margin="5" Padding="1" TextWrapping="Wrap" Foreground="{DynamicResource ComboBoxForegroundColor}">
|
<TextBlock Margin="5" Padding="1" TextWrapping="Wrap" Foreground="{DynamicResource ComboBoxForegroundColor}">
|
||||||
Choose a Windows ISO file that you've downloaded <LineBreak/>
|
Choose a Windows ISO file that you've downloaded <LineBreak/>
|
||||||
Check the status in the console
|
Check the status in the console
|
||||||
|
Reference in New Issue
Block a user