Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3e40fabb5 | ||
|
|
a850b56a02 | ||
|
|
ac531db05e | ||
|
|
c8572eb8d4 |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
@@ -85,7 +85,10 @@ The generic SGU credential is rendered as a dedicated branded tile instead of
|
|||||||
being grouped below the anonymous **Other user** tile. Machine policy assigns
|
being grouped below the anonymous **Other user** tile. Machine policy assigns
|
||||||
the SGU CLSID as the default provider, hides the last signed-in identity, and
|
the SGU CLSID as the default provider, hides the last signed-in identity, and
|
||||||
disables local-user enumeration while retaining the built-in Microsoft password
|
disables local-user enumeration while retaining the built-in Microsoft password
|
||||||
provider and its **Other user** recovery path. It enumerates one
|
provider and its **Other user** recovery path. The computer GPO also applies
|
||||||
|
Windows' native default account picture to named Windows accounts; client
|
||||||
|
enrollment installs the La Salle mascot bitmap in Windows' standard account-picture
|
||||||
|
location before that GPO takes effect. It enumerates one
|
||||||
`CPFT_TILE_IMAGE` and places the `CPFT_LARGE_TEXT` heading immediately after it
|
`CPFT_TILE_IMAGE` and places the `CPFT_LARGE_TEXT` heading immediately after it
|
||||||
with `CPFS_DISPLAY_IN_SELECTED_TILE`. LogonUI owns field typography and vertical
|
with `CPFS_DISPLAY_IN_SELECTED_TILE`. LogonUI owns field typography and vertical
|
||||||
tile order: on Windows 10 and 11, the account-name title used by **Other user**
|
tile order: on Windows 10 and 11, the account-name title used by **Other user**
|
||||||
|
|||||||
@@ -20,6 +20,20 @@ $remoteDesktopUsersSid = [Security.Principal.SecurityIdentifier]::new('S-1-5-32-
|
|||||||
$remoteDesktopUsersGroup = ($remoteDesktopUsersSid.Translate([Security.Principal.NTAccount]).Value -split '\\', 2)[1]
|
$remoteDesktopUsersGroup = ($remoteDesktopUsersSid.Translate([Security.Principal.NTAccount]).Value -split '\\', 2)[1]
|
||||||
|
|
||||||
if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Enable RDP and grant $RemoteDesktopPrincipal access")) {
|
if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Enable RDP and grant $RemoteDesktopPrincipal access")) {
|
||||||
|
function Invoke-PowerCfgBestEffort {
|
||||||
|
param([Parameter(Mandatory)][string[]]$Arguments)
|
||||||
|
|
||||||
|
# Start-Process keeps powercfg's policy-override diagnostic on its own
|
||||||
|
# stderr stream. In PowerShell 7, directly invoking that native command
|
||||||
|
# turns stderr into a terminating ErrorRecord under $ErrorActionPreference
|
||||||
|
# = 'Stop', which previously aborted this unrelated remediation work.
|
||||||
|
$process = Start-Process -FilePath "$env:SystemRoot\System32\powercfg.exe" `
|
||||||
|
-ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
|
||||||
|
if ($process.ExitCode -ne 0) {
|
||||||
|
Write-Warning "powercfg $($Arguments -join ' ') returned exit code $($process.ExitCode); continuing enrollment repair."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($powerChange in @(
|
foreach ($powerChange in @(
|
||||||
@('monitor-timeout-ac', '0'),
|
@('monitor-timeout-ac', '0'),
|
||||||
@('monitor-timeout-dc', '0'),
|
@('monitor-timeout-dc', '0'),
|
||||||
@@ -27,15 +41,9 @@ if ($PSCmdlet.ShouldProcess($env:COMPUTERNAME, "Enable RDP and grant $RemoteDesk
|
|||||||
@('standby-timeout-dc', '0'),
|
@('standby-timeout-dc', '0'),
|
||||||
@('hibernate-timeout-ac', '0'),
|
@('hibernate-timeout-ac', '0'),
|
||||||
@('hibernate-timeout-dc', '0'))) {
|
@('hibernate-timeout-dc', '0'))) {
|
||||||
& powercfg.exe /change $powerChange[0] $powerChange[1]
|
Invoke-PowerCfgBestEffort -Arguments @('/change', $powerChange[0], $powerChange[1])
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "powercfg /change $($powerChange[0]) failed with exit code $LASTEXITCODE."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
& powercfg.exe /hibernate off
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "powercfg /hibernate off failed with exit code $LASTEXITCODE."
|
|
||||||
}
|
}
|
||||||
|
Invoke-PowerCfgBestEffort -Arguments @('/hibernate', 'off')
|
||||||
|
|
||||||
Set-ItemProperty -LiteralPath 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' `
|
Set-ItemProperty -LiteralPath 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' `
|
||||||
-Name fDenyTSConnections -Type DWord -Value 0
|
-Name fDenyTSConnections -Type DWord -Value 0
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ $providerRegistryPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authent
|
|||||||
$classRegistryPath = "HKLM:\SOFTWARE\Classes\CLSID\$providerClassId\InprocServer32"
|
$classRegistryPath = "HKLM:\SOFTWARE\Classes\CLSID\$providerClassId\InprocServer32"
|
||||||
$defaultProviderPolicyPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\System'
|
$defaultProviderPolicyPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\System'
|
||||||
$interactiveLogonPolicyPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
|
$interactiveLogonPolicyPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System'
|
||||||
|
$accountPictureSourcePath = Join-Path $PublishPath 'branding\user.png'
|
||||||
|
$accountPictureDirectory = Join-Path $env:ProgramData 'Microsoft\User Account Pictures'
|
||||||
|
|
||||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||||
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
||||||
@@ -56,6 +58,70 @@ function Test-DotNet10Runtime {
|
|||||||
return $false
|
return $false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Install-DefaultAccountPicture {
|
||||||
|
param([Parameter(Mandatory)][string]$SourcePath)
|
||||||
|
|
||||||
|
if (-not (Test-Path -LiteralPath $SourcePath -PathType Leaf)) {
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
|
||||||
|
Add-Type -AssemblyName System.Drawing
|
||||||
|
New-Item -ItemType Directory -Path $accountPictureDirectory -Force | Out-Null
|
||||||
|
|
||||||
|
function Save-AccountPicture {
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)][Drawing.Image]$Image,
|
||||||
|
[Parameter(Mandatory)][string]$Path,
|
||||||
|
[Parameter(Mandatory)][Drawing.Imaging.ImageFormat]$Format
|
||||||
|
)
|
||||||
|
|
||||||
|
$stream = [IO.MemoryStream]::new()
|
||||||
|
try {
|
||||||
|
$Image.Save($stream, $Format)
|
||||||
|
[IO.File]::WriteAllBytes($Path, $stream.ToArray())
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
$stream.Dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$source = [Drawing.Image]::FromFile($SourcePath)
|
||||||
|
try {
|
||||||
|
foreach ($size in @(192, 48, 40, 32)) {
|
||||||
|
$bitmap = [Drawing.Bitmap]::new($size, $size)
|
||||||
|
try {
|
||||||
|
$graphics = [Drawing.Graphics]::FromImage($bitmap)
|
||||||
|
try {
|
||||||
|
$graphics.Clear([Drawing.Color]::Transparent)
|
||||||
|
$graphics.InterpolationMode = [Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
|
||||||
|
$graphics.DrawImage($source, [Drawing.Rectangle]::new(0, 0, $size, $size))
|
||||||
|
Save-AccountPicture -Image $bitmap `
|
||||||
|
-Path (Join-Path $accountPictureDirectory "user-$size.png") `
|
||||||
|
-Format ([Drawing.Imaging.ImageFormat]::Png)
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
$graphics.Dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
$bitmap.Dispose()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Save-AccountPicture -Image $source `
|
||||||
|
-Path (Join-Path $accountPictureDirectory 'user.png') `
|
||||||
|
-Format ([Drawing.Imaging.ImageFormat]::Png)
|
||||||
|
Save-AccountPicture -Image $source `
|
||||||
|
-Path (Join-Path $accountPictureDirectory 'user.bmp') `
|
||||||
|
-Format ([Drawing.Imaging.ImageFormat]::Bmp)
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
$source.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
|
||||||
if (-not (Test-DotNet10Runtime)) {
|
if (-not (Test-DotNet10Runtime)) {
|
||||||
if (-not $InstallDotNetRuntime) {
|
if (-not $InstallDotNetRuntime) {
|
||||||
throw 'Microsoft .NET 10 x64 runtime is required. Re-run with -InstallDotNetRuntime or install it first.'
|
throw 'Microsoft .NET 10 x64 runtime is required. Re-run with -InstallDotNetRuntime or install it first.'
|
||||||
@@ -166,6 +232,10 @@ if ($PSCmdlet.ShouldProcess($installPath, 'Install and register the SGU Credenti
|
|||||||
[IO.File]::WriteAllText($completeMarker, $packageHash, [Text.UTF8Encoding]::new($false))
|
[IO.File]::WriteAllText($completeMarker, $packageHash, [Text.UTF8Encoding]::new($false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# The domain GPO selects the Windows default account picture. Install its
|
||||||
|
# branded bitmap during enrollment so no per-machine manual setup is needed.
|
||||||
|
Install-DefaultAccountPicture -SourcePath $accountPictureSourcePath | Out-Null
|
||||||
|
|
||||||
New-Item -ItemType Directory -Path (Split-Path $settingsPath -Parent) -Force | Out-Null
|
New-Item -ItemType Directory -Path (Split-Path $settingsPath -Parent) -Force | Out-Null
|
||||||
$settingsJson = @{
|
$settingsJson = @{
|
||||||
BrokerEndpoint = $BrokerEndpoint
|
BrokerEndpoint = $BrokerEndpoint
|
||||||
@@ -179,10 +249,14 @@ if ($PSCmdlet.ShouldProcess($installPath, 'Install and register the SGU Credenti
|
|||||||
|
|
||||||
$acl = Get-Acl -LiteralPath (Split-Path $settingsPath -Parent)
|
$acl = Get-Acl -LiteralPath (Split-Path $settingsPath -Parent)
|
||||||
$acl.SetAccessRuleProtection($true, $false)
|
$acl.SetAccessRuleProtection($true, $false)
|
||||||
|
# Resolve built-in identities by SID instead of localized display names.
|
||||||
|
# "BUILTIN\Administrators" is not resolvable on every non-English client.
|
||||||
|
$systemSid = [Security.Principal.SecurityIdentifier]::new('S-1-5-18')
|
||||||
|
$administratorsSid = [Security.Principal.SecurityIdentifier]::new('S-1-5-32-544')
|
||||||
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
||||||
'SYSTEM', 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
$systemSid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
||||||
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
||||||
'BUILTIN\Administrators', 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
$administratorsSid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
||||||
Set-Acl -LiteralPath (Split-Path $settingsPath -Parent) -AclObject $acl
|
Set-Acl -LiteralPath (Split-Path $settingsPath -Parent) -AclObject $acl
|
||||||
|
|
||||||
New-Item -Path $classRegistryPath -Force | Out-Null
|
New-Item -Path $classRegistryPath -Force | Out-Null
|
||||||
|
|||||||
@@ -71,7 +71,11 @@ if ($PSCmdlet.ShouldProcess($enrollmentRoot, 'Install the SGU enrollment repair
|
|||||||
$runtimeDirectory = Join-Path $enrollmentRoot 'prerequisites'
|
$runtimeDirectory = Join-Path $enrollmentRoot 'prerequisites'
|
||||||
New-Item -ItemType Directory -Path $runtimeDirectory -Force | Out-Null
|
New-Item -ItemType Directory -Path $runtimeDirectory -Force | Out-Null
|
||||||
$guardRuntimeInstaller = Join-Path $runtimeDirectory (Split-Path $DotNetRuntimeInstallerPath -Leaf)
|
$guardRuntimeInstaller = Join-Path $runtimeDirectory (Split-Path $DotNetRuntimeInstallerPath -Leaf)
|
||||||
Copy-Item -LiteralPath $DotNetRuntimeInstallerPath -Destination $guardRuntimeInstaller -Force
|
$sourceRuntimeInstaller = [IO.Path]::GetFullPath($DotNetRuntimeInstallerPath)
|
||||||
|
$destinationRuntimeInstaller = [IO.Path]::GetFullPath($guardRuntimeInstaller)
|
||||||
|
if (-not $sourceRuntimeInstaller.Equals($destinationRuntimeInstaller, [StringComparison]::OrdinalIgnoreCase)) {
|
||||||
|
Copy-Item -LiteralPath $DotNetRuntimeInstallerPath -Destination $guardRuntimeInstaller -Force
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$guardConfiguration = [ordered]@{
|
$guardConfiguration = [ordered]@{
|
||||||
@@ -92,10 +96,13 @@ if ($PSCmdlet.ShouldProcess($enrollmentRoot, 'Install the SGU enrollment repair
|
|||||||
|
|
||||||
$acl = Get-Acl -LiteralPath $enrollmentRoot
|
$acl = Get-Acl -LiteralPath $enrollmentRoot
|
||||||
$acl.SetAccessRuleProtection($true, $false)
|
$acl.SetAccessRuleProtection($true, $false)
|
||||||
|
# Well-known SIDs are invariant across localized Windows installations.
|
||||||
|
$systemSid = [Security.Principal.SecurityIdentifier]::new('S-1-5-18')
|
||||||
|
$administratorsSid = [Security.Principal.SecurityIdentifier]::new('S-1-5-32-544')
|
||||||
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
||||||
'SYSTEM', 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
$systemSid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
||||||
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
$acl.AddAccessRule([Security.AccessControl.FileSystemAccessRule]::new(
|
||||||
'BUILTIN\Administrators', 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
$administratorsSid, 'FullControl', 'ContainerInherit,ObjectInherit', 'None', 'Allow'))
|
||||||
Set-Acl -LiteralPath $enrollmentRoot -AclObject $acl
|
Set-Acl -LiteralPath $enrollmentRoot -AclObject $acl
|
||||||
|
|
||||||
$repairScript = Join-Path $enrollmentRoot 'Repair-SguClientEnrollment.ps1'
|
$repairScript = Join-Path $enrollmentRoot 'Repair-SguClientEnrollment.ps1'
|
||||||
|
|||||||
@@ -111,6 +111,8 @@ Copy-Item -Path (Join-Path $providerOutput '*') `
|
|||||||
-Destination (New-Item -ItemType Directory `
|
-Destination (New-Item -ItemType Directory `
|
||||||
-Path (Join-Path $clientRoot 'payload\credential-provider') -Force).FullName `
|
-Path (Join-Path $clientRoot 'payload\credential-provider') -Force).FullName `
|
||||||
-Recurse -Force
|
-Recurse -Force
|
||||||
|
Copy-RequiredFile -Source (Join-Path $repositoryRoot 'assets\branding\lasalle-mascot-account.png') `
|
||||||
|
-Destination (Join-Path $clientRoot 'payload\credential-provider\branding\user.png')
|
||||||
Copy-RequiredFile -Source $runtimeInstaller.FullName `
|
Copy-RequiredFile -Source $runtimeInstaller.FullName `
|
||||||
-Destination (Join-Path $clientRoot "payload\prerequisites\$($runtimeInstaller.Name)")
|
-Destination (Join-Path $clientRoot "payload\prerequisites\$($runtimeInstaller.Name)")
|
||||||
Write-PackageManifest -PackageRoot $clientRoot -PackageVersion $Version -PackageKind Client
|
Write-PackageManifest -PackageRoot $clientRoot -PackageVersion $Version -PackageKind Client
|
||||||
|
|||||||
@@ -61,15 +61,29 @@ elseif (-not $existingLinkEnabled -and
|
|||||||
|
|
||||||
$dataCollectionKey = 'HKLM\Software\Policies\Microsoft\Windows\DataCollection'
|
$dataCollectionKey = 'HKLM\Software\Policies\Microsoft\Windows\DataCollection'
|
||||||
$powerPolicyRoot = 'HKLM\Software\Policies\Microsoft\Power\PowerSettings'
|
$powerPolicyRoot = 'HKLM\Software\Policies\Microsoft\Power\PowerSettings'
|
||||||
|
$credentialProviderPolicyKey = 'HKLM\Software\Policies\Microsoft\Windows\System'
|
||||||
|
$interactiveLogonPolicyKey = 'HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System'
|
||||||
|
$accountPicturePolicyKey = 'HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer'
|
||||||
|
$providerClassId = '{D789CFD8-5AD4-489F-9B83-7EB5D9D09335}'
|
||||||
$policies = @(
|
$policies = @(
|
||||||
@{ Key = $dataCollectionKey; Name = 'AllowTelemetry'; Value = 0 },
|
@{ Key = $dataCollectionKey; Name = 'AllowTelemetry'; Type = 'DWord'; Value = 0 },
|
||||||
@{ Key = $dataCollectionKey; Name = 'DisableTelemetryOptInSettingsUx'; Value = 1 },
|
@{ Key = $dataCollectionKey; Name = 'DisableTelemetryOptInSettingsUx'; Type = 'DWord'; Value = 1 },
|
||||||
@{ Key = $dataCollectionKey; Name = 'DisableTelemetryOptInChangeNotification'; Value = 1 },
|
@{ Key = $dataCollectionKey; Name = 'DisableTelemetryOptInChangeNotification'; Type = 'DWord'; Value = 1 },
|
||||||
@{ Key = $dataCollectionKey; Name = 'DisableDiagnosticDataViewer'; Value = 1 },
|
@{ Key = $dataCollectionKey; Name = 'DisableDiagnosticDataViewer'; Type = 'DWord'; Value = 1 },
|
||||||
@{ Key = 'HKLM\Software\Policies\Microsoft\Windows\OOBE'; Name = 'DisablePrivacyExperience'; Value = 1 },
|
@{ Key = 'HKLM\Software\Policies\Microsoft\Windows\OOBE'; Name = 'DisablePrivacyExperience'; Type = 'DWord'; Value = 1 },
|
||||||
@{ Key = 'HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System'; Name = 'EnableFirstLogonAnimation'; Value = 0 },
|
@{ Key = $interactiveLogonPolicyKey; Name = 'EnableFirstLogonAnimation'; Type = 'DWord'; Value = 0 },
|
||||||
@{ Key = 'HKLM\Software\Policies\Microsoft\Windows\LocationAndSensors'; Name = 'DisableLocation'; Value = 1 },
|
@{ Key = 'HKLM\Software\Policies\Microsoft\Windows\LocationAndSensors'; Name = 'DisableLocation'; Type = 'DWord'; Value = 1 },
|
||||||
@{ Key = 'HKLM\Software\Policies\Microsoft\Windows\AppPrivacy'; Name = 'LetAppsAccessLocation'; Value = 2 }
|
@{ Key = 'HKLM\Software\Policies\Microsoft\Windows\AppPrivacy'; Name = 'LetAppsAccessLocation'; Type = 'DWord'; Value = 2 },
|
||||||
|
|
||||||
|
# Enrollment selects the provider before domain join; this computer GPO
|
||||||
|
# becomes the authoritative, self-healing configuration afterwards.
|
||||||
|
@{ Key = $credentialProviderPolicyKey; Name = 'DefaultCredentialProvider'; Type = 'String'; Value = $providerClassId },
|
||||||
|
@{ Key = $credentialProviderPolicyKey; Name = 'EnumerateLocalUsers'; Type = 'DWord'; Value = 0 },
|
||||||
|
@{ Key = $interactiveLogonPolicyKey; Name = 'DontDisplayLastUserName'; Type = 'DWord'; Value = 1 },
|
||||||
|
|
||||||
|
# Use Windows' native default account image for named user tiles. LogonUI
|
||||||
|
# retains ownership of the anonymous Other user tile and its circular mask.
|
||||||
|
@{ Key = $accountPicturePolicyKey; Name = 'UseDefaultTile'; Type = 'DWord'; Value = 1 }
|
||||||
)
|
)
|
||||||
|
|
||||||
$powerSettingIds = @(
|
$powerSettingIds = @(
|
||||||
@@ -80,8 +94,8 @@ $powerSettingIds = @(
|
|||||||
)
|
)
|
||||||
foreach ($settingId in $powerSettingIds) {
|
foreach ($settingId in $powerSettingIds) {
|
||||||
$settingKey = "$powerPolicyRoot\$settingId"
|
$settingKey = "$powerPolicyRoot\$settingId"
|
||||||
$policies += @{ Key = $settingKey; Name = 'ACSettingIndex'; Value = 0 }
|
$policies += @{ Key = $settingKey; Name = 'ACSettingIndex'; Type = 'DWord'; Value = 0 }
|
||||||
$policies += @{ Key = $settingKey; Name = 'DCSettingIndex'; Value = 0 }
|
$policies += @{ Key = $settingKey; Name = 'DCSettingIndex'; Type = 'DWord'; Value = 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($policy in $policies) {
|
foreach ($policy in $policies) {
|
||||||
@@ -92,7 +106,7 @@ foreach ($policy in $policies) {
|
|||||||
-Server $DomainController `
|
-Server $DomainController `
|
||||||
-Key $policy.Key `
|
-Key $policy.Key `
|
||||||
-ValueName $policy.Name `
|
-ValueName $policy.Name `
|
||||||
-Type DWord `
|
-Type $policy.Type `
|
||||||
-Value $policy.Value | Out-Null
|
-Value $policy.Value | Out-Null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,7 +119,7 @@ foreach ($policy in $policies) {
|
|||||||
-Server $DomainController `
|
-Server $DomainController `
|
||||||
-Key $policy.Key `
|
-Key $policy.Key `
|
||||||
-ValueName $policy.Name
|
-ValueName $policy.Name
|
||||||
$configuredPolicies[$policy.Name + '@' + $policy.Key] = [int]$configured.Value
|
$configuredPolicies[$policy.Name + '@' + $policy.Key] = $configured.Value
|
||||||
}
|
}
|
||||||
$link = @(Get-GPInheritance -Target $TargetOuDn -Domain $domainName -Server $DomainController).GpoLinks |
|
$link = @(Get-GPInheritance -Target $TargetOuDn -Domain $domainName -Server $DomainController).GpoLinks |
|
||||||
Where-Object DisplayName -eq $GpoName |
|
Where-Object DisplayName -eq $GpoName |
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ $ErrorActionPreference = 'Stop'
|
|||||||
$policyKey = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System'
|
$policyKey = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System'
|
||||||
$policyValueName = 'DisableLockWorkstation'
|
$policyValueName = 'DisableLockWorkstation'
|
||||||
$desktopPolicyKey = 'HKCU\Software\Policies\Microsoft\Windows\Control Panel\Desktop'
|
$desktopPolicyKey = 'HKCU\Software\Policies\Microsoft\Windows\Control Panel\Desktop'
|
||||||
|
$themeKey = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize'
|
||||||
|
|
||||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||||
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
|
||||||
@@ -83,6 +84,19 @@ if ($PSCmdlet.ShouldProcess($GpoName, 'Prevent SGU users from manually locking w
|
|||||||
-Type String `
|
-Type String `
|
||||||
-Value '0' | Out-Null
|
-Value '0' | Out-Null
|
||||||
|
|
||||||
|
# Apply the native Windows dark theme at user logon. Both values are required:
|
||||||
|
# one controls the shell and the other controls supported applications.
|
||||||
|
foreach ($themeValueName in 'AppsUseLightTheme', 'SystemUsesLightTheme') {
|
||||||
|
Set-GPRegistryValue `
|
||||||
|
-Name $GpoName `
|
||||||
|
-Domain $domainName `
|
||||||
|
-Server $DomainController `
|
||||||
|
-Key $themeKey `
|
||||||
|
-ValueName $themeValueName `
|
||||||
|
-Type DWord `
|
||||||
|
-Value 0 | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
if ($WallpaperPath) {
|
if ($WallpaperPath) {
|
||||||
Set-GPRegistryValue `
|
Set-GPRegistryValue `
|
||||||
-Name $GpoName `
|
-Name $GpoName `
|
||||||
@@ -115,6 +129,18 @@ $screenSaverValue = Get-GPRegistryValue `
|
|||||||
-Server $DomainController `
|
-Server $DomainController `
|
||||||
-Key $desktopPolicyKey `
|
-Key $desktopPolicyKey `
|
||||||
-ValueName 'ScreenSaveActive'
|
-ValueName 'ScreenSaveActive'
|
||||||
|
$appsThemeValue = Get-GPRegistryValue `
|
||||||
|
-Name $GpoName `
|
||||||
|
-Domain $domainName `
|
||||||
|
-Server $DomainController `
|
||||||
|
-Key $themeKey `
|
||||||
|
-ValueName 'AppsUseLightTheme'
|
||||||
|
$systemThemeValue = Get-GPRegistryValue `
|
||||||
|
-Name $GpoName `
|
||||||
|
-Domain $domainName `
|
||||||
|
-Server $DomainController `
|
||||||
|
-Key $themeKey `
|
||||||
|
-ValueName 'SystemUsesLightTheme'
|
||||||
$link = @(Get-GPInheritance -Target $TargetOuDn -Domain $domainName -Server $DomainController).GpoLinks |
|
$link = @(Get-GPInheritance -Target $TargetOuDn -Domain $domainName -Server $DomainController).GpoLinks |
|
||||||
Where-Object DisplayName -eq $GpoName |
|
Where-Object DisplayName -eq $GpoName |
|
||||||
Select-Object -First 1
|
Select-Object -First 1
|
||||||
@@ -138,5 +164,6 @@ if ($WallpaperPath) {
|
|||||||
LinkEnabled = [bool]$linkEnabled
|
LinkEnabled = [bool]$linkEnabled
|
||||||
DisableLockWorkstation = [int]$configuredValue.Value
|
DisableLockWorkstation = [int]$configuredValue.Value
|
||||||
ScreenSaverDisabled = [string]$screenSaverValue.Value -eq '0'
|
ScreenSaverDisabled = [string]$screenSaverValue.Value -eq '0'
|
||||||
|
DarkMode = ([int]$appsThemeValue.Value -eq 0) -and ([int]$systemThemeValue.Value -eq 0)
|
||||||
Wallpaper = $configuredWallpaper
|
Wallpaper = $configuredWallpaper
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user