win_region - fix format issues when using psrp (#55487)
This commit is contained in:
parent
8542f16fa9
commit
f247c21d23
2 changed files with 84 additions and 27 deletions
2
changelogs/fragments/win_region-format.yaml
Normal file
2
changelogs/fragments/win_region-format.yaml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- win_region - Fix the check for ``format`` when running on the ``psrp`` connection plugin
|
|
@ -25,7 +25,28 @@ using System.Text;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace Ansible {
|
namespace Ansible.WinRegion {
|
||||||
|
|
||||||
|
public class NativeMethods
|
||||||
|
{
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||||
|
public static extern int GetLocaleInfoEx(
|
||||||
|
String lpLocaleName,
|
||||||
|
UInt32 LCType,
|
||||||
|
StringBuilder lpLCData,
|
||||||
|
int cchData);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||||
|
public static extern int GetSystemDefaultLocaleName(
|
||||||
|
IntPtr lpLocaleName,
|
||||||
|
int cchLocaleName);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||||
|
public static extern int GetUserDefaultLocaleName(
|
||||||
|
IntPtr lpLocaleName,
|
||||||
|
int cchLocaleName);
|
||||||
|
}
|
||||||
|
|
||||||
public class LocaleHelper {
|
public class LocaleHelper {
|
||||||
private String Locale;
|
private String Locale;
|
||||||
|
|
||||||
|
@ -33,12 +54,9 @@ namespace Ansible {
|
||||||
Locale = locale;
|
Locale = locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
|
||||||
public static extern int GetLocaleInfoEx(String lpLocaleName, UInt32 LCType, StringBuilder lpLCData, int cchData);
|
|
||||||
|
|
||||||
public String GetValueFromType(UInt32 LCType) {
|
public String GetValueFromType(UInt32 LCType) {
|
||||||
StringBuilder data = new StringBuilder(500);
|
StringBuilder data = new StringBuilder(500);
|
||||||
int result = GetLocaleInfoEx(Locale, LCType, data, 500);
|
int result = NativeMethods.GetLocaleInfoEx(Locale, LCType, data, 500);
|
||||||
if (result == 0)
|
if (result == 0)
|
||||||
throw new Exception(String.Format("Error getting locale info with legacy method: {0}", new Win32Exception(Marshal.GetLastWin32Error()).Message));
|
throw new Exception(String.Format("Error getting locale info with legacy method: {0}", new Win32Exception(Marshal.GetLastWin32Error()).Message));
|
||||||
|
|
||||||
|
@ -47,6 +65,59 @@ namespace Ansible {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"@
|
"@
|
||||||
|
$original_tmp = $env:TMP
|
||||||
|
$env:TMP = $_remote_tmp
|
||||||
|
Add-Type -TypeDefinition $lctype_util
|
||||||
|
$env:TMP = $original_tmp
|
||||||
|
|
||||||
|
Function Get-LastWin32ExceptionMessage {
|
||||||
|
param([int]$ErrorCode)
|
||||||
|
$exp = New-Object -TypeName System.ComponentModel.Win32Exception -ArgumentList $ErrorCode
|
||||||
|
$exp_msg = "{0} (Win32 ErrorCode {1} - 0x{1:X8})" -f $exp.Message, $ErrorCode
|
||||||
|
return $exp_msg
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Get-SystemLocaleName {
|
||||||
|
$max_length = 85 # LOCALE_NAME_MAX_LENGTH
|
||||||
|
$ptr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($max_length)
|
||||||
|
|
||||||
|
try {
|
||||||
|
$res = [Ansible.WinRegion.NativeMethods]::GetSystemDefaultLocaleName($ptr, $max_length)
|
||||||
|
|
||||||
|
if ($res -eq 0) {
|
||||||
|
$err_code = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
|
||||||
|
$msg = Get-LastWin32ExceptionMessage -Error $err_code
|
||||||
|
Fail-Json -obj $result -message "Failed to get system locale: $msg"
|
||||||
|
}
|
||||||
|
|
||||||
|
$system_locale = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($ptr)
|
||||||
|
} finally {
|
||||||
|
[System.Runtime.InteropServices.Marshal]::FreeHGlobal($ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return $system_locale
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Get-UserLocaleName {
|
||||||
|
$max_length = 85 # LOCALE_NAME_MAX_LENGTH
|
||||||
|
$ptr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($max_length)
|
||||||
|
|
||||||
|
try {
|
||||||
|
$res = [Ansible.WinRegion.NativeMethods]::GetUserDefaultLocaleName($ptr, $max_length)
|
||||||
|
|
||||||
|
if ($res -eq 0) {
|
||||||
|
$err_code = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
|
||||||
|
$msg = Get-LastWin32ExceptionMessage -Error $err_code
|
||||||
|
Fail-Json -obj $result -message "Failed to get user locale: $msg"
|
||||||
|
}
|
||||||
|
|
||||||
|
$user_locale = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($ptr)
|
||||||
|
} finally {
|
||||||
|
[System.Runtime.InteropServices.Marshal]::FreeHGlobal($ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return $user_locale
|
||||||
|
}
|
||||||
|
|
||||||
Function Get-ValidGeoIds($cultures) {
|
Function Get-ValidGeoIds($cultures) {
|
||||||
$geo_ids = @()
|
$geo_ids = @()
|
||||||
|
@ -79,20 +150,10 @@ Function Copy-RegistryKey($source, $target) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# With the legacy options (needed for OS < Windows 8 and Server 2012) we need to check multiple reg
|
Function Set-UserLocale($culture) {
|
||||||
# keys and modify them if they need changing. This is because Microsoft only made changing these
|
|
||||||
# values with the newer versions of Windows and didn't backport these features to the older ones,
|
|
||||||
# thanks a bunch there Microsoft :(
|
|
||||||
Function Set-CultureLegacy($culture) {
|
|
||||||
# For when Set-Culture is not available (Pre Windows 8 and Server 2012)
|
|
||||||
$reg_key = 'HKCU:\Control Panel\International'
|
$reg_key = 'HKCU:\Control Panel\International'
|
||||||
|
|
||||||
$original_tmp = $env:TMP
|
$lookup = New-Object Ansible.WinRegion.LocaleHelper($culture)
|
||||||
$env:TMP = $_remote_tmp
|
|
||||||
Add-Type -TypeDefinition $lctype_util
|
|
||||||
$env:TMP = $original_tmp
|
|
||||||
|
|
||||||
$lookup = New-Object Ansible.LocaleHelper($culture)
|
|
||||||
# hex values are from http://www.pinvoke.net/default.aspx/kernel32/GetLocaleInfoEx.html
|
# hex values are from http://www.pinvoke.net/default.aspx/kernel32/GetLocaleInfoEx.html
|
||||||
$wanted_values = @{
|
$wanted_values = @{
|
||||||
Locale = '{0:x8}' -f ([System.Globalization.CultureInfo]$culture).LCID
|
Locale = '{0:x8}' -f ([System.Globalization.CultureInfo]$culture).LCID
|
||||||
|
@ -257,16 +318,10 @@ if ($null -ne $location) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($null -ne $format) {
|
if ($null -ne $format) {
|
||||||
$current_format = (Get-Culture).Name
|
# Cannot use Get/Set-Culture as that fails to get and set the culture when running in the PSRP runspace.
|
||||||
|
$current_format = Get-UserLocaleName
|
||||||
if ($current_format -ne $format) {
|
if ($current_format -ne $format) {
|
||||||
# Set-Culture was only added in Server 2012 and above, use legacy option if older
|
Set-UserLocale -culture $format
|
||||||
if (Get-Command 'Set-Culture' -ErrorAction SilentlyContinue) {
|
|
||||||
if (-not $check_mode) {
|
|
||||||
Set-Culture -CultureInfo $format
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Set-CultureLegacy -culture $format
|
|
||||||
}
|
|
||||||
$result.changed = $true
|
$result.changed = $true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,7 +329,7 @@ if ($null -ne $format) {
|
||||||
if ($null -ne $unicode_language) {
|
if ($null -ne $unicode_language) {
|
||||||
# Get/Set-WinSystemLocale was only added in Server 2012 and above, use legacy option if older
|
# Get/Set-WinSystemLocale was only added in Server 2012 and above, use legacy option if older
|
||||||
if (Get-Command 'Get-WinSystemLocale' -ErrorAction SilentlyContinue) {
|
if (Get-Command 'Get-WinSystemLocale' -ErrorAction SilentlyContinue) {
|
||||||
$current_unicode_language = (Get-WinSystemLocale).Name
|
$current_unicode_language = Get-SystemLocaleName
|
||||||
if ($current_unicode_language -ne $unicode_language) {
|
if ($current_unicode_language -ne $unicode_language) {
|
||||||
if (-not $check_mode) {
|
if (-not $check_mode) {
|
||||||
Set-WinSystemLocale -SystemLocale $unicode_language
|
Set-WinSystemLocale -SystemLocale $unicode_language
|
||||||
|
|
Loading…
Reference in a new issue