diff --git a/CHANGELOG.md b/CHANGELOG.md
index 36e44683b3577a..7de2cd5a4caf23 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,7 +28,8 @@ release.
+12.22.3
12.22.2
12.22.1
12.22.0
@@ -72,6 +73,20 @@
* [io.js](CHANGELOG_IOJS.md)
* [Archive](CHANGELOG_ARCHIVE.md)
+
+## 2021-07-05, Version 12.22.3 'Erbium' (LTS), @richardlau
+
+### Notable Changes
+
+Node.js 12.22.2 introduced a regression in the Windows installer on
+non-English locales that is being fixed in this release. There is no
+need to download this release if you are not using the Windows
+installer.
+
+### Commits
+
+* [[`182f86a4d4`](https://github.com/nodejs/node/commit/182f86a4d4)] - **win,msi**: use localized "Authenticated Users" name (Richard Lau) [#39241](https://github.com/nodejs/node/pull/39241)
+
## 2021-07-01, Version 12.22.2 'Erbium' (LTS), @richardlau
diff --git a/src/node_version.h b/src/node_version.h
index 43984988279c5f..530202f68d9a50 100644
--- a/src/node_version.h
+++ b/src/node_version.h
@@ -29,7 +29,7 @@
#define NODE_VERSION_IS_LTS 1
#define NODE_VERSION_LTS_CODENAME "Erbium"
-#define NODE_VERSION_IS_RELEASE 0
+#define NODE_VERSION_IS_RELEASE 1
#ifndef NODE_STRINGIFY
#define NODE_STRINGIFY(n) NODE_STRINGIFY_HELPER(n)
diff --git a/tools/msvs/msi/custom_actions.cc b/tools/msvs/msi/custom_actions.cc
index 8a8417ea0b2929..32811dcb19469d 100644
--- a/tools/msvs/msi/custom_actions.cc
+++ b/tools/msvs/msi/custom_actions.cc
@@ -3,6 +3,8 @@
#include
#include
#include
+#include
+#include
#define GUID_BUFFER_SIZE 39 // {8-4-4-4-12}\0
@@ -96,6 +98,35 @@ extern "C" UINT WINAPI BroadcastEnvironmentUpdate(MSIHANDLE hInstall) {
return WcaFinalize(er);
}
+#define AUTHENTICATED_USERS_SID L"S-1-5-11"
+
+extern "C" UINT WINAPI GetLocalizedUserNames(MSIHANDLE hInstall) {
+ HRESULT hr = S_OK;
+ UINT er = ERROR_SUCCESS;
+ TCHAR userName[UNLEN + 1] = {0};
+ DWORD userNameSize = UNLEN + 1;
+ TCHAR domain[DNLEN + 1] = {0};
+ DWORD domainSize = DNLEN + 1;
+ PSID sid;
+ SID_NAME_USE nameUse;
+
+ hr = WcaInitialize(hInstall, "GetLocalizedUserNames");
+ ExitOnFailure(hr, "Failed to initialize");
+
+ er = ConvertStringSidToSidW(AUTHENTICATED_USERS_SID, &sid);
+ ExitOnLastError(er, "Failed to convert security identifier");
+
+ er = LookupAccountSidW(NULL, sid, userName, &userNameSize, domain, &domainSize, &nameUse);
+ ExitOnLastError(er, "Failed to lookup security identifier");
+
+ MsiSetProperty(hInstall, L"AUTHENTICATED_USERS", userName);
+ ExitOnWin32Error(er, hr, "Failed to set localized Authenticated User name");
+
+LExit:
+ er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
+ LocalFree(sid);
+ return WcaFinalize(er);
+}
extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason, VOID* dummy) {
switch (ulReason) {
diff --git a/tools/msvs/msi/custom_actions.def b/tools/msvs/msi/custom_actions.def
index 5f6b25fc423492..93f2a28f45e45e 100644
--- a/tools/msvs/msi/custom_actions.def
+++ b/tools/msvs/msi/custom_actions.def
@@ -3,3 +3,4 @@ LIBRARY "custom_actions"
EXPORTS
SetInstallScope
BroadcastEnvironmentUpdate
+GetLocalizedUserNames
diff --git a/tools/msvs/msi/product.wxs b/tools/msvs/msi/product.wxs
index ce53647a135502..61909bbeb61c9f 100755
--- a/tools/msvs/msi/product.wxs
+++ b/tools/msvs/msi/product.wxs
@@ -47,8 +47,6 @@
-
-
@@ -329,6 +327,12 @@
Execute="immediate"
Return="check" />
+
+
@@ -338,6 +342,7 @@
+
|