565
wil::unique_hkey lxssKey;
566
wil::unique_handle userToken;
567
{
568
- auto runAsUser = wil::CoImpersonateClient();
568
userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
570
- lxssKey = wsl::windows::common::registry::OpenLxssUserKey();
569
+ lxssKey = s_OpenLxssUserKey(userToken.get());
570
}
571
572
static std::atomic<DWORD> sessionCookie;
682
ExecutionContext context(Context::AttachDisk);
683
684
std::lock_guard lock(m_instanceLock);
686
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
685
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
686
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
687
688
// Validate that at least one WSL2 distro is installed
689
auto pred = [&](const auto& e) { return WI_IsFlagSet(e.Read(Property::Flags), LXSS_DISTRO_FLAGS_VM_MODE); };
706
707
WSL_LOG("ConfigureDistribution", TraceLoggingValue(DefaultUid, "DefaultUid"), TraceLoggingValue(Flags, "Flags"));
708
709
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
709
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
710
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
711
std::lock_guard lock(m_instanceLock);
712
713
// Ensure the distribution exists.
921
_EnsureNotLocked(DistroGuid);
922
923
// Lookup the distribution configuration
923
- const auto lxssKey = s_OpenLxssUserKey();
924
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
925
+ const auto lxssKey = s_OpenLxssUserKey(userToken.get());
926
_ValidateDistributionNameAndPathNotInUse(lxssKey.get(), Location, nullptr);
927
928
auto registration = DistributionRegistration::Open(lxssKey.get(), *DistroGuid);
1007
HRESULT LxssUserSessionImpl::EnumerateDistributions(_Out_ PULONG DistributionCount, _Out_ LXSS_ENUMERATE_INFO** Distributions)
1008
{
1009
// Get a list of all registered distributions.
1008
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1010
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1011
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1012
std::lock_guard lock(m_instanceLock);
1013
const auto distributions = _EnumerateDistributions(lxssKey.get(), true);
1014
1075
wil::unique_hkey distroKey;
1076
try
1077
{
1075
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1078
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1079
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1080
std::lock_guard lock(m_instanceLock);
1081
1082
const auto registration = DistributionRegistration::OpenOrDefault(lxssKey.get(), DistroGuid);
1221
HRESULT LxssUserSessionImpl::GetDefaultDistribution(_Out_ LPGUID DefaultDistribution)
1222
try
1223
{
1220
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1224
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1225
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1226
std::lock_guard lock(m_instanceLock);
1227
*DefaultDistribution = _GetDefaultDistro(lxssKey.get());
1228
return S_OK;
1239
_Out_ ULONG* Flags)
1240
try
1241
{
1237
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1242
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1243
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1244
std::lock_guard lock(m_instanceLock);
1245
1246
const auto registration = DistributionRegistration::OpenOrDefault(lxssKey.get(), DistroGuid);
1277
RETURN_HR_IF(E_INVALIDARG, (WI_IsAnyFlagSet(Flags, ~LXSS_GET_DISTRO_ID_LIST_ALL)));
1278
1279
// Open the user's lxss registry key.
1274
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1280
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1281
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1282
const bool listAll = WI_IsFlagSet(Flags, LXSS_GET_DISTRO_ID_LIST_ALL);
1283
bool distroFound = false;
1284
1328
const std::filesystem::path path{VhdPath};
1329
RETURN_HR_IF(E_INVALIDARG, !path.is_absolute() || !wsl::windows::common::wslutil::IsVhdFile(path));
1330
1324
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1331
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1332
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1333
std::lock_guard lock(m_instanceLock);
1334
1335
// Create a registration for the distribution.
1353
auto configuration = s_GetDistributionConfiguration(registration);
1354
1355
// Declare a scope exit variable to clean up on failure.
1348
- const wil::unique_handle userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1356
auto cleanup = wil::scope_exit_log(WI_DIAGNOSTICS_INFO, [&] {
1357
{
1358
auto runAsUser = wil::impersonate_token(userToken.get());
1437
}
1438
1439
// Impersonate the user and open their lxss registry key.
1433
- wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1440
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1441
+ wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1442
1443
// Determine the filesystem version. If WslFs is not enabled, downgrade
1444
// the version.
1479
DistributionRegistration registration;
1480
LXSS_DISTRO_CONFIGURATION configuration;
1481
std::filesystem::path distributionPath;
1474
- wil::unique_handle userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1482
auto config = _GetResultantConfig(userToken.get());
1483
1484
{
1744
HRESULT LxssUserSessionImpl::SetDefaultDistribution(_In_ LPCGUID DistroGuid)
1745
try
1746
{
1740
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1747
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1748
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1749
1750
// Ensure the distribution is in the installed state.
1751
std::lock_guard lock(m_instanceLock);
1765
HRESULT LxssUserSessionImpl::SetSparse(_In_ LPCGUID DistroGuid, _In_ BOOLEAN Sparse, _In_ BOOLEAN AllowUnsafe)
1766
try
1767
{
1760
- auto runAsUser = wil::CoImpersonateClient();
1761
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1768
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1769
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1770
+ auto runAsUser = wil::impersonate_token(userToken.get());
1771
std::lock_guard lock(m_instanceLock);
1772
1773
const auto registration = DistributionRegistration::Open(lxssKey.get(), *DistroGuid);
1816
try
1817
{
1818
std::lock_guard lock(m_instanceLock);
1810
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1819
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1820
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1821
const auto registration = DistributionRegistration::Open(lxssKey.get(), *DistroGuid);
1822
const auto configuration = s_GetDistributionConfiguration(registration);
1823
RETURN_HR_IF(WSL_E_WSL2_NEEDED, WI_IsFlagClear(configuration.Flags, LXSS_DISTRO_FLAGS_VM_MODE));
1848
1849
// Ensure VM exists and attach the VHD.
1850
_CreateVm();
1841
- const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1851
const auto lun = m_utilityVm->AttachDisk(vhdPath.c_str(), WslCoreVm::DiskType::VHD, {}, true, userToken.get());
1852
1853
// Resize the underlying filesystem.
1878
1879
DistributionRegistration registration;
1880
LXSS_DISTRO_CONFIGURATION configuration;
1872
- wil::unique_hkey lxssKey = s_OpenLxssUserKey();
1881
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
1882
+ wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
1883
try
1884
{
1885
// Ensure the distribution exists.
2342
HRESULT LxssUserSessionImpl::TerminateDistribution(_In_opt_ LPCGUID DistroGuid)
2343
try
2344
{
2335
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
2345
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
2346
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
2347
GUID defaultDistro;
2348
{
2349
std::lock_guard lock(m_instanceLock);
2383
2384
try
2385
{
2375
- wil::unique_hkey lxssKey = s_OpenLxssUserKey();
2386
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
2387
+ wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
2388
2389
// Set up a scope exit lambda to delete the distribution registry key
2390
// when the function exits.
2538
m_terminatedInstances.clear();
2539
}
2540
2529
- wil::unique_hkey lxssKey = s_OpenLxssUserKey();
2530
- DistributionRegistration registration;
2541
wil::unique_handle userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
2542
+ wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
2543
+ DistributionRegistration registration;
2544
2545
std::shared_ptr<LxssRunningInstance> instance;
2546
{
4046
try
4047
{
4048
// Impersonate the user and open their lxss registry key.
4037
- const wil::unique_hkey lxssKey = s_OpenLxssUserKey();
4049
+ const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
4050
+ const wil::unique_hkey lxssKey = s_OpenLxssUserKey(userToken.get());
4051
4052
// OOBE hasn't run if the value is not present or set to 0.
4053
if (wsl::windows::common::registry::ReadDword(lxssKey.get(), nullptr, LXSS_OOBE_COMPLETE_NAME, false) != false)
4064
return;
4065
}
4066
4054
- const auto userToken = wsl::windows::common::security::GetUserToken(TokenImpersonation);
4067
// This is needed to launch the OOBE process as the user.
4068
wil::unique_handle userTokenCreateProcess;
4069
THROW_IF_WIN32_BOOL_FALSE(::DuplicateTokenEx(
4168
}
4169
CATCH_LOG()
4170
4159
-wil::unique_hkey LxssUserSessionImpl::s_OpenLxssUserKey()
4171
+wil::unique_hkey LxssUserSessionImpl::s_OpenLxssUserKey(_In_ HANDLE UserToken)
4172
{
4161
- auto runAsUser = wil::CoImpersonateClient();
4173
+ auto runAsUser = wil::impersonate_token(UserToken);
4174
return wsl::windows::common::registry::OpenLxssUserKey();
4175
}
4176